是否可以安排 CronJob 在每个 Kubernetes 节点上执行?

Is this possible to schedule CronJob to execute on each of Kubernetes nodes?

我想做的是定期在每个 Kubernetes 节点上 运行 一些备份脚本。我希望它在 Kubernetes 集群中 运行 ,而不是只向每个节点的 crontab 添加脚本。这是因为我会将备份存储在 Kubernetes 挂载到节点的卷上。它与配置不同,但它可能是由 Flex 插件挂载的 CIFS 文件系统或 awsElasticBlockStore.

如果CronJob能够模板化DaemonSet(而不是将其固定为jobTemplate)并且可以设置DaemonSet重启就完美了OnFailure.

政策

我想避免为每个 n 节点定义 n 不同的 CronJobs,然后通过定义 nodeSelectors 将它们关联在一起,因为这不太方便在节点数动态变化的环境中维护。

这里讨论了我能看到的问题,没有任何明确的结论:https://github.com/kubernetes/kubernetes/issues/36601

也许您有实现此目的的任何黑客或技巧?

您可以通过以下 bash 脚本使用 DaemonSet:

  while :; do
   currenttime=$(date +%H:%M)
   if [[ "$currenttime" > "23:00" ]] && [[ "$currenttime" < "23:05" ]]; then
     do_something
   else
     sleep 60
   fi
   test "$?" -gt 0 && notify_failed_job
  done

这仍然是使用 DaemonSet 模板模仿 CronJob 的最佳方式吗? IE。 运行 所有节点上的 crontab(基于节点选择器)

我不反对,但我需要一直 运行 这些 pods 太可惜了。如果让 k8s 调度程序为我处理所有这些,那就太好了。

我知道我迟到了,

第一个选项:

使用并行到运行多个作业PODs,使用topologySpreadConstraints到spread/schedule所有节点上的PODs。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: mycronjob
  labels:
    jobgroup: parallel
spec:
  schedule: "*/5 * * * *"
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 0
  jobTemplate:
    spec:
      template:
        metadata:
          name: kubejob
          labels:
            jobgroup: parallel
        spec:
          topologySpreadConstraints:
            - maxSkew: 2
              topologyKey: kubernetes.io/hostname
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  jobgroup: parallel
          containers:
          - name: mycron-container
            image: alpine
            imagePullPolicy: IfNotPresent
            command: ['sh', '-c', 'echo Job Pod is Running ; sleep 10']
          restartPolicy: OnFailure
          terminationGracePeriodSeconds: 0
      parallelism: 5
  concurrencyPolicy: Allow

选项二:

使用cronjob你可以应用daemon set的YAML模板并在之后删除它一定的持续时间,这将在所有节点上理想地作为工作。此外,如果自定义 docker 图像 运行 在守护进程中设置,它也可以在执行完成后完成。

额外:

我建议您也查看此 CRD:https://github.com/AmitKumarDas/metac/tree/master/examples/daemonjob

阅读更多关于 CRD 的信息:https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/

您可以编写自己的自定义资源并将其添加到 kuberetes 中。