k8spod生命周期

Posted caibao666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8spod生命周期相关的知识,希望对你有一定的参考价值。

pod对象自从创建开始至终止退出的时间范围称为生命周期,在这段时间中,pod会处于多种不同的状态,并执行一些操作;其中,创建主容器为必须的操作,其他可选的操作还包括运行初始化容器(init container)、容器启动后钩子(start hook)、容器的存活性探测(liveness probe)、就绪性探测(readiness probe)以及容器终止前狗子(pre stop hook)等,这些操作是否执行则取决于pod的定义

一、pod的相位

无论是手动创建还是通过控制器创建pod,pod对象总是应该处于其生命进程中以下几个相位之一:

pending:apiserver创建了pod资源对象并存入etcd中,但它尚未被调度完成或者仍处于下载镜像的过程中

running:pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成

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

failed:所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态或已经被系统终止。

unknown:apiserver无法正常获取到pod对象的状态信息,通常是由于其无法于所在工作节点的kubelet通信所致。

pod的相位是在其生命周期中的宏观概念,而非对容器或pod对象的综合汇总,而且相位的数量和含义被严格界定。

二、pod的创建过程

pod是k8s的基础单元,以下为一个pod资源对象的典型创建过程:

1)、用户通过kubectl或其他api客户端提交pod spec给api server

2)、api server尝试着将pod对象的相关信息存入etcd中,待写入操作执行完成,api server即会返回确认信息至客户端。

3)、api server开始反映etcd中的状态变化

4)、所有的k8s组件均使用watch机制来跟踪检查api server上的相关变动

5)、kube-scheduler通过其watch觉察到api server创建了新的pod对象但尚未绑定至任何工作节点

6)、kube-scheduler为pod对象挑选一个工作节点并将结果信息更新至api server

7)、调度结果信息由api server更新至etcd,而且api server也开始反映此pod对象的调度结果

8)、pod被调度到目标工作节点上的kubelet尝试在当前节点上调用docker启动容器,并将容器的结果状态回送至api server

9)、api server将pod状态信息存入etcd中

10)、在etcd确认写入操作成功完成后,api server将确认信息发送至相关的kubelet,时间将通过它被接受。

三、pod生命周期中的重要行为

除了创建应用容器之外,用户还可以为pod对象定义其生命周期中的多种行为,如初始化容器、存活性探测及就绪性探测等。

1、初始化容器

初始化容器即应用程序的主容器启动之前要运行的容器,常用于为主容器执行一些预置操作,它们具有两种典型特征

1)初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么k8s需要重启它直到成功完成

2)每个初始化容器都必须按定义的顺序串行运行

有不少场景都需要在应用容器启动之前进行部分初始化操作,例如,等待其他相关联组件服务可用、基于环境变量或配置模板为应用程序生成配置文件、从配置中心获取配置等。初始化容器的典型应用需求具体包含如下几种。

1)用于运行特定的工具程序,出于安全等反面的原因,这些程序不适于包含在主容器镜像中

2)提供主容器镜像中不具备的工具程序或自定义代码

3)为容器镜像的构建和部署人员提供了分离、独立工作的途径,使得它们不必协同起来制作单个镜像文件

4)初始化容器和主容器处于不同的文件系统视图中,因此可以分别安全地使用敏感数据,例如secrets资源

5)初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足

pod资源的spec.initContainers字段以列表的形式定义可用的初始容器,其嵌套可用字段类似于spec.containers。

2、生命周期钩子函数

容器生命周期钩子使它能够感知其自身生命周期管理中的事件,并在相应的时刻到来时运行由用户指定的处理程序代码。k8s为容器提供了两种生命周期钩子:

postStart:于容器创建完成之后立即运行的钩子处理器(handler),不过k8s无法确保它一定会于容器中的entrypoint之前运行

preStop:于容器终止操作之前立即运行的钩子处理器,它以同步的方式调用,因此在其完成之前会阻塞删除容器的操作调用。

钩子处理器的实现方法由Exec和HTTP两种,前一种在钩子事件触发时直接在当前容器中运行由用户定义的命令,后一种则是在当前容器中向某url发起http请求。postStart和preStop处理器定义在spec.lifecycle嵌套字段中。

3、容器探测

容器探测时pod对象生命周期中的一项重要的日常任务,它是kubelet对容器周期性执行的健康状态诊断,诊断操作由容器的处理器进行定义。k8s支持三种处理器用于pod探测:

ExecAction:在容器中执行一个命令,并根据其返回的状态码进行诊断的操作称为Exec探测,状态码为0表示成功,否则即为不健康状态

TCPSocketAction:通过与容器的某TCP端口尝试建立连接进行诊断,端口能够成功打开即为正常,否则为不健康状态。

HTTPGetAction:通过向容器IP地址的某指定端口的指定path发起HTTP GET请求进行诊断,响应码为2**或3**时即为成功。

任何一种探测方式都可能存在三种结果:success、failure、unknown

kubelet可在活动容器上执行两种类型的检测:

存活性检测:用于判定容器是否处于运行状态,一旦此类检测未通过,kubelet将杀死容器并根据restartPolicy决定是否将其重启;未定义存活性检测的容器的默认状态未success

就绪性检测:用于判断容器是否准备就绪并可对外提供服务;未通过检测的容器意味着尚未准备就绪,端点控制器会将其IP从所有匹配到此pod对象的service对象的端点列表中移除;检测通过之后,会再次将其IP添加至端点列表中。

四、容器的重启策略

 

以上是关于k8spod生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Flutter生命周期

Vue的生命周期

Rx 生命周期管理

Vue生命周期简述

Vue生命周期简述

Android 的生命周期