问题描述
我在 kubernetes 上部署了一个 netcore webapi。每天晚上午夜,我需要调用一个端点来对每个 Pod 执行一些操作,因此我部署了一个使用 curl 调用 api 的 cronjob,该方法执行所需的操作。
apiVersion: batch/v1beta1
kind: CronJob
Metadata:
name: test-cronjob
spec:
schedule: "0 0 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: test-cronjob
image: curlimages/curl:7.74.0
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-ec"
- |
date;
echo "doingOperation"
curl POST "serviceName/DailyTask"
restartPolicy: OnFailurey
但这只会调用一个 pod,即我的入口分配的那个。 有没有办法调用服务中包含的每个 Pod?
解决方法
这是一种预期行为,因为当我们在 Kubernetes curl
对象上执行 Service
时,预计将请求仅传递给 endpoints
之一(Pod 的 IP) .为了实现您所需要的,您需要编写一个自定义脚本,该脚本首先获取与服务关联的端点,然后对它们一一迭代调用 curl。
注意:由于 Pod 重新创建,Pod 的 IP 可能会更改,因此您应该在每次运行 endpoints
时获取与服务关联的 cronjob
。
你可以在你的工作中运行 kubectl:
kubectl get pods -l mylabel=mylabelvalue \
-o go-template='{{range .items}}{{.status.podIP}}{{"\n"}}{{end}}'
这将返回特定标签的所有容器的内部 IP。 然后,您可以遍历地址并运行您的命令。
,自从在 API-Server 上启用具有权限的 Pod,例如要查看实际的服务端点,既麻烦又存在安全风险,我在这里推荐一个简单的脚本解决方案。
首先,为相关部署安装 headless service(clusterIP=None 的服务)。这将使您的内部 DNS 服务器创建多个 A 记录,每个记录都指向您的一个 Pod IP。
其次,为了从您的 Cron-Job 以循环方式 ping 每个 Pod,请使用以下行的小 shell 脚本(您需要从带有 dig的容器中运行它> 和 curl 安装在其上):
dig +noall +answer <name-of-headless-service>.<namespace>.svc.cluster.local | awk -F$'\t' '{curl="curl <your-protocol>://"$2":<your-port>/<your-endpoint>"; print curl}' | source /dev/stdin