如何实现Pod在Kubernetes集群各节点上的均匀调度
Kubernetes Pod跨节点均匀调度配置方案
方法1:使用Pod拓扑分布约束(推荐,K8s v1.19+支持)
这是官方原生提供的专门用于控制Pod跨拓扑域(此处为节点)分布的方案,配置后可以严格控制不同节点的Pod数量差:
- 在工作负载(Deployment/StatefulSet等)的
spec.template.spec下添加topologySpreadConstraints字段,配置示例如下:
topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: your-workload-label # 替换为实际的Pod标签
- 参数说明:
maxSkew: 1:不同节点上的Pod副本数量最大差值为1,9副本3节点的场景下可以完美实现每个节点3个PodtopologyKey: kubernetes.io/hostname:指定拓扑域为节点主机名,即按节点维度做分布控制whenUnsatisfiable: DoNotSchedule:如果无法满足均匀分布要求就不调度Pod;如果允许调度后有轻微不均匀可以改为ScheduleAnyway,调度器会尽量满足分布要求labelSelector:匹配当前工作负载的Pod标签,调度器只会统计匹配该标签的Pod做分布计算
方法2:使用Pod软反亲和性(兼容旧版本K8s)
如果你的集群版本低于v1.19,可以用Pod反亲和性实现尽量均匀的调度:
- 在工作负载的
spec.template.spec.affinity下添加如下配置:
affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: topologyKey: kubernetes.io/hostname labelSelector: matchLabels: app: your-workload-label # 替换为实际的Pod标签
- 该配置会让调度器优先把Pod调度到没有运行同标签Pod的节点,如果所有节点都已经有同标签Pod,就优先调度到同标签Pod数量最少的节点,3节点9副本场景下基本可以实现每个节点3个Pod的分布,注意:该方案是软策略,极端场景下可能出现轻微不均匀
注意事项
- 配置生效前提是所有节点的可用资源足够容纳对应数量的Pod,如果某个节点资源不足,调度器会自动把Pod调度到其他有剩余资源的节点,无法保证均匀分布
- 如果是对已经运行的工作负载修改配置,需要执行滚动重启才会触发重新调度,旧Pod会按新的调度规则重新分配
- 集群默认调度器已经默认开启
EvenPodsSpread插件,如果你使用自定义调度器需要确认该插件已启用,拓扑分布约束才会生效
内容的提问来源于stack exchange,提问作者Manjunath reddy
相关产品推荐
相关产品推荐

