Pod rollout仅在执行Cordon后成功,kubectl rollout status流水线失败求助
检查节点调度约束
确认Deployment是否配置了nodeSelector、affinity.nodeAffinity或podAffinity,导致新Pod强制或优先调度到原节点。同时查看原节点的污点(Taints)和Pod的容忍度(Tolerations)配置,是否存在只有原节点能调度该Pod的情况。
执行命令排查:kubectl describe deployment <deploy-name> | grep -A 20 "Affinity\|NodeSelector\|Tolerations" kubectl describe node <old-node-name> | grep -A 10 "Taints"排查原节点资源瓶颈
原节点可能存在CPU、内存或存储资源不足的情况,导致新Pod调度后无法启动,卡住rollout流程。cordon原节点后,Pod只能调度到资源充足的新节点,因此更新成功。
执行命令排查:kubectl top node <old-node-name> kubectl describe pod <stuck-pod-name> | grep -A 10 "Events"重点关注事件中的
Insufficient CPU、Insufficient Memory类报错。验证Pod就绪探针配置
原节点上的Pod可能因网络限制、应用依赖缺失等问题,导致就绪探针(Readiness Probe)持续失败。Deployment默认需要旧Pod就绪或满足滚动更新策略条件才会继续推进更新,探针失败会卡住流程。cordon后新Pod在正常节点启动,探针正常通过,rollout完成。
执行命令排查:kubectl logs <old-node-pod-name> kubectl describe pod <old-node-pod-name> | grep -A 15 "Readiness"检查滚动更新策略配置
查看Deployment的rollingUpdate参数(maxSurge和maxUnavailable)是否过于保守,比如设置maxUnavailable=0时,若原节点的旧Pod无法正常终止或新Pod无法启动,会导致更新卡住。cordon原节点后,旧Pod被驱逐,新Pod在其他节点启动,满足更新条件。
执行命令查看配置:kubectl get deployment <deploy-name> -o yaml | grep -A 10 "strategy"排查节点运行时与网络问题
原节点的容器运行时(docker/containerd)可能存在镜像拉取失败、容器启动异常,或网络插件(如Calico、Flannel)存在网络连通性问题,导致Pod无法正常运行。cordon后Pod调度到正常节点即可恢复。
查看节点级日志排查:# 查看kubelet日志(以systemd为例) journalctl -u kubelet -f # 查看containerd日志 journalctl -u containerd -f检查持久化存储绑定问题
如果Pod使用了本地存储类型的PV,原节点的存储挂载可能存在异常,导致新Pod调度到原节点后无法挂载存储启动。cordon后Pod调度到其他配置正常的存储节点,即可完成部署。
执行命令排查:kubectl describe pod <stuck-pod-name> | grep -A 10 "Volumes" kubectl describe pv <pv-name>
内容的提问来源于stack exchange,提问作者Cole

