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


理解Pod的生命周期前,我们来看一下Pod的创建过程,流程大致如下图:

client向APIServer发送创建pod的请求:

APIServer收到创建pod的请求后:

Scheduler监听到APIServer创建pod的事件后:
kubelet监听到APIServer创建pod的事件后,通知容器运行时dockerd拉取镜像,创建容器,启动容器。

pod中容器的启动过程:
InitC容器:
多个initC顺序启动,前一个启动成功后才启动下一个;
仅当最后一个initC执行完毕后,才会启动主容器;
常用于进行初始化操作或等待依赖的服务已ok;
postStart钩子:
postStart与container的主进程并行执行;
在postStart执行完毕前,容器一直是waiting状态,pod一直是pending状态;
若postStart运行失败,容器会被杀死;
startupProbe钩子:
v1.16版本后新增的探测方式;
若配置了startupProbe,就会先禁止其他探测,直到成功为止;
readinessProbe探针:
探测容器状态是否ready,准备好接收用户流量;
探测成功后,将pod的endpoint添加到service;
livenessProbe探针:
探测容器的健康状态,若探测失败,则按照重启策略进行重启;
containers:
多个container之间是顺序启动的

默认情况下,所有删除操作的宽限期都是30秒,不过, kubectl delete 命令可以使用参数 --grance-period= 来自定义其时长,若使用 0 值表示直接强制删除指定的资源,不过,此时需要为命令配合参数 --force选项才可以。
APIServer接收到删除Pod的请求后:
首先,修改etcd中的状态;
然后,把删除pod的事件,通知给kubelet和endpoint-controller;
kubelet: 负责pod资源的删除;
endpoint-controller: 负责endpoint资源的删除;
两个组件并行执行;

kubelet关闭pod的时候,会关闭pod中的每一个容器;kubelet给容器一定的时间(TerminationGracePeriod)优雅的停止。
kubelet终止容器的过程:
执行preStop,等待它执行完毕;
向容器的进程发送SIGTERM;
等待容器优雅的关闭或超时(terminationGracePeriod);
若关闭超时,则发送SIGKILL强制关闭;

endpoint-controller接收到pod删除的通知时,向APIServer发送请求,修改svc的endpoints对象,从pod所在svc中删除该pod的endpoint。
然后,APIServer通知节点上的kube-proxy组件,kube-proxy会修改本机的iptables/ipvs规则,将该endpoint移除。
kube-proxy可能由于过载处理请求变慢,会出现:
kubelet已经把容器删除,但kube-proxy还未更新iptables。
这种情况下,流量还会被分发到对应的endpoint,但是pod已删除,客户端返回"连接拒绝"之类的错误。
目前的解决方法,在pod的preStop中sleep一段时间,等待kube-proxy更新iptables完毕:
lifecycle:
preStop:
exec:
command: [ "sh", "-c", "sleep 10" ]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。