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 的任务在连续失败时不会快速重试,短周期的定时任务要评估这一延迟。