Kubernetes Pod 生命周期
Kubernetes Pod 的生命周期分为多个阶段,从创建到删除,每个阶段都反映了 Pod 当前的状态。Pod 生命周期的主要阶段如下:
1. Pending
- 描述:Pod 已被 Kubernetes API 服务器接受,但还没有调度到节点,或是需要拉取的镜像还未完成。
- 状态:Pod 处于等待调度或资源准备中。
2. Running
- 描述:Pod 已调度到某个节点并启动其所有定义的容器。
- 状态:至少有一个容器正在运行,或者所有容器都已经成功启动。
3. Succeeded
- 描述:Pod 中的所有容器成功终止,且不会再次重启。
- 状态:Pod 执行完任务后结束,常见于批处理任务。
4. Failed
- 描述:Pod 中的至少一个容器非正常终止,且不会再次重启。
- 状态:Pod 由于失败条件(如退出代码不为 0)进入 Failed 状态。
5. CrashLoopBackOff
- 描述:Pod 中的某个容器不断崩溃,Kubernetes 尝试重启该容器,但连续失败。
- 状态:Pod 处于周期性崩溃和重启的状态。
6. Unknown
- 描述:Pod 的状态无法确定,通常是由于与节点的通信失败。
- 状态:API 服务器无法与 Pod 调度的节点通信。
Kubernetes Pod 的重启策略
Pod 的重启策略(Restart Policy)定义了容器在失败时的重启行为。Pod 的重启策略分为三种,适用于所有 Pod 内的容器,默认情况下,Pod 的重启策略是 Always。
1. Always
- 描述:无论容器退出的原因是什么,都会立即重启容器。
- 适用场景:适用于长期运行的服务型应用,如 Web 服务器。
- 示例:如果容器意外终止,Kubernetes 会自动尝试重启。
2. OnFailure
- 描述:只有当容器以非 0 退出码终止时才会重启容器。
- 适用场景:适用于批处理任务或需要在失败时重试的任务。
- 示例:如果任务失败(退出码非 0),则 Kubernetes 会重启 Pod;如果任务成功(退出码为 0),则不会重启。
3. Never
- 描述:容器终止后不再重启,无论退出码是什么。
- 适用场景:适用于一次性任务,当任务结束后,不需要重启。
- 示例:容器任务完成后,Kubernetes 不会自动重启容器,Pod 会直接进入
Succeeded或Failed状态。
Pod 生命周期控制
Kubernetes 提供了一些机制来控制 Pod 的生命周期:
1. Init 容器 (Init Containers)
- Init 容器是在主容器启动之前运行的临时容器,通常用于执行初始化任务,如准备数据或检查依赖。
- Init 容器必须按顺序完成,只有当所有 Init 容器成功完成后,主容器才会启动。
2. 探针 (Probes)
- Liveness Probe: 检查容器是否处于健康状态。如果 Liveness Probe 失败,Kubernetes 会重启容器。
- Readiness Probe: 检查容器是否准备好接受流量。失败时,Kubernetes 会将 Pod 从负载均衡器中移除。
- Startup Probe: 用于检查容器是否已成功启动,适用于启动较慢的应用。
3. 生命周期钩子 (Lifecycle Hooks)
- PostStart: 在容器启动后立即执行的命令或脚本。
- PreStop: 在容器停止之前执行的命令或脚本,用于优雅终止服务。
重启策略的适用场景
- Always: 适用于需要持续运行的服务或应用,当服务故障时自动恢复,比如 Web 服务、后台任务。
- OnFailure: 适用于批处理任务、数据迁移等任务失败后需要重试,但任务成功完成后不需要再运行。
- Never: 适用于完成一次性任务的场景,任务结束后不会再次运行,如数据处理任务。
Pod 的生命周期管理和重启策略为应用程序提供了灵活性和容错能力,确保应用的高可用性和可靠性。