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请求