k8s系列之三 pod的创建与删除过程

一、pod的创建

pod资源创建过程:

 

1)用户通过kubectl或其他API客户端提交Pod Spec给API Server。
2)API Server尝试着将Pod对象的相关信息存入etcd中,待写入操作执行完成,API Server即会返回确认信息至客户端。
3)Scheduler(调度器)通过其watcher监测到API Server创建了新的Pod对象,于是为该Pod对象挑选一个工作节点并将结果信息更新至API Server。
4)调度结果信息由API Server更新至etcd存储系统,并同步给Scheduler。
5)相应节点的kubelet监测到由调度器绑定于本节点的Pod后会读取其配置信息,并由本地容器运行时创建相应的容器启动Pod对象后将结果回存至API Server。
6)API Server将kubelet发来的Pod状态信息存入etcd系统,并将确认信息发送至相应的kubelet。

二、pod的删除

用户提交请求后系统即会进行强制删除操作的宽限期倒计时,并将TERM信号发送给Pod对象中每个容器的主进程。

宽限期倒计时结束后,这些进程将收到强制终止的KILL信号,Pod对象也随即由APIServer删除。

如果在等待进程终止的过程中kubelet或容器管理器发生了重启,则终止操作会重新获得一个满额的删除宽限期并重新执行删除操作。

pod资源删除过程:

 

1)用户发送删除Pod对象的命令。
2)API服务器中的Pod对象会随着时间的推移而更新,在宽限期内(默认为30秒),Pod被视为dead。
3)将Pod标记为Terminating状态。
4)(与第3步同时运行)kubelet在监控到Pod对象转为Terminating状态的同时启动Pod关闭过程。
5)(与第3步同时运行)端点控制器监控到Pod对象的关闭行为时将其从所有匹配到此端点的Service资源的端点列表中移除。
6)如果当前Pod对象定义了preStop钩子句柄,在其标记为terminating后即会以同步方式启动执行;如若宽限期结束后,preStop仍未执行完,则重新执行第2步并额外获取一个时长为2秒的小宽限期。
7)Pod对象中的容器进程收到TERM信号。
8)宽限期结束后,若存在任何一个仍在运行的进程,Pod对象即会收到SIGKILL信号。
9)Kubelet请求API Server将此Pod资源的宽限期设置为0从而完成删除操作,它变得对用户不再可见。
默认情况下,所有删除操作的宽限期都是30秒,不过kubectl delete命令可以使用--grace-period=<seconds>选项自定义其时长,使用0值则表示直接强制删除指定的资源,不过此时需要同时为命令使用--force选项。

 

在某些极端情况下,Pod 被删除的一小段时间内,仍然可能有新连接被转发过来,因为 kubelet 与 kube-proxy 同时 watch 到 pod 被删除,kubelet 有可能在 kube-proxy 同步完规则前就已经停止容器了,这时可能导致一些新的连接被转发到正在删除的 Pod,而通常情况下,当应用受到 SIGTERM 后都不再接受新连接,只保持存量连接继续处理,所以就可能导致 Pod 删除的瞬间部分请求失败。这种情况,可以利用 preStop 先 sleep  5s,等待 kube-proxy 完成规则同步再开始停止容器内进程。

posted @ 2022-04-30 12:11  划水的猫  阅读(1456)  评论(0编辑  收藏  举报