K8s同时配置Node Affinity与Pod Affinity的调度异常问题咨询
问题原因分析
你之前认为的node affinity优先级更高导致pod affinity被忽略的判断不成立:Kubernetes调度器的所有requiredDuringSchedulingIgnoredDuringExecution类规则都是必须同时满足的硬约束,不存在某类规则优先级更高的逻辑。
当前调度结果完全符合你现有配置的规则,问题根源是podAffinity的topologyKey配置不符合预期:
- 你配置的
topologyKey: schedule-on表示,只要目标节点的schedule-on标签值和已有同标签Pod所在节点的schedule-on值一致,就满足亲和性要求 - Node1和Node2的
schedule-on值都是gpu,属于同一个拓扑域,因此两个Pod分别调度到Node1和Node2完全符合你写的podAffinity规则
调整方案
要实现两个副本调度到同一个GPU节点的需求,仅需修改podAffinity的topologyKey为节点唯一标识标签kubernetes.io/hostname即可,修改后的affinity配置如下:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: schedule-on operator: In values: - gpu podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app.kubernetes.io/name operator: In values: - test topologyKey: kubernetes.io/hostname
调整后运行逻辑
topologyKey: kubernetes.io/hostname的拓扑域粒度为单个节点,每个节点的kubernetes.io/hostname值唯一- 第一个副本调度时,集群中无匹配标签的同应用Pod,podAffinity规则默认满足,会被调度到任意符合nodeAffinity要求的GPU节点
- 第二个副本调度时,必须同时满足两个硬约束:节点属于GPU节点、和已有同应用Pod在同一个
kubernetes.io/hostname拓扑域(即同一个节点),因此两个副本必然会被调度到同一个GPU节点 - 注意:需保证单个GPU节点的可用资源足够承载2个Pod副本,否则第二个副本会调度失败进入Pending状态
内容的提问来源于stack exchange,提问作者RITESH SANJAY MAHAJAN
相关产品推荐
相关产品推荐

