Kubernetes cronjob调用服务中的所有pod

Kubernetes cronjob调用服务中的所有pod,kubernetes,kubernetes-cronjob,Kubernetes,Kubernetes Cronjob,我在kubernetes上部署了netcore webapi。每晚午夜,我需要调用一个端点来对每个pod执行一些操作,因此我部署了一个cronjob,用curl调用api,该方法执行所需的操作 apiVersion: batch/v1beta1 kind: CronJob metadata: name: test-cronjob spec: schedule: "0 0 * * *" jobTemplate: spec: template:

我在kubernetes上部署了netcore webapi。每晚午夜,我需要调用一个端点来对每个pod执行一些操作,因此我部署了一个cronjob,用curl调用api,该方法执行所需的操作

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。
有一种方法可以调用服务中包含的每个pod吗?

这是一种预期行为,就像我们对Kubernetes
服务
对象执行
curl
操作时,它预期只将请求传递给
端点中的一个(pod的IP)。要实现所需的功能,您需要编写一个自定义脚本,首先获取与服务关联的端点,然后逐个迭代地调用curl


注意:pods IP可能会因pod的重新创建而更改,因此您应该在每次运行
cronjob

时获取与服务相关的
端点。您可以在作业内运行kubectl:

kubectl get pods-l mylabel=mylabelvalue\
-o go模板=“{range.items}{{.status.podIP}}{{{{\n}}{{end}”
这将返回特定标签上所有容器的内部IP。
然后,您可以在地址上循环并运行命令。

由于在API服务器上启用具有权限的POD(例如查看实际的服务端点)很麻烦,并且会带来安全风险,因此我建议在此处使用简单的脚本解决方案

首先,为有问题的部署安装一个服务(clusterIP=None的服务)。这将使您的内部DNS服务器创建几个A记录,每个记录都指向您的一个Pod IP

其次,为了从Cron作业中以循环方式ping每个Pod,请使用一个小shell脚本,如下所示(您需要从安装了dig和curl的容器中运行此脚本):

dig+noall+answer..svc.cluster.local | awk-F$'\t'{curl=“curl:/”$2:/“print curl}'| source/dev/stdin
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