Kubernetes 架构与组件

Kubernetes 采用"控制面 + 工作节点"的主从架构:控制面是集群的大脑,负责决策与状态存储;工作节点是手脚,真正运行你的容器。看懂这套分工,故障时才知道该去检查哪个组件。

总体架构图

K8s 集群架构:控制面与数据面

┌──────────────────── 控制面 Control Plane ────────────────────┐
│  kube-apiserver ◄─ 所有读写都经过的唯一 API 入口             │
│  kube-scheduler      kube-controller-manager                 │
│        └────────────── etcd(状态存储) ──────────────────┘ │
└───────────────────────────┬──────────────────────────────────┘
                            │ 调度与指令下发
┌───────────────────────────▼──────────────────────────────────┐
│ 工作节点 node-1                    工作节点 node-2           │
│ kubelet + kube-proxy + 容器运行时     (同样的三件套)         │
└──────────────────────────────────────────────────────────────┘

控制面组件

组件职责备注
kube-apiserver集群唯一 API 入口,负责认证、授权与校验所有组件都只与它通信
etcd分布式键值库,保存全部集群状态只接受 apiserver 的读写
kube-scheduler为新 Pod 挑选最合适的节点综合资源、亲和性、污点
kube-controller-manager运行各类控制器,维持期望状态如节点控制器、副本控制器

kube-apiserver 是"中心枢纽":kubectl、各控制器、kubelet 都通过它读写数据,etcd 不接受旁路访问,从机制上避免状态被绕过或写乱。

数据面组件

  • kubelet:每个节点上的"管家",负责本节点 Pod 的创建、监控与销毁,并向 apiserver 上报节点和容器状态。
  • kube-proxy:维护节点上的网络规则(默认基于 iptables 或 ipvs),把发往 Service 虚拟 IP 的流量转发给后端 Pod。
  • 容器运行时:真正创建与运行容器的程序,常见的是 containerd、CRI-O。kubelet 通过 CRI(容器运行时接口,Container Runtime Interface)与运行时交互,所以 Kubernetes 并不直接绑定 Docker。

一次部署请求的流转

从敲下命令到容器跑起来,一次请求这样流转:

  1. 你执行 kubectl apply,请求发往 kube-apiserver。
  2. apiserver 完成认证与校验,把"期望状态"写入 etcd。
  3. kube-scheduler 发现未调度的 Pod,结合资源用量选出目标节点,写回绑定关系。
  4. 目标节点上的 kubelet 发现 Pod 被调度到自己,通过 CRI 通知容器运行时拉镜像、启动容器。
  5. kubelet 把运行状态回报给 apiserver,你通过 kubectl 能看到 Pod 进入 Running。

以 Deployment 为例,控制回路这样闭环:ReplicaSet 控制器发现实际副本数少于期望值,就持续创建 Pod,直到数量一致:

kubectl apply -f app.yaml      # 步骤 1:提交期望状态
kubectl get pods -w            # 步骤 5:观察 Pod 逐个进入 Running
# NAME                     READY   STATUS    RESTARTS   AGE
# app-7d9c5d6b9f-abc12     1/1     Running   0          30s

小结:控制面负责"决策与记账"(apiserver、etcd、scheduler、controller-manager),数据面负责"干活"(kubelet、kube-proxy、容器运行时)。一切状态变化都经 apiserver 落库,再由各组件协同完成。

笔记加载中…