Kubernetes节点亲和性权重异常:fsn1节点未优先调度问询
问题分析
你当前使用的preferredDuringSchedulingIgnoredDuringExecution属于调度偏好而非强制约束,调度器会优先选择fsn1节点,但如果fsn1节点资源耗尽(或调度器基于负载均衡策略选择其他节点),仍会将Pod调度到hel1,这就是出现5个Pod跑到hel1的原因。
针对你“仅当fsn1所有节点故障时才调度到hel1”的需求,无需自定义调度器的解决方案如下:
方案一:强制约束+自动化兜底(严格匹配需求)
该方案实现仅当所有fsn1节点不可用时才允许调度到hel1,即使fsn1资源不足,Pod也会处于Pending状态,不会跑到hel1。
- 给
hel1节点添加污点,阻止Pod默认调度到这些节点:kubectl taint nodes -l region=hel1 region=hel1:NoSchedule - 配置Pod的亲和性为强制要求
fsn1节点:affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "region" operator: "In" values: - "fsn1" - 自动化兜底逻辑:当所有
fsn1节点故障时,自动移除hel1节点的污点;当fsn1节点恢复时,重新添加污点。可通过Prometheus+Alertmanager结合kubectl脚本实现:- 监控
kube_node_status_condition指标,当所有region=fsn1节点的Ready状态为false时,触发告警并执行移除污点的命令; - 当有
fsn1节点恢复Ready状态时,触发告警并执行添加污点的命令。
- 监控
方案二:优化亲和性配置(优先用尽fsn1资源再用hel1)
如果你的实际需求是优先耗尽fsn1节点资源,再调度到hel1(而非必须等fsn1节点故障),可调整亲和性配置,确保fsn1的优先级绝对高于hel1:
affinity: nodeAffinity: # 强制Pod只能调度到fsn1或hel1节点 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "region" operator: "In" values: - "fsn1" - matchExpressions: - key: "region" operator: "In" values: - "hel1" # 给fsn1节点设置极高权重,确保调度器优先选择fsn1 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1000 preference: matchExpressions: - key: "region" operator: "In" values: - "fsn1"
这种配置下,调度器会优先将Pod调度到fsn1节点,只有当所有fsn1节点资源完全耗尽时,才会选择hel1节点。
内容的提问来源于stack exchange,提问作者Siraxis
相关产品推荐
相关产品推荐

