Kubernetes 中 Pod 删除的详细流程
在 Kubernetes(简称 K8s)中,删除一个 Pod 是一个多阶段的过程,涉及多个组件的协同工作。以下是 Pod 删除过程中发生的主要事件:
1. 发出删除命令
- 用户通过命令行工具或 API 接口发出删除请求,例如:
kubectl delete pod <pod-name>
- 删除命令也可以通过控制器(如 Deployment 或 StatefulSet)间接触发,控制器会根据其管理逻辑调整 Pod 的数量。
2. API Server 响应
- Kubernetes API Server 接收到删除请求后,会:
- 验证用户权限,确保请求合法。
- 将指定的 Pod 标记为 Terminating 状态。
- 在 Pod 的元数据中添加删除时间戳(
deletionTimestamp
),用于触发后续操作。
3. 清理资源
在 Pod 进入 Terminating 状态后,多个清理操作开始执行:
-
控制器的响应:
- 如果 Pod 是由控制器(如 Deployment 或 StatefulSet)管理的,控制器会检测到 Pod 被删除,立即启动新的 Pod 以保持期望的副本数。
-
生命周期钩子:
- kubelet 检测到 Pod 状态变化后,会调用定义的生命周期钩子函数,如 preStop Hook。
这一过程为容器提供了一个优雅的终止机会,可用于执行以下任务:- 保存数据或日志。
- 通知其他服务当前实例即将关闭。
- 关闭连接或释放资源。
- kubelet 检测到 Pod 状态变化后,会调用定义的生命周期钩子函数,如 preStop Hook。
-
终止容器:
- kubelet 与容器运行时(如 Docker、containerd)协作,按照以下顺序终止容器:
- 首先向容器发送
SIGTERM
信号,触发正常终止流程。 - 如果容器在设定的宽限时间(默认 30 秒,可通过
terminationGracePeriodSeconds
配置)内未完成终止,kubelet 将发送SIGKILL
信号强制终止容器。
- 首先向容器发送
- 一旦容器终止,kubelet 释放 Pod 在节点上的所有资源,包括:
- CPU 和内存分配。
- 磁盘存储和临时数据。
- 网络端口及连接。
- kubelet 与容器运行时(如 Docker、containerd)协作,按照以下顺序终止容器:
4. 垃圾回收
-
容器数据清理:
- kubelet 会清理已终止容器的所有本地数据,包括镜像缓存、日志文件和运行时产生的临时文件。
-
持久化卷(PV)处理:
- 如果 Pod 使用了 PersistentVolume(PV),卷的内容通常不会因 Pod 删除而丢失。
- 卷的回收策略决定了数据的最终处理方式:
Retain
:保留数据以供后续使用。Delete
:删除卷及其数据。Recycle
:清理卷内容以供重新分配。
5. 从 etcd 中删除记录
- 当 kubelet 完成所有清理操作后,Kubernetes API Server 会将 Pod 的状态从 etcd 中移除。
- etcd 是 Kubernetes 的分布式存储系统,记录集群的所有状态信息。
6. 更新集群状态
-
控制器调整:
- Deployment 或 StatefulSet 等控制器会检测到 Pod 的减少,并根据定义的副本数启动新的 Pod。
- 对于非控制器管理的 Pod(如独立 Pod),则不会有自动替换。
-
负载均衡更新:
- 如果 Pod 与 Service 关联,Service 的 Endpoints 列表会自动更新,移除已删除 Pod 的 IP。
- 负载均衡器会重新配置,确保流量只分发到健康的 Pod。
总结
在 Kubernetes 中,删除一个 Pod 是一个细致的流程,目的是在释放资源的同时,尽可能保证服务的连续性。关键步骤包括:
- 发出删除请求并标记 Pod 为
Terminating
。 - 调用生命周期钩子和清理资源。
- 终止容器,释放节点资源。
- 控制器和负载均衡器调整,确保集群状态与期望一致。
通过以上机制,Kubernetes 实现了优雅的 Pod 删除过程和资源管理。
标签:容器,控制器,删除,Kubernetes,kubelet,Pod,过程 From: https://www.cnblogs.com/leojazz/p/18686410