kubernetes pod生命周期

在kubernetes集群中,pod的创建是一切的开始,本文介绍一下我所了解的pod的生命周期。
k8s中kube-apiserver是对外提供访问的唯一借口,此组件提供了认证/授权/准入控制功能,其中准入控制包括了MutatingAdmissionWebhook和ValidatingAdmissionWebhook两种实现类型,其中istio等功能基于此实现,暂且不把准入控制计算到pod的生命周期中。

pod对象从其创建开始至其终止推出的时间范围成为生命周期。这其中包括创建主容器,初始化容器,容器启动后钩子,容器存活性探测,以及容器停止前钩子,其中其中主容器是必须的。

首先介绍一下pod生命周期的几种状态:
Pending:创建pod的资源对象已经存入etcd但是pod尚未被调度。
Running:pod已经被kubelet创建完成
Secceeded:pod都已经终止成功并且不会被重启
Failed:所有容器都已经终止,但是至少又一个容器终止失败,即容器返回了非0状态或已经被系统终止
Unknown:api server无法正常获取到pod对象的状态信息。

pod创建的过程:
1>用户通过API Server或其他API客户端提交pod Spec给API Server
2>API Server将pod的信息存入到etcd中,待写入操作完成后,API Server返回确认信息至客户端
3>API Server将信息写入到etcd中之后,其中informer机制开始起作用,通过watch机制将pod状态的变化反映到缓存中。(informer相关内容可以参考以下链接:https://www.jianshu.com/p/1e2...
4>kube-scheduler的watch机制察觉到pod对象创建但是并未绑定到任何工作节点,kube-scheduler开始根据predicates以及priorities算法来计算pod的最佳运行节点,然后将pod的调度结果反映到API Server中(具体调度过程可以参考之前文章)。
5>pod调度完成之后,由kubelet来创建pod并将容器状态返回至API Server存入到etcd中。
6>写入成功之后并将结果反映到相应的kubelet。
上面是创建pod的几个重要步骤:

pod生命周期的几个重要行为:

1.初始化容器,初始化容器的两个特征:
1)初始化容器必须运行完成才会创建主容器
2)初始化容器按照定义的顺序串行运行

2.生命周期钩子:
pod的生命周期钩子分为以下两种:
1)postStart:容器创建完成之后执行的钩子处理程序,但是无法保证它一定会于容器中的endpoint之前运行
2)preStop:容器终止之前立即运行的钩子处理器,它以同步的方式调用,完成之前阻止删除容器操作。

3.容器探测:
容器探测分为就绪性探测和存活性探测
1)就绪性探测:用于判断容器是否就绪并可对外提供服务
2)存活性探测:用于探测容器是否处于运行状态,一旦处于非运行状态,杀死容器根据容器重启策略判断是否将其重启,为定义探测的默认状态是success
上述两种探测支持三种处理方式:
1)ExecAction:在容器中执行一个命令,根据命令返回状态码进行诊断
2)TCPSocketAction:通过与容器的某个TCP端口尝试建立连接来判断将康状况
3)HTTPAction:通过http调用的方式来判断健康状态
上述健康检测涉及到pod的重启策略,pod中的几种重启策略:
1)Always:pod对象终止就进行重启
2)OnFailure:尽在pod出现错误时方才将其重启
3)Never:从不重启

pod的终止过程:
1)用户发送删除命令
2)API 服务器中国内地饿破洞对象随着时间的推移而更新,在宽限期内(30秒)pod被视为“dead”
3)将pod标记为“Terminating”状态
4)与第三步同步,kubelet监听到pod对象转为“Terminating”状态的同时开启pod关闭过程
5)与第三步同步,断点控制器(endpoint controller)监控到pod对象关闭时将其从所有匹配到此端点的server的端点列表中移除
6)如果当前pod对象定义了preStop钩子处理器,则在标记为“Terminating”后开始同步执行,若宽限期结束,仍未执行完毕,则获得一个2秒的宽限期,继续执行
7)pod对象中的容器进程收到TERM信号
8)宽限期结束后,若存在任何一个仍在运行的线程,发送SIGKILL信号
9)删除pod,对用户不可见
默认情况下,都会又一个30秒的宽限期,不过可以在kubectl命令中使用--grace-period=来定义时间长短,但此命令必须制定--force参数。

注:上述过程中很多地方用到了watch机制,涉及到client-go中的informer,建议查看以下该机制,参考链接:https://www.jianshu.com/p/1e2...

上面是就是创建pod的大致流程。

你可能感兴趣的:(kubernetes,生命周期)