Kubernetes Pod/Deployment 删除流程图

下面是 Kubernetes 中删除 Pod 或 Deployment 的完整流程序列图:

容器存储接口 容器网络接口 容器运行时 Kubelet etcd Controller Manager API Server Kubectl 用户 容器存储接口 容器网络接口 容器运行时 Kubelet etcd Controller Manager API Server Kubectl 用户 alt [级联删除(默认)] alt [如果是Deployment等高级资源] 等待优雅终止期(默认30秒) alt [容器未在终止期内退出] alt [如果是高级资源] 发起删除请求 (kubectl delete) 发送删除API请求 添加删除时间戳(deletionTimestamp) 设置finalizers(如有) 更新资源状态为"正在删除" 通知资源正在删除 检查删除策略(级联/非级联) 删除所属的子资源(如ReplicaSet) 更新子资源为"正在删除" 删除所属的Pod 更新Pod为"正在删除" 通知节点上的Pod被标记删除 执行Pod终止流程 执行preStop钩子(如有) 发送终止信号(SIGTERM) 发送强制终止信号(SIGKILL) 删除容器 清理网络资源 卸载并清理存储卷 移除Pod finalizers(如有) 报告Pod已终止 从etcd中物理删除Pod数据 检查所有子资源是否已删除 移除资源finalizers 从etcd中物理删除资源数据 返回删除完成状态 显示资源已被删除

Kubernetes Pod/Deployment 删除流程详解

下面是我生成的删除 Pod/Deployment 流程图中每个步骤的详细解释:

1. 用户 → Kubectl: 发起删除请求 (kubectl delete)

  • 含义:用户通过命令行发起资源删除操作
  • 具体操作:如kubectl delete pod my-podkubectl 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如何通过一系列协调步骤,确保资源被安全、有序地清理,同时保持系统的一致性和可靠性。

删除流程关键点解释

  1. 删除请求初始化

    • 用户发起 kubectl delete 命令
    • API Server 不会立即物理删除资源,而是先标记删除
  2. 级联删除处理

    • 资源会根据 propagationPolicy 决定删除行为
    • Foreground: 先删除子资源,再删除父资源
    • Background: 异步删除子资源(默认行为)
    • Orphan: 只删除父资源,保留子资源
  3. Finalizers 和保护机制

    • Finalizers 阻止资源被立即删除,确保清理工作完成
    • 例如 kubernetes.io/pv-protection 保护正在使用的卷
  4. Pod 终止流程

    • 执行 preStop 钩子
    • 发送 SIGTERM 并等待优雅终止期
    • 如必要,发送 SIGKILL 强制终止
    • 清理网络和存储资源
  5. 删除确认

    • 所有 finalizers 清除后,资源才会从 etcd 中物理删除
    • 控制器确认所有依赖资源已清理

这个流程展示了 Kubernetes 在资源删除过程中如何确保有序、可控和完整的清理,防止出现孤立资源和资源泄漏。