在学习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个阶段的“你来我往”。
- User & API Server: “创建Deployment!” → 记录 💾
- Controller: “那我就创建RS,并生成Pod数据。” ⚙️
- Scheduler: “这个Pod Node 2最合适。分配!” ⚖️
- Kubelet (Node): “哦?是我的任务?用CNI铺路,用CRI启动容器!” 🚀
这张图包含了JSON, gRPC, Protobuf等通信方式,以及CNI, CRI, OCI等标准接口。这充分说明了Kubernetes是一个多么系统化和模块化的系统。
现在,当你输入kubectl create时,请回想一下这些众多组件的辛勤工作吧!😉
发表回复