如果K8S删除一个Pod会发生什么事情?

参考回答

当 Kubernetes 删除一个 Pod 时,系统会执行一系列步骤来确保容器的正确清理和资源释放。具体流程如下:

  1. 用户请求删除 Pod:用户通过 kubectl delete pod <pod-name> 或者某个控制器(如 Deployment)请求删除 Pod。

  2. API 服务器更新状态:API 服务器接收到删除请求后,会标记 Pod 为删除状态,并将删除操作记录到 etcd 中。

  3. 调度器与 Kubelet 的响应

    • 如果 Pod 是由某个控制器(如 Deployment 或 StatefulSet)管理的,Kubernetes 会根据控制器的期望状态重新创建一个新的 Pod。
    • 否则,Pod 将被标记为 “Terminating” 状态,Kubelet 开始执行清理工作。
  4. Kubelet 处理 Pod 删除
    • Kubelet 会通知容器运行时停止 Pod 中的容器,并尝试优雅地停止它们。
    • 如果 Pod 配置了终止处理程序(如 preStop 钩子),Kubelet 会执行这些钩子,在容器真正停止之前执行清理操作。
  5. 资源释放
    • Kubelet 停止容器后,容器的资源(如 CPU、内存等)会被释放。网络和存储资源(如 PVC)会根据配置进行处理。
  6. 删除 Pod 的状态更新:当 Pod 的容器完全停止,Kubelet 会将 Pod 的状态更新为 “Terminated”,并通知 API 服务器删除该 Pod。

  7. 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 钩子)

lifecycle:
  preStop:
    exec:
      command: ["sh", "-c", "sleep 5"]
YAML
  • 在执行完 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:将卷回收并清理数据,适用于非生产环境。

组件之间的交互

  1. 用户请求删除:用户通过 kubectl delete pod 或控制器请求删除 Pod。
  2. API 服务器:API 服务器接收请求并更新 Pod 状态为 “Terminating”,存储到 etcd 中。
  3. Kubelet:Kubelet 定期检查 Pod 状态,发现 Pod 状态为 “Terminating” 后,开始执行容器停止和资源释放。
  4. 容器运行时:容器运行时(如 Docker)停止容器,释放相关资源。
  5. 状态更新:Kubelet 更新 Pod 状态为 “Terminated” 并通知 API 服务器删除 Pod。
  6. 资源清理:Kubernetes 清理网络资源和存储资源(如果需要)。

总结

Kubernetes 删除 Pod 的过程是一个多阶段的操作,涉及从用户发起请求到容器停止和资源清理的一系列步骤。整个过程的核心是通过与容器运行时、Kubelet 和 API 服务器的协作,确保容器能够优雅地终止,并且相关资源能够被清理和释放。

发表评论

后才能评论