pod 的创建过程
- 用户通过
kubectl客户端提交Pod Spec给API Server。 API Server尝试将Pod对象的相关信息存储到etcd中,等待写入操作完成,API Server返回确认信息到客户端。API Server开始反映etcd中的状态变化。- 所有的
Kubernetes组件通过"watch"机制跟踪检查API Server上的相关信息变动。 kube-scheduler(调度器)通过其"watcher"检测到API Server创建了新的Pod对象但是没有绑定到任何工作节点。kube-scheduler为Pod对象挑选一个工作节点并将结果信息更新到API Server。- 调度结果新消息由
API Server更新到etcd,并且API Server也开始反馈该Pod对象的调度结果。 Pod被调度到目标工作节点上的kubelet尝试在当前节点上调用docker engine进行启动容器,并将容器的状态结果返回到API Server。API Server将Pod信息存储到etcd系统中。- 在
etcd确认写入操作完成,API Server将确认信息发送到相关的kubelet。
pod 的终止过程
示例流程如下:
- 用户发送删除
pod的命令,默认宽限期是30秒; - 在
Pod超过该宽限期后,API server就会更新Pod的状态为"dead"; - 在客户端命令行上显示的
Pod状态为terminating;svc会从endpoint中移除该节点 - 跟第三步同时,当
kubelet发现pod被标记为"terminating"状态时,开始停止pod进程:
4.1. 如果在pod中定义了preStop hook,在停止pod前会被调用。如果在宽限期过后,preStop hook依然在运行,第二步会再增加2秒的宽限期;
4.2. 向Pod中的进程发送TERM信号; - 跟第三步同时,该
Pod将从该service的endponit列表中删除,不再是RS的一部分。关闭的慢的pod将继续处理load balancer转发的流量; - 过了宽限期后,将向
Pod中依然运行的进程发送SIGKILL信号而杀掉进程。 Kublete会在API server中完成Pod的删除,通过将优雅周期设置为0(立即删除)。Pod在API中消失,并且在客户端也不可见。
1 |
|
删除宽限期默认是30秒。 kubectl delete命令支持 --grace-period=<seconds> 选项,允许用户设置自己的宽限期
可以使用 --force --grace-period=0 来强制删除 pod。
Pod 的强制删除是通过在 cluster 和 etcd中将其定义为删除状态。当执行强制删除命令时,API server 不会等待该 pod 所运行在节点上的 kubelet 确认,就会立即将该 pod 从 API server中移除。这时,在节点上的 pod 会被立即设置为 terminating 状态,不过在被强制删除之前依然有一小段优雅删除周期。
1 | [root@k8s01 ~]# kubectl delete pod redis-master-0 --force --grace-period=0 |
如果删除一个 pod 后,再次查看发现 pod还在,这是因为在 控制器 文件中定义了 replicas, 还需要删除 控制器 才行