k8s 整体架构总览
本教程共 65 篇 · 第 4 篇 · 更新于 2026-08-14 · 约 12 分钟阅读
本节目标:建立起 k8s 的全局架构认知——它分成”控制平面”和”工作节点”两大块,各自装着哪些组件。
前面几章我们认识了 Pod、Node、Cluster。这一章把镜头拉远,看整个集群的”骨骼”长什么样。
4-1 两大平面:大脑和手脚
一个 Kubernetes 集群,从架构上只分两大部分:
- 控制平面(Control Plane):集群的大脑,负责做决策——调度、状态管理、对外接口。
- 工作节点(Node):真正干活的机器,负责把 Pod 跑起来。
你可以这样想:控制平面是工厂的总调度室,工作节点是一线车间。总调度室不下车间搬货,但它决定谁去哪、什么时候停、出了事怎么补。
Note生产环境里,控制平面通常跨多台机器部署,避免单点故障。你本地用 minikube 学习时,控制平面和工作节点挤在同一台机器上,那是为了省事。
4-2 控制平面里有什么
控制平面由几个核心组件组成,它们各管一摊:
- kube-apiserver:整个集群的唯一入口,所有操作都通过它。相当于前台兼总机。
- etcd:一个高可用的键值数据库,存着集群所有的状态。相当于集群的”账本”。
- kube-scheduler:调度器,负责把新来的 Pod 安排到合适的 Node 上。
- kube-controller-manager:一堆控制器的集合,负责让集群现状逼近期望状态。
- cloud-controller-manager:跟云厂商打交道的组件(本地学习环境没有它)。
这几个组件下一章会逐个细讲。这章你只要知道”它们都在控制平面里、各司其职”就够了。
4-3 工作节点上有什么
每个 Node 上固定跑着三样东西:
- kubelet:节点上的”驻场管家”,盯着本机的 Pod,确保它们按预期运行。
- kube-proxy:负责网络转发,让 Service 的流量能正确到达 Pod。
- 容器运行时(Container Runtime):真正拉起容器的软件,比如 containerd、CRI-O。
Warning注意术语:v1.24 之后 dockershim 已从 k8s 移除,k8s 不再直接对接 Docker。现在的标准做法是用符合 CRI 接口的运行时,如 containerd 或 CRI-O。很多旧教程还说”k8s 用 Docker 跑容器”,那已经是过时说法。
4-4 一次调度,发生了什么
光列组件太干,我们用一个真实场景串一遍。你敲下命令创建一个 Pod:
- 命令经
kubectl发给 kube-apiserver。 - apiserver 把”要建一个 Pod”这件事写进 etcd 账本。
- kube-scheduler 发现有个 Pod 还没分配 Node,根据资源、亲和性等规则挑一台合适的机器。
- 被选中的 Node 上的 kubelet 收到指令,请 容器运行时 把容器拉起来。
- kube-controller-manager 持续盯着:Pod 真的起来了没?数量对不对?不对就纠正。
- 用户的请求进来时,kube-proxy 负责把流量转到这个 Pod。
你看,一次简单的”建 Pod”,其实五大组件在背后接力完成。
Tip理解架构的关键不是背组件名,而是记住一句话:所有组件都围着 kube-apiserver 转,状态都记在 etcd 里。 任何组件想改集群,都得先过 apiserver 这一关。
4-5 组件怎么部署都行
官方文档特意强调:这些组件怎么摆,很灵活。
- 控制平面可以跑在普通机器上(systemd 服务)。
- 也可以以”静态 Pod”方式由 kubelet 管起来(kubeadm 就是这么干的)。
- 还可以让控制平面自己跑在集群里(自托管)。
- 云上的托管 k8s(如 GKE、EKS、ACK)则把控制平面藏起来,你只管用。
不管怎么摆,组件的职责不变。这是 k8s 架构”松耦合”的体现。
4-6 插件补足能力
光有核心组件,集群还缺一些便利功能,靠**插件(Addons)**补上。常见的有:
- DNS:集群内部的域名解析,很多功能依赖它。
- Dashboard:网页版管理界面。
- 监控与日志:收集容器指标和日志。
- 网络插件(CNI):给 Pod 分配 IP、打通 Pod 间通信。
插件本身也是用 k8s 资源(Deployment、DaemonSet)实现的,多住在 kube-system 这个命名空间里。
4-7 这章你该记住什么
合上眼,能在脑子里画出这个结构:
┌──────────── 控制平面 ────────────┐
│ apiserver etcd scheduler │
│ controller-manager (云相关另算) │
└──────────────────────────────────┘
│ 指挥
┌───────────┴────────────┐
Node 1 Node 2 ...
[kubelet kube-proxy 运行时] [kubelet kube-proxy 运行时]
└─ Pod ── Container └─ Pod ── Container
大脑管决策,手脚管执行,中间靠 apiserver 串起来。
4-8 控制平面怎么做到高可用
生产环境里,控制平面绝不能”一损俱损”。常见做法是把几个核心组件各跑多个副本:
- apiserver:无状态,可以横向扩多个,前面挡负载均衡器。
- etcd:本身就设计成奇数节点的分布式集群(3/5/7),靠投票保证一致。
- scheduler / controller-manager:同一时刻只允许一个”活跃”实例做决策,其余待命,通过选主(leader election)避免脑裂。
而工作节点通常也会多台部署。这样任意单台机器挂了,集群整体照常运转。这正体现了 k8s 架构”没有单点”的设计取向。
Note你本地用 minikube 起的集群,控制平面只有一份、且和节点合一,显然不是高可用。但这不妨碍你学概念——等真要上生产,kubeadm 或云托管都会帮你把高可用搭起来。
4-9 为什么是这种分层结构
k8s 把”决策”和”执行”彻底分开,好处很明显:
- 节点可以随便加、随便换,只要上面三件套在,就能加入集群。
- 控制平面集中管状态,节点只管干活,职责单一、好排查。
- 所有写操作都过 apiserver,审计、权限、准入都能统一卡一道。
这种”大脑—手脚”的清晰边界,是 k8s 能管成千上万台机器还不乱的根本原因。
下一章,我们把控制平面里的组件一个个拆开讲透。