AKS使用Kured升级节点时出现Failed to drain the node缩容失败错误
问题根因归类
1. 节点驱逐流程被阻断(直接对应报错failed to drain the node)
- 存在Pod中断预算(PDB)限制:部分有状态应用(如数据库、消息队列)的PDB设置过于严格,允许的中断数为0,导致集群无法驱逐该节点上的对应Pod,drain流程直接终止。
- 节点上存在绑定本地存储的Pod:使用
emptyDir、本地持久卷(Local PV)的Pod默认会阻止节点驱逐,除非drain操作主动添加--force参数,集群自动扩缩容默认不会添加该强制参数。 - DaemonSet Pod未配置缩容容忍规则:AKS集群自动扩缩容默认不会驱逐DaemonSet管理的Pod,若该临时节点上运行了未添加
cluster-autoscaler.kubernetes.io/enable-ds-eviction: "true"注解的DaemonSet Pod,会直接导致drain失败。 - kube-system命名空间下存在未受保护的关键Pod:未配置PDB的系统级自定义Pod会被集群自动扩缩容判定为不可驱逐,阻止drain流程。
2. Kured与AKS集群组件流程冲突
- 原节点重启后未成功回归集群:原节点安装内核补丁后重启,出现kubelet启动失败、内核panic、网络配置异常等问题,无法重新注册到AKS集群,导致集群始终无法将原节点恢复为就绪状态,自动扩缩容判定临时节点仍需保留,且无法将其驱逐缩容,最终原节点被集群判定为不健康剔除,仅留下运行旧内核版本的临时节点。
- Kured与集群自动扩缩容时序冲突:Kured触发节点重启的时机与AKS默认节点升级、自动扩缩容的调度逻辑重叠,导致临时节点创建后,原节点的uncordon操作未被正常执行,缩容流程提前触发出现异常。
3. 集群自动扩缩容配置异常
- 临时节点被添加了缩容禁止注解:若节点被手动/自动添加了
cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"注解,会直接阻止缩容流程。 - 缩容drain超时设置过短:集群自动扩缩容默认的drain超时时间不足以完成所有Pod的优雅终止,触发超时报错后直接终止缩容流程。
快速排查命令
# 查看问题节点上运行的所有Pod,定位不可驱逐的工作负载 kubectl get pods -A -o wide --field-selector spec.nodeName=<替换为问题节点名称> # 检查所有命名空间下的PDB配置,确认是否存在允许中断数为0的规则 kubectl get pdb -A # 查看集群自动扩缩容日志,获取drain失败的具体报错细节 kubectl logs -n kube-system deployment/cluster-autoscaler | grep <替换为问题节点名称>
内容的提问来源于stack exchange,提问作者themochishifter
相关产品推荐
相关产品推荐

