Pod 的重启策略 (RestartPolicy) 有哪些?
在 Kubernetes 中,Pod 的 restartPolicy(重启策略)决定了当 Pod 中的容器退出(终止)时,Kubelet 应该如何处理。
该策略定义在 Pod 的 spec 中(spec.restartPolicy),适用于 Pod 内的所有容器。
共有以下 3 种 策略:
1. Always (默认策略)
- 行为:无论容器是因为正常退出(退出码为 0)还是非正常退出(退出码非 0),Kubelet 都会自动重启该容器。
- 适用场景:
- 长期运行的服务:如 Web 服务器(Nginx)、数据库(MySQL)、API 服务等。这些服务设计为一直运行,如果停止了,通常意味着出错了,需要恢复。
- 注意:这是 Deployment、StatefulSet 和 DaemonSet 的默认且通常唯一的选择。
2. OnFailure
- 行为:只有当容器异常退出(退出码非 0)时,Kubelet 才会重启该容器。如果容器正常结束(退出码为 0),则不会重启。
- 适用场景:
- 一次性任务或批处理任务:任务执行完应该停止,但如果执行过程中崩溃了,需要重试。
- 常见搭配:通常与
Job控制器一起使用。
3. Never
- 行为:无论容器是正常退出还是异常退出,Kubelet 都不会重启该容器。
- 适用场景:
- 一次性任务:如果你希望任务失败后不要在当前 Pod 原地重试,而是希望控制器(如 Job)创建一个全新的 Pod 来重试,或者你希望保留失败现场(日志、文件系统状态)以便调试。
- 调试:运行一个脚本查看结果,不希望它自动重来。
策略对比总结
| 策略 (RestartPolicy) | 容器正常退出 (Exit Code 0) | 容器异常退出 (Exit Code != 0) | 典型应用场景 |
|---|---|---|---|
| Always (默认) | 重启 | 重启 | Web 服务、数据库 (Deployment) |
| OnFailure | 不重启 (状态变为 Completed) | 重启 | 批处理任务 (Job) |
| Never | 不重启 (状态变为 Completed) | 不重启 (状态变为 Error) | 一次性任务、调试 (Job/Pod) |
两个重要的补充机制
指数退避延迟 (Exponential Back-off):
Kubernetes 不会无脑地疯狂重启容器。如果容器反复崩溃,Kubelet 会通过指数级延迟来重启它(例如:10s, 20s, 40s, 80s ... 最长 5 分钟)。这可以防止节点资源被死循环的重启耗尽。你会看到 Pod 状态变为CrashLoopBackOff。控制器对策略的限制:
虽然 Pod 规范支持这三种,但上层控制器有默认要求:- Deployment / StatefulSet / DaemonSet:必须设置为
Always(因为它们的目的是保证服务一直在线)。 - Job:只能设置为
OnFailure或Never(因为 Job 的目的是任务完成后就结束,不能一直重启)。
- Deployment / StatefulSet / DaemonSet:必须设置为
YAML 配置示例
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
# 在这里定义重启策略
restartPolicy: Always # 可选: Always, OnFailure, Never