K8s-Pod的生命周期

Pod的生命周期


示意图:

  • pod里的探针:检测服务的可用性

    • 是否就绪
    • 是否工作正常
  • 分类

    • 就绪探针:判断服务是否可以提供访问
    • 存活探针:检测是否可以继续工作
  • 检测方法

    • TCP socket响应
    • HTTP >=200 && <400 #正常值
    • EXEC 0 #运行脚本的返回值为0正常
  • pod生命周期详细说明

  • 注:

    • 可以将启动后看成启动前
    • pause一启动就休眠,所以适合初始化网络栈和挂载网络卷,不易出问题
    • initC-1 > initC-2 > initC-3 线性启动
    • mainC-1,mainC-2.....并行启动
  • init容器

​ 引入:Pod 能够具有多个容器,应用运行在容器里面,但是它也可 能有一个或多个先于应用容器启动的 Init 容器

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

​ init容器总是运行到成功完成为止,

​ 每个init容器都必须在下一个init容器启动之前完成

  • 注:

    • 不能将应用程序放到initc中去运行
    • 如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod, 直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 为 Never,它不会重新启动
  • kubernetes重启策略

    • Always: 当容器失效时,由Kubelet 自动重启该容器。
    • OnFailure:当容器终止运行且退出码不为0时,由Kubelet 自动 重启该容器, 即正常退出时不重启,异常退出重 启。
    • Nerver:从不重启容器。

​ Pod的重启策略与控制方式息息相关,当前可用于管理Pod的控 制器包括 ReplicationController、Job、DaemonSet及直接通过 kubelet管理(静态Pod)。

  • 每种控制器对Pod的重启策略要求如下:

    • RC和DaemonSet:必须设置为Always,需要保证该容器持续运 行。
    • Job和CronJob:OnFailure或Never,确保容器执行完成后不再 重启。
    • kubelet:在Pod失效时自动重启它,不论将RestartPolicy设置为 什么值,也不会对Pod进行健康检查。
  • init容器的作用:因为init容器具有与应用程序容器分离的单独镜像,所以它们的启动 相关代码具有如下优点

    • 它们可以包含并运行实用工具,但是出于安全考虑,是不建议在 应用程序容器镜像中包含这些实用工具的
    • 应用程序镜像可以分离出创建和部署的角色,而没有必要联合他 们构建一个单独的镜像
    • Init 容器使用 Linux Namespace,所以相对应用程序容器来说具 有不同的文件系统视图。因此,它们能够具有访问 Secret 的权限, 而应用程序容器则不能
    • 它们必须在应用程序容器启动之前运行完成,而应用程序容器是 并行运行的,所以 Init 容器能够提供了一种简单的阻塞或延迟应用 容器的启动的方法,直到满足了一组先决条件
  • initC特殊说明

    • 在 Pod 启动过程中,Init 容器会按顺序在网络和数据卷初始化之 后启动。每个容器必须在下一个容器启动之前成功退出
    • 如果由于运行时或失败退出,将导致容器启动失败,它会根据 Pod 的 restartPolicy 指定的策略进行重试。然而,如果 Pod 的 restartPolicy 设置为 Always,Init 容器失败时会使用 RestartPolicy 策略
    • 所有的 Init 容器没有成功之前,Pod 将不会变成 Ready 状态。 Init 容器的端口将不会在 Service 中进行聚集。 正在初始化中的 Pod 处于 Pending 状态,但应该会将 Initializing 状态设置为 true
    • 对 Init 容器 spec 的修改被限制在容器 image 字段,修改其他字 段都不会生效。更改 Init 容器的 image 字段,等价于重启该 Pod
    • 注意: Init 容器具有应用容器的所有字段。除了 readinessProbe,因为 Init 容器无法定义不同于完成(completion)的就绪(readiness) 之外的其他状态
    • 在 Pod 中的每个 app 和 Init 容器的名称必须唯一;与任何其它 容器共享同一个名称,会在验证时抛出错误
  • 容器探针:探针是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler。有三种类型的处理程序:

    • ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功

    • HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊 断被认为是成功的

    • TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检 查。如果端口打开,则诊断被认为是成功的。

      每次探测都将获得以下三种结果之一:

      • 成功:容器通过了诊断
      • 失败:容器未通过诊断
      • 未知:诊断失败,因此不会采取任何行动
  • 探针类型

    • livenessProbe(存活探测):指示容器是否正在运行。如果存活探测 失败,则 kubelet 会杀死容器,并且容器将受到其重启策略的影 响。如果容器不提供存活探针,则默认状态为 Success
    • readinessProbe(就绪探测):指示容器是否准备好服务请求。如果 就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点 中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success
  • 钩子--启动退出动作

    Pod hook(钩子)是由 Kubernetes 管理的 kubelet 发起的,在 容器中的进程启动前或者容器中的进程终止之前运行,这是包含在 容器的生命周期之中。可以同时为 Pod 中的所有容器都配置hook

  • Hook的类型

    • exec:执行一段命令
    • HTTP:发送HTTP请求
posted @ 2022-07-21 17:52  Sunset_cloud  阅读(97)  评论(0编辑  收藏  举报