Kubernetes 1.12版本中scheduler.alpha.kubernetes.io/preferAvoidPods注解配置及使用问题咨询
解决Kubernetes 1.12中NodePreferAvoidPods插件注解配置问题
你遇到的核心问题是scheduler.alpha.kubernetes.io/preferAvoidPods注解不支持简单的布尔值或数字,它需要一个符合Kubernetes API规范的结构化JSON字符串。在1.12版本中,这个注解的值必须对应PreferAvoidPods结构体的定义,下面是具体的解决方案:
一、NodePreferAvoidPods注解的正确配置格式
该注解的有效值是一个JSON对象,包含preferAvoidPods数组,数组中的每个元素是WeightedPodAffinityTerm类型,用来定义触发分数扣除的规则。
1. 通用配置(尽量避免调度任何Pod到目标节点)
如果你的需求是只要节点上已有Pod,就尽量避免新Pod调度过来,可以使用以下命令为节点添加注解:
kubectl annotate node <你的节点名称> scheduler.alpha.kubernetes.io/preferAvoidPods='{"preferAvoidPods": [{"podAffinityTerm": {"labelSelector": {"matchExpressions": [{"key": "kubernetes.io/metadata.name", "operator": "Exists"}]}, "topologyKey": "kubernetes.io/hostname"}, "weight": 100}]}'
这个配置的含义:
matchExpressions匹配所有带有kubernetes.io/metadata.name标签的Pod(所有K8s Pod默认都会带上这个标签)- 只要节点上存在这样的Pod,调度器就会给该节点扣除100分(对应你在调度器配置中设置的插件权重)
- 分数扣除后,调度器会优先选择分数更高的其他节点
2. 针对特定Pod的配置
如果只需要避免调度特定类型的Pod(比如标签为app: nginx的Pod),可以修改labelSelector:
kubectl annotate node <你的节点名称> scheduler.alpha.kubernetes.io/preferAvoidPods='{"preferAvoidPods": [{"podAffinityTerm": {"labelSelector": {"matchLabels": {"app": "nginx"}}, "topologyKey": "kubernetes.io/hostname"}, "weight": 100}]}'
二、验证配置生效
- 删除现有测试用的Nginx Deployment:
kubectl delete deployment nginx-deployment
- 重新创建Deployment:
kubectl apply -f nginx-deployment.yaml
- 查看Pod调度结果:
kubectl get pods -o wide
此时应该能看到Pod优先被调度到未添加注解的节点(如果目标节点上已有Pod的话)。
三、更适合你需求的替代方案
如果你希望无论节点是否有Pod,都尽量避免调度到该节点,那么使用Taint的PreferNoSchedule效果更直接,而且不需要修改调度器配置:
kubectl taint nodes <你的节点名称> scheduling.prefer-avoid:PreferNoSchedule
这个taint不会完全阻止Pod调度到该节点,只是让调度器优先选择其他节点,完全符合你“尽量避免”的需求,配置也更简单。
内容的提问来源于stack exchange,提问作者APLU
相关产品推荐
相关产品推荐

