14. Pod 从入门到深入理解(三)
本章讲解知识点
- Pod 生命周期和重启策略
- Pod 健康检查和服务可用性检查
- 探针配置方式
- Pod 的初始化容器(Init Container)
- Pod 的退出流程
<br>
1. Pod 生命周期和重启策略
本章我们分享一个 Pod 对象在 Kubernetes 中的生命周期。Pod 生命周期的变化,主要体现在 Pod API 对象的 Status
部分,这是它除了 Metadata
和 Spec
之外的第三个重要字段。其中,pod.status.phase
,就是 Pod 的当前状态,它有如下几种可能的情况:
- Pending:Pod 被创建,但是还没有分配到可用的节点上。
- Running:Pod 已经被调度到了某个节点上,并且 Pod 中的容器至少有一个正处于运行状态。
- Succeeded:Pod 中的所有容器都已经成功运行完毕,并且已经退出,且不会再重启。
- Failed:Pod 中的所有容器均已退出,但某个容器退出且退出状态码不为 0。
- Unknown:Pod 的状态无法确定,通常是由于与 Kubernetes API 服务器的通信故障导致。
Pod 可能因为容器故障、节点故障等原因而需要重启,在这种情况下,Pod 所在的 Node 上的 kubelet 将负责判断并执行重启操作。可以通过设置 Pod 的 restartPolicy 字段来指定重启策略。restartPolicy 字段有以下几个可选取值:
- Always:Pod 中的容器退出后,由 kubelet 自动重启该容器。
- OnFailure:Pod 中的容器退出状态码为非 0 时,会自动重启。
- Never:Pod 中的容器退出后不会自动重启。
kubelet 会根据 sync-frequency 参数乘以 2n 来计算失效容器的重启时间间隔,例如 1、2、4、8 等倍数。最长的重启延迟为 5 分钟。在成功重启容器后的 10 分钟内,kubelet 会重置该时间间隔。
Pod 的重启策略和控制方式密切相关。目前可用于管理 Pod 的控制器包括 ReplicationController、Job、DaemonSet,以及可以通过 kubelet 管理的静态 Pod。各个控制器对 Pod 的重启策略要求如下:
- ReplicationController 和 DaemonSet:必须将重启策略设置为 Always,以确保该容器持续运行。
- Job:应将重启策略设置为 OnFailure 或 Never,以确保容器执行完成后不再重启。
- kubelet:在 Pod 失效时自动重启它,无论 RestartPolicy 设置为何值,也不会对 Pod 进行健康检查。
对于在同一个 Pod 中运行的多个容器,可以分别设置每个容器的重启策略。如果未显式设置某个容器的重启策略,则将默认使用 Pod 的重启策略。默认值是 Always。
需要注意的是,如果 Pod 的重启策略设置为 Never,并且某个容器在 Pod 运行期间退出,则该容器将无法自动重启,导致 Pod 一直处于 Failed 状态。此时,可以通过手动删除 Pod 或修改 Pod 的重启策略来解决该问题。
<br>
2. Pod 健康检查和服务可用性检查
服务健康检查是现代分布式系统中常用的一种机制,它用于确保服务在运行时的可用性和稳定性。在传统的单体应用程序中,服务的可用性可以通过进程是否在运行来判断,但在分布式系统中,服务可能会部署在不同的节点和集群中,此时仅仅通过进程是否在运行来判断服务是否可用是不够的。
分布式系统中的服务通常需要依赖许多其他服务才能完成其工作。当一个服务不可用时,可能会影响其他服务的正常工作,导致整个系统出现故障。因此,服务健康检查可以帮助我们及时发现服务的故障,以便采取相应的措施来恢复服务的可用性,从而确保整个系统的稳定性和可靠性。
在 Kubernetes 中,LivenessProbe、ReadinessProbe、StartupProbe 是三种常见的 Pod 健康检查机制,它们可以检查 Pod 内容器的运行状态,并根据运行状态进行判断和处理。
- Liveness Probe:Liveness Probe 用于检测容器是否处于健康状态。如果某个容器的 Liveness Probe 检查失败,Kubernetes 就会判定该容器不健康,并试图根据容器的重启策略对其进行重启。反之,如果 Liveness Probe 检查成功,则 Kubernetes 认为该容器是健康的,将继续保持其正常运行状态。
- Readiness Probe:Readiness Probe 用于检测容器是否已经准备好接收流量。如果某个容器的 Readiness Probe 检查失败,Kubernetes 会认为该容器还没有准备好接收流量,会将 Pod 从服务的 Endpoint 列表中删除,直到该容器的 Readiness Probe 检查成功。反之,如果 Readiness Probe 检查成功,则 Kubernetes 认为该容器已经准备好接收流量,并将其添加到服务的 Endpoint 列表中,使得服务可以将流量发送到该容器。
- StartupProbe(启动探针):某些应用会遇到启动比较慢的情况,例如应用程序启动时需要与远程服务器建立网络连接,或者遇到网络访问较慢等情况时,会造成容器启动缓慢,Liveness Probe 和 Readiness Probe 的方式已经不再适用,因为这会造成有且仅有一次的超长延迟。此时,可以使用 StartupProbe 探针来解决这个问题。StartupProbe 探针用于检查容器是否已经启动并准备好接收流量,它主要用于等待容器启动过程中的某些条件。StartupProbe 探针可以使用 HTTP 请求、TCP 健康检查或命令执行来检查容器是否就绪。如果使用 StartupProbe 探针,其他两种探针会被禁用,直到容器成功启动后,其他探针才会启用。
在 Kubernetes Pod 中,LivenessProbe、ReadinessProbe 和 StartupProbe 三种探针可以同时使用,可以根据实际情况和需求来配置不同的探针。例如,可以使用 LivenessProbe 探针来检测容器是否存活,使用 ReadinessProbe 探针来检测容器是否已经就绪,同时还可以使用 StartupProbe 探针来解决容器启动缓慢的问题。使用这些探针可以提高应用程序的可靠性和稳定性。
探针的配置格式如下:
livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 3 failureThreshold: 5 successThreshold: 5 periodSeconds: 5 timeoutSeconds: 1
这里的 httpGet 是用于使用 HTTP 请求进行探测的参数,initialDelaySeconds 表示容器启动后需要等待多少秒才开始探测,failureThreshold 表示探测失败后的重试次数,successThreshold 表示成功次数以后 Pod 就可以接收请求了。另外,periodSeconds 表示探测的间隔时间,timeoutSeconds 表示每次探测的超时时间为1秒。除了使用 HTTP 请求外,还可以使用 TCP 健康检查或命令执行来进行探测。
<br>
3. 探针配置方式
在 Kubernetes 中,可以通过设置探针(probe)来监测 Pod 的健康状态。探针可以在 Pod 的 spec 中配置,当容器内部运行的进程停止运行或无法响应请求时,可以自动触发 Kubernetes 进行相应的操作,如重启 Pod、重新调度等。
Kubernetes支持三种类型的探针配置方式,分别是:
- ExecAction:ExecAction 可以通过在容器内部运行一个特定的命令来检测容器的健康状态。举例来说,可以使用 ExecAction 来检查容器内部是否存在某个文件或者某个特定进程是否正在运行。当命令的返回值为 0 时,Kubernetes 将认为该容器处于健康状态;反之,如果命令返回值不为 0,则认为该容器处于不健康状态。
- TCPSocketAction:TCPSocketAction 通过在指定的端口上进行 TCP 连接来检测容器的健康状况。如果连接成功,则认为容器处于健康状态;否则,认为容器处于不健康状态。需要注意的是,如果容器中没有进程在指定的端口上监听连接,则连接将失败。
- HTTPGetAction:HTTPGetAction 可以用来检查容器是否能够成功响应 HTTP 请求,并且响应的状态码是否符合预期。在 Kubernetes 中,通常使用 HTTPGetAction 来检查 Pod 是否已经完全启动并且可以接收流量。例如,可以配置 HTTPGetAction 来检查应用程序的 /healthz 请求路径是否可用,并且响应的状态码是否为 200。如果 HTTPGetAction 无法成功响应 HTTP 请求,非期望状态码则认为容器处于不健康状态,可以触发 Kubernetes 进行相应的操作。
需要注意的是,这三种类型的探针可以组合使用,以便更全面地检测容器的健康状态。例如,可以同时配置 ExecAction 和 HTTPGetAction 来检查容器内部的进程是否正在运行,并且应用程序的 /healthz
请求路径是否可用。
以下是三种探针方式的具体举例:
ExecAction方式举例:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx:latest command: ["/bin/sh", "-c", "while true; do sleep 30; done"] livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5
上面的示例定义了一个使用 ExecAction 方式的 Liveness 探针。容器运行时会持续执行一个 sleep 命令,Liveness 探针会每 5 秒钟执行一次 cat /tmp/healthy
命令。如果该命令返回 0,则认为容器处于健康状态;否则认为容器出现了问题,需要进行重启。
TCPSocketAction 方式举例:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx:latest command: ["/bin/sh", "-c", "while true; do sleep 30; done"] readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 5
上面的示例定义了一个使用 TCPSocketAction 方式的 Readiness 探针。容器运行时会持续执行一个 sleep 命令,并监听 8080 端口。Readiness 探针会每 5 秒钟执行一次 TCP 连接,如果连接成功,则认为容器准备好接收流量;否则认为容器没有准备好,不能接收流量。
HTTPGetAction 方式举例:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx:latest readinessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 5 periodSeconds: 5
上面的示例定义了一个使用 HTTPGetAction 方式的 Readiness 探针。容器运行时会启动一个 Nginx 服务器,并监听 80 端口。Readiness 探针会每 5 秒钟执行一次 HTTP 请求,请求路径为 /healthz
。如果请求返回 200 到 399 之间的状态码,则认为容器准备好接收流量;否则认为容器没有准备好,不能接收流量。
<br>
4. Pod 的初始化容器(Init Container)
4.1. 基本概念
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总