K8s Pod Anti Affinity for Cronjob Pod Even Scheduling
K8s Pod Anti Affinity for Cronjob Pod Even Scheduling
在 500 namespaces
的多租户场景中,每个都有相同的 Cronjob
,标记为 app=some-job
和 20 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
作业的存在来访问它们并不是一个好主意。
在 500 namespaces
的多租户场景中,每个都有相同的 Cronjob
,标记为 app=some-job
和 20 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
作业的存在来访问它们并不是一个好主意。