Kubernetes Pod/Deployment 删除流程图
下面是 Kubernetes 中删除 Pod 或 Deployment 的完整流程序列图:
Kubernetes Pod/Deployment 删除流程详解
下面是我生成的删除 Pod/Deployment 流程图中每个步骤的详细解释:
1. 用户 → Kubectl: 发起删除请求 (kubectl delete)
- 含义:用户通过命令行发起资源删除操作
- 具体操作:如
kubectl delete pod my-pod
或kubectl delete deployment my-app
- 选项:可以包含
--grace-period
、--force
或--cascade
等参数调整删除行为
2. Kubectl → API Server: 发送删除API请求
- 含义:kubectl将用户删除命令转化为API调用
- 具体操作:发送DELETE请求到API Server对应端点
- API路径:例如
/api/v1/namespaces/{namespace}/pods/{name}
- 参数传递:将删除选项作为查询参数传递
3. API Server → API Server: 添加删除时间戳(deletionTimestamp)
- 含义:API Server将资源标记为正在删除,而非立即物理删除
- 具体操作:在资源元数据中添加
metadata.deletionTimestamp
字段 - 作用:让系统知道该资源已请求删除,但清理工作尚未完成
4. API Server → API Server: 设置finalizers(如有)
- 含义:保留或添加finalizers,防止资源被过早删除
- 具体操作:确保
metadata.finalizers
数组包含所需的finalizer标记 - 作用:确保所有必要的清理工作完成后才真正删除资源
5. API Server → etcd: 更新资源状态为"正在删除"
- 含义:将修改后的资源(带删除时间戳)持久化
- 具体操作:更新etcd中对应键值
- 状态变化:资源仍然存在,但带有删除标记
6. API Server → Controller Manager: 通知资源正在删除
- 含义:删除事件通过watch机制传递给控制器
- 具体操作:Controller Manager接收到资源更新事件
- 处理方式:相关控制器(如DeploymentController)开始处理删除逻辑
7. Controller Manager → Controller Manager: 检查删除策略
- 含义:确定如何处理资源层级关系
- 具体操作:检查
DeleteOptions.PropagationPolicy
- 策略类型:
Foreground
:先删除子资源,再删除父资源Background
:异步删除子资源(默认)Orphan
:不删除子资源,只删除父资源
8. Controller Manager → API Server: 删除所属的子资源
- 含义:级联删除子资源(如ReplicaSet和Pod)
- 具体操作:发送DELETE请求给这些子资源
- 处理顺序:通常是从最高层向下删除(Deployment→ReplicaSet→Pod)
9. API Server → Kubelet: 通知节点上的Pod被标记删除
- 含义:Pod所在节点的Kubelet收到Pod删除事件
- 具体操作:通过watch机制接收Pod更新(包含deletionTimestamp)
- 触发时机:当Pod被标记删除时
10. Kubelet → Kubelet: 执行Pod终止流程
- 含义:Kubelet开始协调Pod删除过程
- 具体操作:按顺序执行终止任务,确保有序清理
11. Kubelet → Kubelet: 执行preStop钩子(如有)
- 含义:在发送终止信号前执行Pod中定义的preStop钩子
- 具体操作:运行容器中配置的preStop命令或HTTP请求
- 目的:允许应用程序优雅关闭(如关闭连接、保存状态)
12. Kubelet → CRI: 发送终止信号(SIGTERM)
- 含义:请求容器内进程优雅终止
- 具体操作:通过CRI向容器发送SIGTERM信号
- 期望行为:应用程序捕获信号并执行清理操作后退出
13. 等待优雅终止期
- 含义:给容器内进程时间来处理SIGTERM信号
- 具体操作:等待默认30秒(或自定义时间)
- 可配置:通过Pod spec的
terminationGracePeriodSeconds
设置
14. Kubelet → CRI: 发送强制终止信号(SIGKILL)
- 含义:如果容器未在优雅终止期内退出,强制终止
- 具体操作:发送SIGKILL信号,不可被捕获或忽略
- 结果:立即终止容器进程,不执行任何清理
15. Kubelet → CRI: 删除容器
- 含义:移除容器实例
- 具体操作:通过CRI接口调用运行时删除容器
- 清理内容:容器文件系统、元数据等
16. Kubelet → CNI: 清理网络资源
- 含义:释放Pod的网络资源
- 具体操作:调用CNI插件的DEL命令
- 清理内容:IP地址、路由、网络命名空间等
17. Kubelet → CSI: 卸载并清理存储卷
- 含义:解除卷挂载并清理本地卷资源
- 具体操作:卸载文件系统,调用CSI接口
- 注意:持久卷本身不会被删除,只解除与Pod的关联
18. Kubelet → API Server: 移除Pod finalizers
- 含义:标记Pod资源可以被物理删除
- 具体操作:更新Pod移除
kubernetes.io/pvc-protection
等finalizers - 结果:移除阻止Pod物理删除的保护机制
19. Kubelet → API Server: 报告Pod已终止
- 含义:通知API Server Pod已完全终止
- 具体操作:更新Pod状态为Terminated
- 作用:触发后续清理流程
20. API Server → etcd: 从etcd中物理删除Pod数据
- 含义:当所有finalizers被移除后,真正删除资源数据
- 具体操作:从etcd中删除对应键值
- 结果:Pod资源彻底从系统中移除
21. Controller Manager → API Server: 检查所有子资源是否已删除
- 含义:对于高级资源,确认所有子资源已经清理完毕
- 具体操作:检查是否存在ownerReferences指向该资源的对象
- 作用:确保不留下任何"孤儿"资源
22. Controller Manager → API Server: 移除资源finalizers
- 含义:标记高级资源(如Deployment)可以被物理删除
- 具体操作:移除资源上的所有finalizers
- 结果:允许资源最终被物理删除
23. API Server → etcd: 从etcd中物理删除资源数据
- 含义:彻底删除高级资源的所有数据
- 具体操作:从etcd中删除对应键值
- 结果:资源完全从系统中移除
24. API Server → Kubectl: 返回删除完成状态
- 含义:向客户端通知删除操作已完成
- 具体操作:返回成功状态码和响应
- 内容:可能包含删除资源的最终状态
25. Kubectl → User: 显示资源已被删除
- 含义:向用户显示操作结果
- 具体操作:通常显示"xxx deleted"消息
- 额外信息:可能包含删除的资源名称和类型
这个删除流程展示了Kubernetes如何通过一系列协调步骤,确保资源被安全、有序地清理,同时保持系统的一致性和可靠性。
删除流程关键点解释
-
删除请求初始化
- 用户发起
kubectl delete
命令 - API Server 不会立即物理删除资源,而是先标记删除
- 用户发起
-
级联删除处理
- 资源会根据
propagationPolicy
决定删除行为 Foreground
: 先删除子资源,再删除父资源Background
: 异步删除子资源(默认行为)Orphan
: 只删除父资源,保留子资源
- 资源会根据
-
Finalizers 和保护机制
- Finalizers 阻止资源被立即删除,确保清理工作完成
- 例如
kubernetes.io/pv-protection
保护正在使用的卷
-
Pod 终止流程
- 执行 preStop 钩子
- 发送 SIGTERM 并等待优雅终止期
- 如必要,发送 SIGKILL 强制终止
- 清理网络和存储资源
-
删除确认
- 所有 finalizers 清除后,资源才会从 etcd 中物理删除
- 控制器确认所有依赖资源已清理
这个流程展示了 Kubernetes 在资源删除过程中如何确保有序、可控和完整的清理,防止出现孤立资源和资源泄漏。