Pod调度亲和性机制概述
Kubernetes Pod调度亲和性是控制Pod与节点、Pod与Pod之间位置关系的核心机制。在大规模集群中,合理配置亲和性规则能够有效提升服务可用性、降低跨可用区流量成本、保障性能敏感型工作负载的资源独占。Kubernetes调度器在Filter阶段根据亲和性规则筛选候选节点,在Score阶段对满足亲和性的节点加权打分,最终选择最优节点绑定。
亲和性规则分为节点亲和性(Node Affinity)和Pod间亲和性(Pod Affinity/Anti-Affinity)两大类。节点亲和性约束Pod运行在具备特定标签的节点上,Pod间亲和性约束Pod与指定标签的其他Pod运行在同一拓扑域或不同拓扑域。
节点亲和性requiredDuringScheduling与preferredDuringScheduling
节点亲和性提供硬性要求和软性偏好两种模式:
apiVersion: v1kind: Podmetadata: name: gpu-workloadspec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node.kubernetes.io/instance-type operator: In values: ["p4d.24xlarge"] preferredDuringSchedulingIgnoredDuringExecution: - weight: 80 preference: matchExpressions: - key: topology.kubernetes.io/zone operator: In values: ["us-east-1a"]
requiredDuringSchedulingIgnoredDuringExecution是硬性约束,不满足条件的节点直接淘汰。preferredDuringSchedulingIgnoredDuringExecution是软性偏好,weight取值1~100,调度器在打分阶段对满足偏好的节点增加对应权重分。上面示例表示Pod必须调度到p4d实例类型节点,优先选择us-east-1a可用区。
operator支持In、NotIn、Exists、DoesNotExist、Gt、Lt六种操作符,覆盖绝大多数标签匹配场景。
Pod间亲和与反亲和的拓扑域配置
Pod间亲和性通过topologyKey指定拓扑域维度。同一拓扑域内的节点共享相同标签值。典型用法:
affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: ["api-server"] topologyKey: topology.kubernetes.io/zone
这段配置确保同一个Deployment的api-server Pod尽量分散到不同可用区。topologyKey设为zone表示以可用区为拓扑域,同区内的节点被视为同一拓扑域。若改为kubernetes.io/hostname,则表示以单节点为拓扑域,强制每个Pod独占一个节点。
生产环境推荐:有状态服务(如数据库主从)使用Pod反亲和+zone拓扑域,确保主从分布在不同可用区;无状态服务使用Pod反亲和+hostname拓扑域,避免同一节点堆积过多副本。
Topology Spread Constraints拓扑分布约束
拓扑分布约束比Pod反亲和更精细地控制Pod在拓扑域上的均匀分布:
apiVersion: v1kind: Podmetadata: name: web-appspec: topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: web - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: app: web
maxSkew定义最大偏差,即拓扑域间Pod数量的最大差值。maxSkew=1意味着任意两个可用区的web Pod数量差异不超过1。whenUnsatisfiable=DoNotSchedule是硬性约束,偏差超过maxSkew时拒绝调度;ScheduleAnyway是软性约束,偏差较大时降低打分但不拒绝。
拓扑分布约束相比Pod反亲和的优势:反亲和只能在”同一拓扑域有Pod则避开”和”不同拓扑域有Pod则靠近”之间选择,无法精确控制分布均匀度;拓扑分布约束通过maxSkew精确量化偏差容忍度,适合大规模集群中需要均匀分布的场景。
亲和性规则与拓扑约束的优先级关系
调度器处理顺序:节点硬性亲和性筛选 -> Pod硬性反亲和性筛选 -> 拓扑分布硬约束筛选 -> 节点软性亲和性打分 -> Pod软性反亲和性打分 -> 拓扑分布软约束打分。硬性规则之间是AND关系,必须同时满足。软性规则的weight值越大优先级越高。
常见陷阱:硬性节点亲和与硬性Pod反亲和组合导致无节点可调度,Pod一直Pending。调试时用kubectl describe pod查看调度失败原因,逐条排查约束是否过严。建议生产环境优先使用preferredDuringScheduling软约束,保留调度灵活性。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetespod-diao-du-qin-he-xing-gui-ze-yu-tuo-pu-fen-bu/