首页/云/Kubernetes 速查/restartPolicy 重启策略

restartPolicy 重启策略

定义容器退出后 kubelet 是否重启:Always(默认)、OnFailure、Never;对 Job/CronJob 与一次性任务影响显著。

Kubernetes 速查云更新于 2026-10-13

restartPolicy 是什么

restartPolicy 定义 Pod 内容器退出后 kubelet 是否重启:Always 表示无论退出码如何都重启,OnFailure 只在非 0 退出时重启,Never 则一次都不重启。它作用在 Pod 级别、对内部所有容器统一生效,且取值受上层控制器约束——Deployment 要求 Always,Job 的模板只允许 Never 或 OnFailure。它决定「任务型负载会不会自动重试」,是批处理场景的关键配置。

取值与语义

取值重启时机典型用途
Always容器退出即重启,不论退出码长期运行的服务型 Pod,也是默认值
OnFailure仅当退出码非 0 时重启Job:失败自动重试,成功即结束
Never从不重启一次性校验、调试或需要保留失败现场的任务

典型使用场景

  • 常驻服务:用 Always 保证进程意外退出后由 kubelet 拉起,配合探针实现健康兜底
  • 批处理任务:用 OnFailure 让失败任务自动重试,成功即停止,无需人工干预
  • 数据校验与迁移:用 Never 保留失败容器现场,便于立刻取日志与文件
  • 调试排障:临时用 Never 避免重启掩盖问题,观察首次失败的真实状态
  • 配合 backoffLimit:Job 上层控制重试总次数,restartPolicy 决定是在容器内重试还是重建 Pod

配置与查看

配置与查看
spec:
  restartPolicy: OnFailure      # Job 模板中只允许 Never 或 OnFailure
  backoffLimit: 4               # 与 Job 配合限制重试总次数
  template:
    spec:
      containers:
        - name: migrate
          image: registry.example.com/migrate:1.26.0

命令行核对

命令行核对
kubectl get pod web-x -o jsonpath='{.spec.restartPolicy}'                    # 当前 Pod 的策略
kubectl get pod job-x -o jsonpath='{.status.containerStatuses[0].restartCount}'  # 重试了多少次
kubectl get job migrate -o jsonpath='{.spec.backoffLimit} {.status.failed}'     # Job 层重试上限与失败数
kubectl get pod job-x -o jsonpath='{.status.containerStatuses[0].lastState}'    # 上次退出的原因与退出码

与上层控制器的关系

上层对象允许的 restartPolicy不接受时的表现
Deployment / StatefulSet / DaemonSet只能 Always清单校验直接拒绝,创建失败
Job只能是 Never 或 OnFailure写 Always 会被校验拒绝
CronJob沿用其 Job 模板的约束同上
裸 Pod三种都可选由使用者自行承担生命周期管理
restartPolicy 决定的是容器是否重启,不决定 Pod 是否重建。对 Job 来说,OnFailure 可能在同一个 Pod 内反复重启容器,也可能重建 Pod,具体取决于失败路径;判断「重试了几次」要同时看容器重启计数与 Job 的失败计数。
重启间隔由 kubelet 的指数退避控制,初始约 10 秒并逐次倍增,最长约 5 分钟。因此配置了 OnFailure 的任务在连续失败时不会快速重试,短周期的定时任务要评估这一延迟。

易错点

  • 在 Job 里写 restartPolicy: Always:清单会被直接拒绝,报错指向字段校验,容易误以为是权限问题
  • 用 Never 跑需要自愈的常驻服务:容器退出后不会自动拉起,业务静默中断且无人察觉
  • 把 restartPolicy 当成重试次数上限:它只决定是否重启,真正的次数上限在 Job 的 backoffLimit 或容器内应用逻辑
  • 依赖快速重试的批任务配了 OnFailure:退避最长约 5 分钟,任务窗口被等待时间吃掉

数据来源与参考

  • Kubernetes 官方文档 · Pod Lifecycle(Restart policy)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌