事情本身不复杂,线索都在日志里。K8s 1.24 上更新镜像版本,kubectl rollout status 卡在 waiting for deployment,二十多分钟没结束,旧 Pod 全在跑,新 Pod 一直 Running 但 READY 是 0/1。

第一反应是「maxUnavailable 设成 0 且新 Pod 起不来,滚动就完全停住」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。readinessProbe 的路径写错,探针一直返回 404。还有一种是新版本启动比探针的 initialDelaySeconds 慢,超时后被判定失败。

少数情况下是节点资源不足,新 Pod 调度过去后一直拉不起容器。

第一件事是看 rollout 卡在哪一步

kubectl rollout status deploy/app --timeout=60s

再往下查新 Pod 的就绪探针失败原因

kubectl describe pod -l app=app | grep -A5 Readiness

临时回滚确认旧版本可用

kubectl rollout undo deploy/app && kubectl rollout status deploy/app

修正探针参数后再更新一次

kubectl set image deploy/app app=registry.lu0.cn/app:1.4.2

改完先别撤,确认这几项。kubectl get pod 里新副本 READY 变成 1/1,rollout status 返回 successfully rolled out,旧副本按预期缩到零。

这里还有个坑。探针的超时和阈值要给足启动时间,别照抄别人的 1 秒;滚动更新期间保留一部分旧副本,出问题才有回滚窗口。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189