Kubernetes Pod 的重启策略
在 Kubernetes(简称 K8s)中,Pod 的重启策略(Restart Policy)决定了当容器失败时,kubelet 应该如何处理容器的重启行为。重启策略主要由 spec.restartPolicy
字段定义,并适用于整个 Pod 中的所有容器。Kubernetes 支持以下三种主要的重启策略:
1. Always(默认策略)
- 行为:
如果重启策略设置为Always
,无论容器因何原因停止运行(正常退出或异常终止),kubelet 都会尝试重启该容器。这是 Kubernetes 中最常用的重启策略,也是默认值。 - 适用场景:
用于长时间运行的服务(如 Web 应用或 API 服务),即服务型容器。 - 注意:
当 Pod 被控制器(如 Deployment)管理时,即使容器频繁崩溃,kubelet 也会持续重启容器,直至问题被解决或 Pod 被替换。
2. OnFailure
- 行为:
如果设置为OnFailure
,kubelet 仅在容器以非零退出码结束时重启容器。如果容器正常退出(退出码为 0),kubelet 不会进行重启操作。 - 适用场景:
通常用于批处理任务或作业型工作负载(如计算任务、数据迁移)。这些任务在成功完成后可以自然终止,无需重启。 - 典型用法:
配合 Job 或 CronJob 控制器运行一次性任务。
3. Never
- 行为:
如果设置为Never
,kubelet 无论容器停止的原因如何,都不会尝试重启容器。容器停止后将保持停止状态,直到手动干预或关联的控制器(如 Job)重新调度 Pod。 - 适用场景:
用于需要手动管理容器状态的场景,或明确指定某些任务在终止后无需重启。
特别说明:OnCrash
文中提到的 OnCrash
策略并非 Kubernetes 原生的重启策略选项(当前 Kubernetes 仅支持 Always
、OnFailure
和 Never
)。类似的行为通常通过控制器(如 DaemonSet 或 NodeProblemDetector)实现。例如,DaemonSet 在节点重启或 Pod 崩溃时会触发 Pod 的重新调度和恢复操作。
控制器的重启行为
在 Kubernetes 中,当 Pod 由控制器(如 Deployment、StatefulSet、DaemonSet)管理时,实际的重启行为由控制器的逻辑控制。例如:
-
Deployment 和 StatefulSet:
会持续监控 Pod 的状态。如果 Pod 异常终止,控制器会重新创建一个新的 Pod 副本,而不是仅仅重启容器。 -
Job 和 CronJob:
通常配合OnFailure
或Never
策略使用,确保任务在失败时被重新调度运行,直到成功完成。
配置示例
以下是配置不同重启策略的 Pod 示例:
使用 Always
策略(默认值)
apiVersion: v1
kind: Pod
metadata:
name: always-restart
spec:
restartPolicy: Always
containers:
- name: app
image: myapp:latest
使用 OnFailure
策略
apiVersion: v1
kind: Pod
metadata:
name: onfailure-restart
spec:
restartPolicy: OnFailure
containers:
- name: app
image: myapp:latest
使用 Never
策略
apiVersion: v1
kind: Pod
metadata:
name: never-restart
spec:
restartPolicy: Never
containers:
- name: app
image: myapp:latest
总结
restartPolicy
的默认值为Always
,适用于服务型工作负载。- 使用
OnFailure
或Never
时,通常搭配 Job 或其他手动管理流程。 - 控制器(如 Deployment、StatefulSet)会接管 Pod 的重启和替换逻辑,因此
restartPolicy
对这些控制器管理的 Pod 并不生效。
通过合理选择重启策略和控制器逻辑,可以确保 Kubernetes 集群的工作负载具备高可用性和良好的恢复能力。
标签:容器,控制器,策略,Kubernetes,重启,Pod From: https://www.cnblogs.com/leojazz/p/18686406