14. Pod 从入门到深入理解(三)

本章讲解知识点

  • Pod 生命周期和重启策略
  • Pod 健康检查和服务可用性检查
  • 探针配置方式
  • Pod 的初始化容器(Init Container)
  • Pod 的退出流程

<br>

1. Pod 生命周期和重启策略

本章我们分享一个 Pod 对象在 Kubernetes 中的生命周期。Pod 生命周期的变化,主要体现在 Pod API 对象的 Status 部分,这是它除了 MetadataSpec 之外的第三个重要字段。其中,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等一系列知识点的讲解,并且最后总

全部评论

相关推荐

否极泰来来来来:解约赔多少
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务