pod生命周期-创建与删除

pod 的创建过程

  1. 用户通过 kubectl 客户端提交 Pod SpecAPI Server
  2. API Server 尝试将 Pod 对象的相关信息存储到 etcd 中,等待写入操作完成,API Server 返回确认信息到客户端。
  3. API Server 开始反映 etcd 中的状态变化。
  4. 所有的 Kubernetes 组件通过"watch" 机制跟踪检查 API Server 上的相关信息变动。
  5. kube-scheduler(调度器)通过其 "watcher" 检测到 API Server 创建了新的 Pod 对象但是没有绑定到任何工作节点。
  6. kube-schedulerPod 对象挑选一个工作节点并将结果信息更新到 API Server
  7. 调度结果新消息由 API Server 更新到 etcd ,并且 API Server 也开始反馈该 Pod 对象的调度结果。
  8. Pod 被调度到目标工作节点上的 kubelet尝试在当前节点上调用 docker engine 进行启动容器,并将容器的状态结果返回到 API Server
  9. API ServerPod 信息存储到 etcd 系统中。
  10. etcd 确认写入操作完成,API Server 将确认信息发送到相关的 kubelet

pod 的终止过程

示例流程如下:

  1. 用户发送删除 pod 的命令,默认宽限期是 30 秒;
  2. Pod 超过该宽限期后, API server 就会更新 Pod 的状态为 "dead"
  3. 在客户端命令行上显示的 Pod 状态为 terminatingsvc 会从 endpoint 中移除该节点
  4. 跟第三步同时,当 kubelet 发现 pod 被标记为 "terminating" 状态时,开始停止 pod 进程:
    4.1. 如果在 pod中定义了 preStop hook,在停止 pod 前会被调用。如果在宽限期过后, preStop hook 依然在运行,第二步会再增加 2 秒的宽限期;
    4.2. 向 Pod 中的进程发送TERM信号;
  5. 跟第三步同时,该 Pod 将从该 serviceendponit 列表中删除,不再是 RS 的一部分。关闭的慢的 pod 将继续处理 load balancer 转发的流量;
  6. 过了宽限期后,将向 Pod 中依然运行的进程发送 SIGKILL信号而杀掉进程。
  7. Kublete 会在 API server 中完成 Pod 的删除,通过将优雅周期设置为 0(立即删除)。 PodAPI 中消失,并且在客户端也不可见。
1
2

spec.terminationGracePeriodSeconds: 30 # 此字段

删除宽限期默认是30秒。 kubectl delete命令支持 --grace-period=<seconds> 选项,允许用户设置自己的宽限期

可以使用 --force --grace-period=0 来强制删除 pod

Pod 的强制删除是通过在 clusteretcd中将其定义为删除状态。当执行强制删除命令时,API server 不会等待该 pod 所运行在节点上的 kubelet 确认,就会立即将该 podAPI server中移除。这时,在节点上的 pod 会被立即设置为 terminating 状态,不过在被强制删除之前依然有一小段优雅删除周期。

1
2
3
[root@k8s01 ~]# kubectl delete pod redis-master-0 --force --grace-period=0
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "redis-master-0" deleted

如果删除一个 pod 后,再次查看发现 pod还在,这是因为在 控制器 文件中定义了 replicas, 还需要删除 控制器 才行