- 用户发送删除 Pod 的命令 。
- 将会更新 API Server 中的 Pod 对象,设定 Pod 被”销毁“完成的大致时间(默认 30s),超出这个宽限时间 Pod 将被强制终止 。
- 同时触发以下操作:Pod 被标记为 Terminating 。kubelet 发现 Pod 已标记为 Terminating 后,将会执行 Pod 关闭过程 。Endpoint 控制器监控到 Pod 即将删除,将溢出所有 Service 对象中与该 Pod 相关的 Endpoint 。
- 如果 Pod 定义了 preStop 回调,则这会在 Pod 中执行,如果宽限时间到了 preStop 还在运行,则会通知 API Server增加少量宽限时间(2s) 。
- Pod 中的进程接收到 TERM 信号 。
- 如果宽限时间过期,Pod 中的进行仍在运行,则会被 SIGKILL 信号终止 。
- kubelet 通过 API Server 设置宽限时间为 0(立即删除),完成 Pod 的删除操作,Pod 从 API 中移除 。
Pod 的生命周期时间Pod 在整个运行过程中,会有两个大的阶段,第一阶段是初始化容器运行阶段,第二阶段是正式容器运行阶段,每个阶段都会有不同的事件
初始化容器运行阶段Pod 中可以包含一个或者多个初始化容器,这些容器是在应用程序容器正式运行之前运行的,主要负责一些初始化工作,所有初始化容器执行完后才能执行应用程序容器,因此初始化容器不能是长期运行的容器,而是执行完一定操作后就必须结束的 。如果是多个初始化容器,只能顺序执行,不能同时运行 。在应用程序容器开始前,所有初始化容器都必须正常结束 。
初始化容器执行失败时,如果 restartPolicy 是 OnFailure 或者 Always,那么会重复执行失败的初始化容器,直到成功;如果 restartPolicy 是 Never,则不会重启失败的初始化容器 。
下面我们举一个例子,在部署应用程序前,检测 db 是否就绪,并执行以下初始化脚本 。
apiVersion: v1kind: Podmetadata:name: expodinitcontainerspec:containers:- name: maincontainerimage: busyboxcommand: ['sh', '-c']args: ['echo "maincontainer is running!"; sleep 3600']initContainers:- name: initdbcheckimage: busyboxcommand: ['sh', '-c']args: ['echo "checking db!"; sleep 30; echo "checking done!"']- name: initscriptimage: busyboxcommand: ['sh', '-c']args: ['echo "init script exec!"; sleep 30; echo "init script exec done!"']
这里包含一个主容器,两个初始化容器,每个初始化容器执行 30s,接下来我们创建一下 Pod,再查看他们的状态:kubectl apply -f expodinitcontainers.yml
在 30s 内执行第一个初始化容器,所以 Pod 状态是 Init:0/2,在 30s-60s 之间执行第二个初始化容器,所以 Pod 状态是 Init:1/2,当所有初始化容器执行完毕后,状态会先变为 PodInitializing,然后变为 Running 状态 。通过 kubectl describe 命令查看 Pod 详细信息,可以看到先执行 initdbcheck,然后执行 initscript,最后才运行 maincontainer 。文章插图
正式容器运行阶段正式容器创建成功后,就会触发 PostStart 事件,在容器运行的过程中,可以设置存活探针和就绪探针来持续监测容器的健康状况,在容器结束前,会触发 PreStop 事件 。
- PostStart:容器刚创建成功后,触发此事件,如果回调执行失败,则容器会被终止,然后根据重启策略决定是否要重启该容器 。
- PreStop:容器开始和结束前,触发此事件,无论执行结果如何,都会结束容器 。
- Exec 回调会执行特定的命令,如果 Exec 执行的命令最后正常退出,则代表执行成功;否则就认为执行异常,配置方式如下:
postStart/preStop:exec:command: xxxxx# 命令列表
- HttpGet 回调会执行特定的 Http 请求,通过返回的状态码来判断该请求执行是否成功,配置方式如下:
postStart/preStop:httpGet:host: xxxx # 请求的 IP 地址或域名port: xx # 请求的端口号path: xxxxxx # 请求的路径,比如github.com/xingxingzaixian,"/xingxingzaixian"就是路径scheme: http/https # 请求的协议,默认为 HTTP
我们来举例使用一下 PostStart 和 PreStop 事件
推荐阅读
- 除了WIFI,你所不知道的低成本私有无线网络组网解决方案
- 老茶头是怎么形成的,老茶头是如何形成的呢
- 猴菇丁香沙棘茶的功效,猴头丁香沙棘茶的功效与作用
- 苦荞茶品牌排行,黑苦荞茶的价格
- 韭菜子泡茶的功效,刺五加叶茶的功效与作用
- 经常喝六安瓜片的好处,六安瓜片的功效与作用
- 荷叶茶的功效与作用,茉莉荷叶茶功效
- 好白茶的主要品种,白茶是什么茶品种
- 后起八大茶山现状简介,古六大茶山之革登茶山的地理渊源
- 花草蜜桃茶的做法,蜜桃果茶的做法