K8S学习之基础九:pod的生命周期

发布于:2025-03-06 ⋅ 阅读:(10) ⋅ 点赞:(0)

Pod生命周期

pod从开始创建到终止退出的时间范围成为pod生命周期

生命周期包含一下几个重要流程:

创建主容器(container是,yaml里创建的容器),初始化容器(initContainers),容器启动后钩子,启动探测、存活性探测、就绪性探测,容器停止前钩子。

pod在整个生命周期过程中总会处于以下几个状态:

pending:创建了pod资源并存入etcd中,但尚未完成导读

containercreating:pod调度完成,被分配到指定的node上。处于容器创建的过程中,通常是在拉取镜像过程中

running:pod包含的所有容器都创建成功,并运行

succeeded:pod中所有容器都已成功终止并且不会被重启

failed:所有容器都已经终止,但至少一个容器终止失败,也就是说容器反悔了非0值的退出状态或已经被系统终止

unknown:因为某些原因无法取得pod状态,这种情况与pod所在主机通信失败

pod生命周期的重要行为:

  1. 在启动任何容器之前,先创建pause基础容器,初始化pod环境并为后续加入的容器提供共享的名称空间
  2. 初始化容器(initcontainer,可有可无),一个pod可以拥有任意数量的init容器,按照yaml里的顺序执行,并且仅当最有一个init容器执行完毕才会启动主容器
  3. 生命周期钩子

pod允许定义两种类型的声明周期钩子,启动后钩子(post-start)和停止前钩子(pre-stop)

这些生命周期钩子是基于每个容器指定的,和init容器不同的是,init是对应到整个pod,而钩子是针对容器的,是在容器启动后和停止前执行的

容器探测

对pod健康状态诊断,分为三种:Startupprobe(启动探测)、Livenessprobe(存活性探测)、Readinessprobe(就绪性探测)

Startupprobe:探测容器是否正常运行

Livenessprobe:判断容器是否处于running状态,根据重启策略决定是否重启容器

Readinessprobe:判断容器是否准备就绪并对外提供服务,将容器设置为不可用,不接受service转发的请求

三种探针用于pod检测:

ExecAction:在容器中执行一个命令,并根据返回的状态�码进行诊断,只有返回0为成功

TCPSocketAction:通过与容器的某TCP端口尝试建立连接

HTTPGetAction:通过向容器IP地址的某指定端口的path发起HTTP GET请求

容器的重启策略:

Always:pod对象终止就重启,默认设置

OnFailure;尽在pod出现错误时才重启

Never:从不重启

一旦pod被绑定到一个节点上,就不会重新绑定到另一个节点上,要么重启,要么终止

pod的终止过程

  1. 用户发出删除pod命令:kubectl delete pod    kubectl delete -f yaml
  2. pod队形随着时间的推移更新,默认30秒,pod被视为daad状态
  3. 将pod标记为Terminating状态
  4. 同时监控到pod状态为Terminating状态的同时启动pod关闭过程
  5. 同时endpoints控制器监控到pod对象关闭,将pod与service匹配的endpints删除
  6. 如果pod定义了preStop钩子处理程序,则 pod 被标记为“Terminating”状态时以同步的方式启动执行;若宽限期结束后,preStop 仍未执行结束,第二步会重新执行并额外获得一个2秒的小宽限期
  7. pod内对象的容器收到TERM信号
  8. 宽限期结束之后,若存在任何一个运行的过程,pod会收到SIGKILL信号
  9. kubelet请求apiserver将此pod资源款玄奇设置为0,从而完成删除操作