标签搜索

k8s(kubernetes)生命周期

cicaba
2025-01-07 / 0 评论 / 2 阅读 / 正在检测是否收录...

生命周期

init

init容器与普通的容器非常像,除了如下两点:

  1. init容器总是运行到成功完成为止
  2. 每个init容器都必须在下一个init容器启动之前成功完成

如果 Pod 的 Init 容器失败Kubernetes 会不断地重启该Pod,直到 Init 容器成功为止。然而,如果Pod对应的restartpolicy 为 Never,它不会重新启动。(restartpolicy默认Always)

init容器特点及特点:

  1. Init容器与应用容器具备不同的镜像,可以把一些危险的工具放置在init容器中,进行使用。
  2. init容器多个之间是线性启动的,所以可以做一些延迟性的操作。
  3. init容器无法定义readinessProbe,其它以外同应用容器定义无异。

Kubernetes 探针类型

Kubernetes 支持三种类型的探针(Probes)来检查容器的健康状态和启动情况,分别是 readinessProbelivenessProbestartupProbe。每种探针有不同的用途和配置选项,下面是对这些探针类型的详细说明:

1. Readiness Probe(就绪探针)

  • 用途:检查容器是否已经准备好处理流量。当容器处于启动阶段或临时不可用时,它可能还不能服务请求。就绪探针帮助 Kubernetes 确定容器是否可以接受流量。
  • 配置方式

    • httpGet:容器通过 HTTP 请求检查一个 URL 是否返回成功的状态(如 200)。
    • exec:通过执行一个命令,如果命令返回 0,则认为容器就绪。
    • tcpSocket:容器检查某个端口是否能通过 TCP 连接。
  • 常见配置项

    • initialDelaySeconds:容器启动后,探针第一次执行的延迟时间,。
    • periodSeconds:探针执行的频率(单位:秒),默认是 10 秒。
    • failureThreshold:连续失败多少次后认为容器不可用, 默认值为3。
    • successThreshold:连续成功多少次后认为容器变为就绪状态,默认值为1。
  • 示例

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

    或者使用 exec 命令:

    readinessProbe:
     exec:
      command: ["test","-e","/usr/share/nginx/html/index0.html"]
     initialDelaySeconds: 1
     periodSeconds: 10
     failureThreshold: 20

2. Liveness Probe(存活探针)

  • 用途:检查容器是否仍然存活。如果存活探针失败,Kubernetes 会重启该容器。通常用来检查容器是否卡住或死锁。
  • 示例

    livenessProbe:
    httpGet:
      path: /healthz
      port: 8080
    initialDelaySeconds: 15
    periodSeconds: 20
    failureThreshold: 3

3. Startup Probe(启动探针)

  • 用途:用于检查容器是否已经成功启动。通常适用于启动时间较长的应用或容器。如果启动探针失败,Kubernetes 会认为容器启动失败并重新启动容器。与 readinessProbe 和 livenessProbe 不同,startupProbe 在容器启动期间生效,容器启动后会停止使用。
  • 示例

    startupProbe:
    httpGet:
      path: /startup
      port: 8080
    initialDelaySeconds: 5
    periodSeconds: 10
    failureThreshold: 30

探针总结

探针类型用途适用场景
readinessProbe判断容器是否准备好接收流量容器启动后,服务准备好接收请求时
livenessProbe判断容器是否存活,如挂起、死锁等容器问题时进行重启容器可能进入死锁状态,需重启
startupProbe判断容器是否成功启动,启动过程中检测,失败时重启容器容器启动时间较长,常用于长时间初始化的容器

生命周期钩子(Lifecycle Hooks)

在 Kubernetes 中,容器的生命周期管理可以通过 生命周期钩子(Lifecycle Hooks) 来控制,主要包括 启动钩子(postStart) 和 结束钩子(preStop)。这些钩子可以在容器的启动和结束过程中执行特定的命令或操作,以确保容器在这两个关键时刻完成某些任务。

1. 启动钩子 postStart

  • 用途:postStart 钩子在容器启动后立即执行。它是在容器启动并运行容器内的主进程之前调用的。你可以在这个阶段执行一些额外的操作,比如初始化任务、通知服务、进行预处理等。
  • 触发时机:在容器启动后、主进程开始执行之前。
  • 常见应用

    • 容器启动时创建必要的文件、目录或网络设置。
    • 启动时通知其他服务或进行资源初始化。
    • 在容器启动时,执行一些健康检查、数据迁移等操作。
  • 配置方式
    postStart 是 lifecycle 的一部分,它的执行通常是基于 命令执行,可以使用 exec 或 httpGet 的方式。
  • 示例

    apiVersion: v1
    kind: Pod
    metadata:
    name: poststart-example
    spec:
    containers:
    - name: my-container
      image: nginx:1.14.2
      lifecycle:
        postStart:
          exec:
            command: ["/bin/sh", "-c", "echo 'Container Started' > /tmp/start.txt"]
  • 用途:preStop 钩子在容器终止之前执行,用于在容器退出前执行一些清理操作或确保容器退出时能够优雅地停机。它在容器的主进程开始终止之前被调用,通常用于处理资源释放、通知外部服务等任务。
  • 触发时机:在容器终止前,即主进程被杀死之前。此时可以进行一些清理操作,确保容器以优雅的方式关闭。
  • 常见应用

    • 在容器退出前清理临时文件、关闭网络连接。
    • 在容器关闭前,通知其他服务停止相关任务。
    • 提供优雅的停机过程,确保不会丢失数据或中断服务。
  • 配置方式

    2. 结束钩子 preStop

    preStop 钩子同样是 lifecycle 的一部分,通常是一个 命令执行,可以使用 exec 或 httpGet。

  • 示例

    apiVersion: v1
    kind: Pod
    metadata:
    name: prestop-example
    spec:
    containers:
    - name: my-container
      image: nginx:1.14.2
      lifecycle:
        preStop:
          exec:
            command: ["/bin/sh", "-c", "echo 'Container is stopping' > /tmp/stop.txt"]

    启动钩子与结束钩子的配置位置
    钩子通常作为 lifecycle 的一部分配置在容器的规范中。

注意事项

  • 执行时机

    • postStart 在容器启动后立即执行,但不会等待它完成;它和主进程并行执行。
    • preStop 在容器关闭前执行,但它的执行时间有限制。如果 preStop 钩子执行时间超过了
    • terminationGracePeriodSeconds,则容器会被强制终止。
  • 超时设置
    Kubernetes 对钩子的执行有默认的超时时间,postStart 和 preStop 钩子都有 timeoutSeconds 配置项,默认值为 1 秒,表示钩子执行时如果超过此时间,则会被强制中止。

    • 配置超时的示例:

      lifecycle:
      postStart:
      exec:
        command: ["/bin/sh", "-c", "echo 'Container Started'"]
      timeoutSeconds: 5  # 配置超时为5秒
      preStop:
      exec:
        command: ["/bin/sh", "-c", "echo 'Container is stopping'"]
      timeoutSeconds: 5  # 配置超时为5秒
  • 钩子失败处理

    • 如果 postStart 或 preStop 钩子失败,容器仍然会继续执行或终止。
    • postStart 失败时不会阻止容器启动,容器会继续运行。
    • preStop 失败时不会阻止容器终止,但是它的退出会被记录。

总结

钩子类型触发时机用途配置方式
postStart容器启动后、主进程开始执行之前在容器启动时执行初始化操作或启动任务exec 或 httpGet
preStop容器终止前、主进程终止之前在容器退出前执行清理操作或优雅停机exec 或 httpGet

启动钩子和结束钩子提供了在容器生命周期的关键时刻执行额外操作的能力,能够帮助容器优雅地启动和关闭,减少数据丢失或不一致的情况。

0

评论 (0)

取消