Kubernetes 架构与组件
Kubernetes 集群架构详解:Master/Worker 节点分工、各核心组件职责与交互流程。
1. 架构全景图
┌──────────────────────────────────────────────────────────────┐
│ Master Node(控制平面) │
│ ┌──────────────┐ ┌──────────────────┐ ┌───────────────┐ │
│ │ kube-apiserver│ │controller-manager│ │ scheduler │ │
│ │ (API 网关) │ │ (状态协调器) │ │ (调度器) │ │
│ └──────┬───────┘ └────────┬─────────┘ └───────┬───────┘ │
│ │ │ │ │
│ └───────────────────┼────────────────────┘ │
│ │ │
│ ┌───────┴───────┐ │
│ │ etcd │ │
│ │ (分布式 KV 存储)│ │
│ └───────────────┘ │
└──────────────────────────────────────────────────────────────┘
│
─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─
│
┌────────────────────────────┼────────────────────────────────┐
│ Worker Node(工作节点) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ kubelet │ │kube-proxy│ │ container-runtime │ │
│ │(节点代理) │ │(网络代理) │ │ (容器运行时) │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ Pod │ │ Pod │ │ Pod │ ... │
│ └─────┘ └─────┘ └─────┘ │
└──────────────────────────────────────────────────────────────┘2. Worker Node 组件
每个工作节点上都运行着三个核心组件。
2.1 kubelet
节点上的核心代理,负责管理 Pod 的生命周期。
| 职责 | 说明 |
|---|---|
| Pod 管理 | 根据 PodSpec 创建、启动、停止容器 |
| 状态上报 | 定期向 kube-apiserver 上报节点和 Pod 运行状态 |
| 健康检查 | 执行 Liveness 和 Readiness 探针 |
| 资源管理 | 监控节点资源使用情况,上报给调度器 |
2.2 kube-proxy
为 Pod 提供网络代理和负载均衡服务。
| 职责 | 说明 |
|---|---|
| Service 实现 | 将 Service 的 ClusterIP 映射到后端 Pod IP |
| 负载均衡 | 将流量分发到后端的多个 Pod |
| 代理模式 | 支持 iptables / IPVS / userspace 三种模式 |
三种代理模式对比:
| 模式 | 性能 | 复杂度 | 推荐场景 |
|---|---|---|---|
| iptables | 中 | 低 | 默认模式,中小规模集群 |
| IPVS | 高 | 中 | 大规模集群(>1000 Service) |
| userspace | 低 | 低 | 旧版兼容(已基本淘汰) |
2.3 container-runtime
运行容器的底层软件。
| 职责 | 说明 |
|---|---|
| 镜像管理 | 拉取、存储、删除容器镜像 |
| 容器生命周期 | 创建、启动、停止、删除容器 |
| CRI 实现 | 实现容器运行时接口(CRI)与 kubelet 通信 |
常见运行时:
| 运行时 | 说明 |
|---|---|
| containerd | K8s 社区推荐的默认运行时 |
| CRI-O | 专为 K8s 设计的轻量运行时 |
| Docker Engine | 历史默认,v1.24 起通过 cri-dockerd 适配 |
3. Master Node 组件
3.1 kube-apiserver
集群的API 网关,所有组件通过它通信。
| 职责 | 说明 |
|---|---|
| REST API | 提供集群管理的 RESTful 接口 |
| 认证授权 | 处理请求的身份认证、权限校验(RBAC) |
| 准入控制 | 执行 Admission Controller 校验和修改请求 |
| 数据持久化 | 所有资源对象持久化到 etcd |
kubectl → kube-apiserver → etcd
kubelet → kube-apiserver (watch Pod 变更)
scheduler → kube-apiserver (watch 未调度 Pod + 写入调度结果)3.2 etcd
分布式 KV 存储,保存集群所有配置和状态数据(实际就是集群的 “source of truth”)。
| 特性 | 说明 |
|---|---|
| 一致性 | 基于 Raft 共识算法保证强一致性 |
| 高可用 | 通常部署 3/5 个节点,奇数个保证选举 |
| Watch 机制 | 支持事件监听,组件通过 watch 感知资源变更 |
K3s 默认使用内嵌的 SQLite 替代 etcd(也支持使用外部 etcd)。
3.3 controller-manager
运行一组控制器的后台进程,每个控制器负责将资源的当前状态向期望状态靠拢。
| 控制器 | 职责 |
|---|---|
| Node Controller | 监控节点健康状态,处理节点故障 |
| ReplicaSet Controller | 确保 Pod 副本数符合期望 |
| Deployment Controller | 管理 Deployment 的滚动更新 |
| Endpoint Controller | 为 Service 生成 Endpoints |
| ServiceAccount Controller | 为命名空间创建默认 ServiceAccount |
🔬 深入原理:控制器的工作模式是经典的 Control Loop:
观察(Watch) → 比较(Diff) → 执行(Act)。
3.4 scheduler
负责将 Pod 调度到合适的节点上运行。
调度流程:
1. 过滤(Filtering)
过滤掉不满足条件的节点(资源不足、污点不匹配、亲和性不满足等)
2. 打分(Scoring)
对剩余节点打分排序(资源均衡度、亲和性优先等)
3. 绑定(Binding)
选择最高分节点,将 Pod 绑定到该节点4. 云平台集成
如果使用云平台(AWS、Azure、GCP 等),还会涉及 cloud-controller-manager:
| 职责 | 示例 |
|---|---|
| 节点管理 | 检测云上节点是否被删除 |
| 路由管理 | 配置云上 VPC 路由 |
| 负载均衡 | 自动创建云厂商的 LoadBalancer |
| 存储卷 | 对接云存储(EBS、Azure Disk 等) |
K3s 默认移除了 cloud-controller-manager,减小编译体积。
5. 组件间的典型交互流程
5.1 创建一个 Deployment 的完整流程
1. kubectl apply -f deploy.yaml
└→ POST /apis/apps/v1/deployments (kube-apiserver)
└→ 写入 etcd
2. Deployment Controller(controller-manager)
└→ Watch 到新 Deployment
└→ 创建 ReplicaSet
└→ 写入 etcd(通过 apiserver)
3. ReplicaSet Controller(controller-manager)
└→ Watch 到新 ReplicaSet,发现 Pod 数量不足
└→ 创建 Pod(设置 ownerReference 指向 ReplicaSet)
└→ 写入 etcd(通过 apiserver),Pod 状态为 Pending
4. Scheduler
└→ Watch 到未调度的 Pod
└→ 过滤 + 打分,选出最佳 Node
└→ 更新 Pod 的 nodeName 字段
└→ 写入 etcd(通过 apiserver)
5. kubelet(目标节点)
└→ Watch 到分配给本节点的 Pod
└→ 调用 CRI 拉取镜像、创建容器
└→ 更新 Pod 状态为 Running
└→ 写入 etcd(通过 apiserver)5.2 访问一个 Service 的流程
Client → Service(ClusterIP:Port) → iptables/IPVS 规则 → 随机选一个 Pod IP → 容器6. K3s 架构差异
| 方面 | 标准 K8s | K3s |
|---|---|---|
| 默认存储 | etcd | SQLite(可选 etcd) |
| 容器运行时 | 需单独安装 | 内嵌 containerd |
| 网络插件 | 需单独安装 | 内嵌 Flannel |
| Ingress 控制器 | 需单独安装 | 内嵌 Traefik |
| 二进制大小 | 多组件分散 | 单二进制 < 100MB |