k8s 的探针和钩子

Kubernetes 提供了两种机制来监控和管理容器的生命周期:探针(Probes)和钩子(Hooks)。探针用于检查容器的健康状态,而钩子则允许在容器生命周期的特定阶段执行自定义操作。

探针(Probes)

Kubernetes 提供了三种类型的探针:

  1. 就绪探针(Readiness Probe):用于确定容器是否准备好接受流量。如果就绪探针失败,Kubernetes 会将该容器从服务的负载均衡池中移除,直到探针成功为止。

  2. 活跃探针(Liveness Probe):用于检查容器是否仍在运行。如果活跃探针失败,Kubernetes 会重启该容器。

  3. 启动探针(Startup Probe):用于检查容器是否已成功启动。如果启动探针失败,Kubernetes 会重启该容器。启动探针主要用于处理启动时间较长的应用程序。

探针配置示例

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
  timeoutSeconds: 5
  failureThreshold: 3

readinessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
  timeoutSeconds: 5
  failureThreshold: 3

startupProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
  timeoutSeconds: 5
  failureThreshold: 3

解释:

  1. livenessProbereadinessProbestartupProbe 分别定义了三种探针。

  2. 每个探针都使用 httpGet 方法,通过 HTTP GET 请求检查容器的健康状态。

    • 有 httpGet、tcpSocket 和 exec 三种方式可以选择。

  3. initialDelaySeconds 指定容器启动后等待多长时间开始进行探测。

  4. periodSeconds 指定探针检查的频率。

  5. timeoutSeconds 指定探针请求的超时时间。

  6. failureThreshold 指定探针失败的次数,超过该次数后会触发相应的操作(如重启容器)。

钩子(Hooks)

Kubernetes 支持两种类型的钩子:

  1. 初始化钩子(Init Hooks):在容器启动之前执行,用于初始化一些资源或进行一些准备工作。

  2. 终止钩子(Termination Hooks):在容器终止之前执行,用于清理资源或执行一些善后工作。

钩子的配置示例:

lifecycle:
    preStop:
        exec:
        command: ["/bin/sh", "-c", "sleep 10"]

lifecycle:
    postStart:
        exec:
        command: ["/bin/sh", "-c", "echo Hello from the postStart hook > /usr/share/message"]

解释:以上配置示例展示了如何使用钩子在容器的生命周期中执行特定操作。preStop 钩子在容器终止之前执行,可以用于进行一些清理工作,例如等待一段时间以确保请求完成。postStart 钩子在容器启动后立即执行(与主进程并行),用于进行一些初始化工作,例如输出一条日志消息。通过合理配置钩子,可以更好地管理容器的生命周期。

preStop的执行流程​

当 Pod 被删除时,Kubernetes 会按以下顺序操作:

  1. ​从 Service 的 Endpoints 移除​:Pod 不再接收新流量。

  2. ​执行 preStop钩子​(如果配置):
    Kubernetes 会等待 preStop完成(超时时间由 terminationGracePeriodSeconds控制)。

  3. ​发送 SIGTERM​:向容器主进程(PID 1)发送终止信号。 ​等待优雅终止期​:

  4. 默认等待 terminationGracePeriodSeconds(30 秒),超时后发送 SIGKILL强制终止。

postStart的执行时机​

  • ​触发时机​:在容器 ​启动后(After the container is created)​,但与容器的 ENTRYPOINT/CMD主进程并行运行​(不是阻塞主进程)。

  • ​非阻塞性​:postStart的执行不会延迟容器进入 Running状态(即使 postStart未完成,容器也可能被标记为 Running)。

  • 与 initContainers的区别​:

    • initContainers:在主容器启动前运行,且必须全部成功后才会启动主容器。

    • postStart:在主容器启动后立即触发,属于生命周期钩子。

初始化容器

初始化容器(Init Containers)是 Kubernetes 中的一种特殊类型的容器,它们在应用容器启动之前运行。初始化容器通常用于执行一些初始化任务,例如设置环境、下载依赖项或配置文件等。

initContainers:
- name: init-myservice
  image: busybox
  command: ['sh', '-c', 'echo Initializing... && sleep 5']

解释:以上配置示例展示了如何定义一个初始化容器。该初始化容器使用 busybox 镜像,并在启动时执行一个简单的命令,打印 "Initializing..." 并等待 5 秒钟。初始化容器会在主应用容器启动之前运行,确保所有必要的初始化任务都已完成。 初始化容器与主应用容器共享同一个网络命名空间和存储卷,这使得它们可以轻松地与主容器进行交互和共享数据。通过使用初始化容器,可以确保应用容器在启动之前具备所需的环境和配置,从而提高应用的可靠性和稳定性。

终止超时时间

Kubernetes 允许为容器设置终止超时时间(Termination Grace Period),以确保容器在被终止时有足够的时间进行清理工作。默认情况下,Kubernetes 会等待 30 秒钟,然后强制终止容器。

terminationGracePeriodSeconds: 60