[Kubernetes架构] 用户创建Deployment时内部发生了什么?

在学习Kubernetes时,你一定会产生这样的疑问:“我只是输入了kubectl create deployment命令,我的容器到底是如何准确地出现在特定节点上的呢?”

今天,我们将通过Kubernetes架构图,非常详细地剖析从用户请求,经过Master(Control Plane),到在Node(Worker Node)上实际创建容器的整个过程。🕵️‍♂️✨

https://kubernetes.io/blog/2018/07/18/11-ways-not-to-get-hacked/


1. Master区域:接收命令并绘制蓝图 🧠

整个旅程始于用户的键盘,并指向Master节点上的API Server。

1️⃣ 用户请求 (User → API Server)

  • Action: 用户通过kubectl命令或UI请求创建Deployment。
  • Protocol: 此时,请求以JSON格式的HTTP通信方式发送到API Server。(图中蓝色箭头 🟦)
  • Role: API Server是Kubernetes集群的“大门”,也是所有组件的中心。

2️⃣ 信息存储 (API Server ↔ etcd)

  • Action: API Server验证请求的有效性后,将此信息存储到etcd中。
  • Role: etcd是一个Key-Value存储,用于存储集群的所有数据,也是SSOT(Single Source of Truth)。现在,Deployment已记录在集群的“期望状态(Desired State)”中。

3️⃣ 控制器的设计 (Controller Manager)

现在轮到Controller Manager忙碌起来了。(图中紫色箭头 🟪)

  • Deployment Controller: 检测到新的Deployment信息,并向API Server请求创建相应的ReplicaSet(RS)。
  • ReplicaSet Controller: 检测到已创建的RS,并请求创建与配置的副本数(Replicas)相等的Pod对象。
  • Point: ⚠️ 重要!此时创建的Pod信息仅仅是一个处于Pending状态的数据块,其中“将去哪个节点(nodeName)”仍然是空的。

4️⃣ 调度 (Scheduler)

  • Action: Scheduler发现没有nodeName的“孤独”Pod。(图中紫色箭头 🟪)
  • Logic: 它检查节点们的资源状态(过滤),并选出最合适的节点(评分)。例如,假设“Node 2”被选中。
  • Binding: 调度器将“这个Pod去Node 2!”的绑定信息更新到API Server。

2. Node区域:将蓝图变为现实 🏗️

现在舞台转移到实际工作负载将运行的Node(Worker Node)。

5️⃣ Kubelet接收任务 (API Server → Kubelet)

  • Action: 作为每个节点的“船长”,Kubelet定期与API Server通信,检查(Watch)是否有分配给它负责(Node 2)的Pod。
  • Protocol: 这种通信主要使用Protobuf (gRPC)以提高效率。(图中紫色箭头 🟪)
  • Kubelet确认新的Pod分配信息后,便开始实际的创建工作。

6️⃣ 铺设网络道路 (Kubelet ↔ CNI)

即使容器创建了,如果无法通信也毫无用处,对吧?首先打通网络。

  • Interface: Kubelet通过CNI(Container Network Interface)调用网络插件。(图中天蓝色箭头 🟦)
  • Result: Pod被分配IP,并配置了可通信的网络环境。

7️⃣ 容器执行请求 (Kubelet ↔ CRI)

网络准备就绪,现在是创建实际容器的时候了。

  • Interface: Kubelet通过CRI(Container Runtime Interface)向容器运行时(Containerd, CRI-O等)发出命令。
  • Protocol: 这个过程通过gRPC通信完成。(图中绿色箭头 🟩)

8️⃣ 在OS上执行进程 (Runtime ↔ OCI ↔ OS)

  • Action: 接收到请求的Container Runtime拉取镜像(Pull),并根据OCI(Open Container Initiative)标准与Linux内核(OS)进行通信。(图中黄色箭头 🟨)
  • Final: 终于,我们请求的应用程序(Container)在隔离环境中运行起来了!🎉

📝 总结:一目了然的流程!

这个看似复杂的过程实际上是4个阶段的“你来我往”。

  1. User & API Server: “创建Deployment!” → 记录 💾
  2. Controller: “那我就创建RS,并生成Pod数据。” ⚙️
  3. Scheduler: “这个Pod Node 2最合适。分配!” ⚖️
  4. Kubelet (Node): “哦?是我的任务?用CNI铺路,用CRI启动容器!” 🚀

这张图包含了JSON, gRPC, Protobuf等通信方式,以及CNI, CRI, OCI等标准接口。这充分说明了Kubernetes是一个多么系统化和模块化的系统。

现在,当你输入kubectl create时,请回想一下这些众多组件的辛勤工作吧!😉



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注