如果K8S删除一个Pod会发生什么事情?
参考回答
当 Kubernetes 删除一个 Pod 时,系统会执行一系列步骤来确保容器的正确清理和资源释放。具体流程如下:
- 用户请求删除 Pod:用户通过
kubectl delete pod <pod-name>
或者某个控制器(如 Deployment)请求删除 Pod。 -
API 服务器更新状态:API 服务器接收到删除请求后,会标记 Pod 为删除状态,并将删除操作记录到 etcd 中。
-
调度器与 Kubelet 的响应:
- 如果 Pod 是由某个控制器(如 Deployment 或 StatefulSet)管理的,Kubernetes 会根据控制器的期望状态重新创建一个新的 Pod。
- 否则,Pod 将被标记为 “Terminating” 状态,Kubelet 开始执行清理工作。
- Kubelet 处理 Pod 删除:
- Kubelet 会通知容器运行时停止 Pod 中的容器,并尝试优雅地停止它们。
- 如果 Pod 配置了终止处理程序(如
preStop
钩子),Kubelet 会执行这些钩子,在容器真正停止之前执行清理操作。
- 资源释放:
- Kubelet 停止容器后,容器的资源(如 CPU、内存等)会被释放。网络和存储资源(如 PVC)会根据配置进行处理。
- 删除 Pod 的状态更新:当 Pod 的容器完全停止,Kubelet 会将 Pod 的状态更新为 “Terminated”,并通知 API 服务器删除该 Pod。
-
Pod 从集群中移除:最终,Pod 会从 API 服务器中删除,Pod 对应的资源也被彻底释放。
详细讲解与拓展
1. 用户请求删除 Pod
- 用户可以通过
kubectl
或 Kubernetes 控制器(如 Deployment、StatefulSet 等)请求删除一个 Pod。 - 如果是手动删除 Pod,
kubectl delete pod
会向 API 服务器发出删除请求。如果是通过控制器进行管理的 Pod,控制器会根据当前状态决定是否重新创建 Pod(例如,Deployment 会重新创建 Pod 以保持期望的副本数)。
2. API 服务器的响应
-
当 Pod 删除请求到达 API 服务器时,API 服务器首先会验证请求是否合法。然后,它会更新 etcd 中的 Pod 状态,将 Pod 标记为删除,并将状态设置为 “Terminating”。
-
在 API 服务器更新 Pod 的状态后,如果 Pod 是由控制器管理的(例如 Deployment 或 StatefulSet),控制器会通过其管理逻辑重新调度新的 Pod 来保持副本数一致。
3. 调度器与 Kubelet
-
对于普通的 Pod(不受控制器管理),Pod 会被直接删除。Kubelet 在定期轮询 API 服务器时,会检测到 Pod 处于 “Terminating” 状态,并开始进行删除操作。
-
Kubelet 会通过容器运行时(如 Docker 或 containerd)停止 Pod 中的容器。
4. 终止处理(PreStop 钩子)
- 如果在 Pod 中配置了 preStop 钩子,Kubernetes 会在容器停止之前执行钩子中的命令。例如,可以使用
preStop
钩子来通知应用进行清理操作(如关闭数据库连接、完成请求等),确保容器以一种优雅的方式退出,而不是突然被强制停止。
示例(preStop 钩子):
- 在执行完
preStop
钩子之后,Kubelet 会调用容器运行时来停止容器。
5. 容器停止与资源释放
- Kubelet 向容器运行时发出停止容器的命令,容器被强制终止。如果容器在优雅终止过程中没有在指定的时间内停止(即在
terminationGracePeriodSeconds
配置时间内没有停止),Kubernetes 会强制杀掉容器。 -
此时,容器的资源(如 CPU、内存)会被操作系统释放,存储资源(如挂载的 PVC)会根据配置被释放或继续存在。
6. Pod 状态更新与删除
-
当容器完全停止后,Kubelet 会将 Pod 的状态更新为 “Terminated”。
-
Kubelet 随后通知 API 服务器删除 Pod,API 服务器从 etcd 中移除该 Pod 的条目,Pod 的信息从集群中被彻底删除。
7. 资源释放与存储清理
- 网络资源:Kubernetes 会清理容器使用的网络资源,如 CNI 配置、IP 地址等。
- 存储资源:如果 Pod 使用了 PVC(持久卷声明),Kubernetes 会根据 PVC 的 ReclaimPolicy(如 Retain、Recycle 或 Delete)来决定是否删除相关的存储资源。
- Retain:保留数据。
- Delete:删除 PVC 绑定的 PV(持久卷)。
- Recycle:将卷回收并清理数据,适用于非生产环境。
组件之间的交互
- 用户请求删除:用户通过
kubectl delete pod
或控制器请求删除 Pod。 - API 服务器:API 服务器接收请求并更新 Pod 状态为 “Terminating”,存储到 etcd 中。
- Kubelet:Kubelet 定期检查 Pod 状态,发现 Pod 状态为 “Terminating” 后,开始执行容器停止和资源释放。
- 容器运行时:容器运行时(如 Docker)停止容器,释放相关资源。
- 状态更新:Kubelet 更新 Pod 状态为 “Terminated” 并通知 API 服务器删除 Pod。
- 资源清理:Kubernetes 清理网络资源和存储资源(如果需要)。
总结
Kubernetes 删除 Pod 的过程是一个多阶段的操作,涉及从用户发起请求到容器停止和资源清理的一系列步骤。整个过程的核心是通过与容器运行时、Kubelet 和 API 服务器的协作,确保容器能够优雅地终止,并且相关资源能够被清理和释放。