K8s Pod Anti Affinity for Cronjob Pod Even Scheduling

K8s Pod Anti Affinity for Cronjob Pod Even Scheduling

500 namespaces 的多租户场景中,每个都有相同的 Cronjob,标记为 app=some-job20 worker nodes,是否可以强制 k8s 调度程序将 500 个 Cronjob Pods 均匀分布在 20 个节点上,这样任何节点在给定时间只能完成 ~25 个 and/or 运行 Pods?

我注意到 500 个 Cronjob Pods 往往只安排在 20 个节点中的大约 7 个节点上,并且 KubeletTooManyPods 警报触发,即使大多数 pods 处于已完成状态。

我在想一个解决方案是在标签 app=some-job 上应用 Pod 反亲和性,使用 topologyKey=kubernetes.io/hostname,但不确定这是否符合 Completed Pods,如果它会在所有 20 个节点上至少有 1 个 Pod 后均匀分布,此时每个节点都会失败反亲和性情况,但我希望 preferredDuringSchedulingIgnoreDuringExecution 允许调度继续分布均匀。

有没有更好的方法来实现这种传播,也许是自定义调度程序?

编辑:想提一下我们正在使用 EKS 1.17 编辑 2:错别字

Complete 个作业的存在不会影响调度逻辑,因此我怀疑 podTopologySpreadConstraints 是否有帮助。你最好使用历史限制 (kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/…)

您的评论之一表明您需要日志:将 pod 的日志作为作业的一部分上传,即在 cronjob 的脚本 运行 末尾,推送到 s3 或 fluentbit 或任何地方.然后您可以保证在 cronjob 完成后,日志是安全的。作业日志可能会因各种原因而消失(它们可能会被清除,pods 可能会被驱逐或删除等),因此依赖 Completed 作业的存在来访问它们并不是一个好主意。