Kubernetes Pod的创建和销毁过程

一、什么是Kubernetes?

Kubernetes(常简称为K8s)是用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。该系统由Google设计并捐赠给Cloud Native Computing Foundation(今属Linux基金会)来使用。它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具,包括Docker等。

二、Pod创建过程

Kubernetes 中的 Pod 是最小的调度单元,通常用于运行一个或多个容器。Pod 的创建和销毁是 Kubernetes 集群中重要的操作,涉及到多个组件的交互和状态变更。下面是对 Pod 创建 和 Pod 销毁 过程的详细描述。

  1. 用户提交请求(通过kubectl或API)

    • 用户通过 kubectl 或者直接通过 Kubernetes API 提交创建 Pod 的请求。这通常是通过 kubectl run、kubectl apply 等命令,或者通过编写一个 YAML 文件描述 Pod 的配置并将其提交到集群。
    • 请求包含 Pod 的配置,通常包括容器的镜像、资源限制、环境变量、卷、端口等信息。
  2. APIServer处理请求

    • Kubernetes 的 API Server 是整个集群的接口,处理所有的 HTTP 请求。收到 Pod 创建请求后,API Server 会对请求进行验证和授权(基于 RBAC 和其他策略):
      • 验证:检查请求是否符合 Kubernetes 的 API 规范(例如,Pod 配置的语法、字段是否正确等);
      • 授权:确保发起请求的用户有足够的权限来创建 Pod。
    • 如果请求通过验证和授权,API Server 会将 Pod 配置保存到 Etcd 中。Etcd 是一个强一致性的数据库,用于存储 Kubernetes 集群的所有状态信息。
  3. 调度器选择节点(Scheduler)

    • Kubernetes Scheduler 会监控 Etcd 中的 Pod 状态,并选择适合的节点来运行该 Pod。调度器会根据以下因素做出决策:
      • 资源请求:Pod 请求的 CPU 和内存资源。
      • 节点资源:节点的当前负载和可用资源。
      • 亲和性/反亲和性:Pod 对节点的亲和性或反亲和性规则(例如:某些 Pod 必须一起运行,或者不能与其他 Pod 一起运行)。
      • 污点和容忍:节点是否有污点,并且 Pod 是否容忍这些污点。
    • 调度器选择的节点会更新 Pod 的配置,指定该 Pod 将运行在选定的节点上。
  4. Kubelet启动容器

    • Kubelet 是每个节点上的代理,它负责确保容器在节点上运行。当调度器确定 Pod 将运行在某个节点上时,Kubelet 会接收到该节点上 Pod 的信息。
    • Kubelet 会根据 Pod 配置启动容器,确保容器按预期启动。它会:
      • 下载所需的容器镜像(如果镜像不存在于节点上)。
      • 根据 Pod 配置启动容器。
      • 如果使用了卷,Kubelet 会挂载相应的存储资源到容器中。
    • Kubelet 启动容器后,容器运行的状态会定期报告给 API Server,确保 Pod 的状态是健康的。
  5. 服务发现和网络配置

    • Kube Proxy 会为 Pod 配置网络规则,确保服务能够找到这个 Pod。如果 Pod 是通过 Service 暴露的,Kube Proxy 会更新 Service 的后端列表,包含新创建的 Pod。
    • Kubernetes 的 DNS 服务会为 Pod 分配一个 DNS 名称,使其可以通过 DNS 解析访问。
  6. Pod 状态更新

    • 在 Pod 被成功调度并启动后,Kubernetes API Server 会将 Pod 的状态更新为 Running,并将状态信息保存在 Etcd 中。Pod 的 IP 地址和其他元数据也会在这个阶段更新。

三、Pod 销毁过程

  1. 用户或控制器发起删除请求

    • Pod 的销毁通常由用户通过 kubectl delete pod <pod_name> 命令,或者由控制器(如 Deployment、StatefulSet 等)发起。
    • 当控制器的期望状态与实际状态不一致时,控制器会发起删除 Pod 的请求。比如,Deployment 中的 Pod 副本数发生变化时,控制器会删除不需要的 Pod。
  2. APIServer处理删除请求

    • API Server 接收到删除请求后,首先会验证请求的合法性。
    • API Server 会将删除请求的状态保存到 Etcd 中,更新 Pod 的状态为 Terminating。
  3. Kubelet停止容器

    • Kubelet 发现 Pod 被标记为 Terminating 后,会启动容器的终止过程。Kubelet 会:
      • 发送终止信号(如 SIGTERM)给 Pod 中的容器。
      • 等待一定的时间(Grace Period),允许容器优雅地关闭。
      • 如果容器没有在规定时间内退出,Kubelet 会发送强制终止信号(如 SIGKILL)。
  4. 清理容器资源

    • Kubelet 会清理容器和与 Pod 相关的资源,例如:
      • 删除容器的运行时资源。
      • 如果 Pod 使用了卷,Kubelet 会释放和卸载卷资源。
      • 删除容器网络设置。
  5. Kubernetes 集群状态更新

    • Kubernetes API Server 会更新 Pod 的状态为 Deleted,并从 Etcd 中删除 Pod 的相关数据。
    • 如果 Pod 是由控制器(如 Deployment)管理的,控制器会根据新的状态启动新的 Pod,以维持期望的副本数。
  6. 清理网络资源

    • Kube Proxy 会更新服务的后端列表,移除已删除 Pod 的 IP 地址,确保流量不再路由到该 Pod。

四、总结

  • Pod 创建过程:从用户提交请求到 API Server,再到调度器选择节点,Kubelet 启动容器,最后更新状态并暴露服务。
  • Pod 销毁过程:从用户或控制器发起删除请求,到 API Server 标记 Pod 为 Terminating,Kubelet 优雅地终止容器,最终清理资源并更新状态。
    整个过程依赖 Kubernetes 的多个组件(如 API Server、Scheduler、Kubelet、Kube Proxy 等)协同工作,确保 Pod 的创建和销毁是自动化、高效且一致的。

参考资料

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇