← 中文资源

简体中文版本

Kubernetes Deployment 进度期限超时

通过检查滚动更新状态、就绪探针,以及阻塞进度的镜像拉取或调度失败,修复 ProgressDeadlineExceeded。

阅读英文原文

症状

错误“Kubernetes Deployment ProgressDeadlineExceeded”指向一个明确的失效模式。下面依次给出症状、定位该原因的检查命令、根本原因、修复方案,以及证明修复有效的验证步骤。

可观察到的症状包括:

  • kubectl rollout status 报告 “exceeded its progress deadline”
  • Deployment 显示 0 个或部分可用副本
  • 新 Pod 持续 Pending 或始终不 Ready

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

kubectl describe deploy <name> | grep -A 3 "Progressing\|Conditions" && kubectl get rs -l app=<name>

条件消息会指出阻塞步骤——调度、拉取或就绪。

步骤 2

kubectl get pods -l app=<name> -o wide && kubectl describe pod <new-pod> | tail -20

Pending、ImagePullBackOff 或 CrashLooping 会揭示待修的具体阻塞点。

常见诱因(按出现频率排序):

  • 新 Pod 无法调度、拉取镜像或通过就绪探针
  • 滚动更新确实较慢,默认 600s 期限过短
  • 上一次滚动更新留下卡住的 replicaset,阻塞新的更新

根因

当最新 ReplicaSet 未在 progressDeadlineSeconds 内推进(新 Pod 可用)时,Deployment 报 ProgressDeadlineExceeded。该条件指向下游的阻塞性失败,而非 Deployment 本身。

修复

修复底层阻塞(镜像、调度、探针或资源限制),对确实缓慢的滚动更新提高 progressDeadlineSeconds,并确保新 Pod 在期限内通过就绪。

注意:提高期限会掩盖真正的阻塞;应先修复阻塞,仅在滚动更新确实慢时才调整。

spec:
  progressDeadlineSeconds: 900   # only after confirming the rollout is legitimately slow
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  template:
    spec:
      containers:
        - name: app
          readinessProbe:
            httpGet: { path: /health, port: 8080 }
            initialDelaySeconds: 5
            periodSeconds: 5

验证

重跑滚动更新并确认完成且全部副本可用;验证 rollout status 在期限内报告成功。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。