Kubernetes cronjob 调用服务中的所有 pod

问题描述

我在 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