Kubernetes集群如何实现仅1个Pod运行在master节点其余调度至worker节点
Kubernetes 调度规则修复方案
原配置核心问题
你当前的配置存在三处错误导致规则未生效:
- 重复声明了
affinity字段,后定义的Pod反亲和规则直接覆盖了前面的节点亲和规则,节点亲和逻辑完全不生效 - 节点亲和的结构错误:
preferredDuringSchedulingIgnoredDuringExecution下的匹配规则应使用preference字段,你写的nodeSelectorTerms是强制节点亲和的子字段,规则本身语法错误无法生效 - Pod反亲和的
labelSelector匹配规则错误,误匹配了节点的hostname标签,实际应该匹配同组Pod的业务标签,导致反亲和逻辑完全未触发,才会出现Pod均匀分布的情况
正确配置示例
首先给你的Pod统一配置业务标签(如下示例的app: my-custom-app),作为反亲和的匹配依据,完整配置如下:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app-deployment spec: replicas: 4 selector: matchLabels: app: my-custom-app template: metadata: labels: app: my-custom-app # 同组Pod统一业务标签,必须和反亲和匹配规则对应 spec: affinity: # 优先调度到master节点,保证第一个Pod优先落到master nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: kubernetes.io/hostname operator: In values: - master-node # 替换为你实际的master节点hostname # 强制反亲和:节点上只要存在1个同标签的Pod,就不能再调度同组Pod到该节点 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - my-custom-app # 和上面的Pod业务标签完全一致 topologyKey: kubernetes.io/hostname # 可选配置:如果你的master节点默认打了master角色污点,需要加容忍才能调度到master tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule containers: - name: my-app image: nginx:alpine # 替换为你实际的业务镜像
实现逻辑
- 第一个Pod调度时,高权重的节点亲和规则生效,优先调度到master节点
- 第二个及之后的Pod调度时,检测到master节点上已经存在1个同标签的Pod,触发强制反亲和规则,禁止调度到master节点,只能调度到worker节点
- 即使master节点上的Pod异常退出重建,重建的Pod依然会优先落回master节点,不会占用worker的调度名额,保证master始终最多运行1个同组Pod
注意事项
- 可执行
kubectl get nodes --show-labels | grep master确认master节点的hostname和标签,保证配置中的匹配值和实际一致 - 如果你后续新增了多个worker节点,需要同组Pod在worker节点均匀分布的话,可以额外补充
topologySpreadConstraints配置,单worker节点场景不需要额外调整
内容的提问来源于stack exchange,提问作者pspiers
相关产品推荐
相关产品推荐

