☸️ K8s 组件详解
关于本文档
Kubernetes 集群由控制平面(Control Plane) 和工作节点(Worker Node) 两大部分组成。本文档深度解析每个组件的职责、工作原理及面试考点。
本文档是 K8s 核心概念 的组件深化篇。
#k8s#kubernetes#architecture#components#reference
📋 组件全景图
flowchart TB
subgraph CP["☸️ 控制平面(Control Plane)"]
AP["kube-apiserver<br/>📡 API 入口"]
ET["etcd<br/>💾 键值存储"]
SC["kube-scheduler<br/>🎯 Pod 调度器"]
CM["kube-controller-manager<br/>🔄 控制器管理器"]
CCM["cloud-controller-manager<br/>☁️ 云控制器(可选)"]
end
subgraph WN["🖥️ 工作节点(Worker Node)"]
KL["kubelet<br/>👷 节点代理"]
KP["kube-proxy<br/>🌐 网络代理"]
CR["容器运行时<br/>🐳 containerd / CRI-O"]
end
subgraph AD["🔌 插件(Addons)"]
DNS["CoreDNS<br/>📖 集群 DNS"]
DASH["Dashboard<br/>🖥️ Web 界面"]
MON["监控<br/>📊 资源监控"]
LOG["日志<br/>📝 集群日志"]
end
CP --> WN
WN --> AD
style CP fill:#E3F2FD,color:#000
style WN fill:#FFF3E0,color:#000
style AD fill:#E8F5E9,color:#000
📖 :控制平面组件 🧠
控制平面是集群的”大脑”,管理集群的全局状态和运行逻辑。
控制平面的核心职责
- 提供 API 接口(kube-apiserver)
- 存储集群状态(etcd)
- 调度工作负载(kube-scheduler)
- 运行控制器逻辑(kube-controller-manager)
1.1 kube-apiserver — 集群的”大门”
角色:Kubernetes HTTP API 的核心实现组件,所有组件通信的唯一入口。
flowchart LR
subgraph "kube-apiserver 通信模式"
A[kubectl] --> API
B[Pod] --> API
C[其他组件] --> API
API --> ETCD[etcd]
end
style API fill:#1976D2,color:#fff
style ETCD fill:#F57C00,color:#fff
| 特性 | 说明 | 面试价值 |
|---|---|---|
| RESTful API | 所有操作通过 HTTP API 完成 | ⭐⭐⭐ |
| 认证(Authentication) | 验证请求者身份(证书/Token/用户名密码) | ⭐⭐⭐⭐ |
| 授权(Authorization) | 判断请求者是否有权限操作(RBAC/ABAC) | ⭐⭐⭐⭐ |
| 准入控制(Admission Control) | 请求持久化前的拦截和修改 | ⭐⭐⭐⭐⭐ |
| 聚合(Aggregation) | 支持扩展 API Server | ⭐⭐⭐ |
面试高频题
Q: API Server 是无状态还是有状态的?
A: 无状态(Stateless)。API Server 自身不持久化数据,所有数据存储在 etcd 中。这意味着 API Server 可以水平扩展。
Q: API Server 的处理流程是怎样的?
A: 认证 → 授权 → 准入控制(Mutating → Validating)→ 存储到 etcd → 返回响应
1.2 etcd — 集群的”数据库”
角色:具备一致性和高可用性的分布式键值存储,存储所有集群数据。
| 特性 | 说明 |
|---|---|
| 存储引擎 | 分布式键值存储(非关系型) |
| 一致性协议 | Raft 共识算法 |
| 数据格式 | 仅 API Server 可直接读写 |
| 备份机制 | 快照备份(etcdctl snapshot save) |
生产环境注意事项
- 奇数节点(3/5/7)保证 Raft 多数派
- 定期备份 etcd 快照
- 分离部署:生产环境建议 etcd 与 API Server 分离部署
- 性能:etcd 对磁盘 IO 敏感,推荐 SSD
1.3 kube-scheduler — 集群的”调度官”
角色:监听未绑定节点的 Pod,将其分配到最合适的节点。
flowchart LR
A[待调度 Pod] --> B[Predicates<br/>预选:筛选满足条件的节点]
B --> C[Priorities<br/>优选:对节点打分排序]
C --> D[Binding<br/>绑定:将 Pod 绑定到最优节点]
| 调度策略 | 说明 | 面试价值 |
|---|---|---|
| NodeSelector | 基于 Label 的简单调度 | ⭐⭐ |
| NodeAffinity | 节点亲和性(硬/软约束) | ⭐⭐⭐ |
| PodAffinity / AntiAffinity | Pod 亲和/反亲和 | ⭐⭐⭐⭐ |
| Taints & Tolerations | 污点与容忍度 | ⭐⭐⭐⭐ |
| 资源请求与限制 | CPU/内存资源调度 | ⭐⭐⭐ |
面试题:调度器如何保证公平性? 通过调度队列(Scheduling Queue)管理待调度 Pod,支持优先级抢占(Priority & Preemption)。
1.4 kube-controller-manager — 集群的”监管者”
角色:运行控制器进程,确保集群的当前状态不断趋近于期望状态。
控制器的核心逻辑 控制器通过 API Server 监控集群的公共状态,并致力于将当前状态转变为期望的状态。
核心控制器列表:
| 控制器 | 职责 | 管理资源 |
|---|---|---|
| Node Controller | 节点状态监控与驱逐 | Node |
| Replication Controller | 维持 Pod 的期望副本数 | Pod |
| Deployment Controller | 管理 Deployment 的滚动更新 | Deployment |
| StatefulSet Controller | 管理有状态应用的顺序启动 | StatefulSet |
| DaemonSet Controller | 确保每个节点运行一个 Pod | DaemonSet |
| Job Controller | 管理一次性/定时任务 | Job / CronJob |
| EndpointSlice Controller | 维护 Service 与 Pod 的映射 | EndpointSlice |
| Namespace Controller | 管理 Namespace 的生命周期 | Namespace |
| ServiceAccount Controller | 管理默认 ServiceAccount | ServiceAccount |
1.5 cloud-controller-manager — 云驱动集成(可选)
角色:与底层云平台(AWS、GCP、Azure 等)集成,管理云资源。
| 控制器 | 职责 |
|---|---|
| Node Controller | 云 VM 健康检查与节点删除 |
| Route Controller | 云网络路由配置 |
| Service Controller | 云负载均衡器创建与维护 |
自建机房或裸金属部署通常不需要 cloud-controller-manager。
⚡ :工作节点组件 🖥️
2.1 kubelet — 节点的”守护者”
角色:每个节点上运行的主要代理进程,确保 Pod 中的容器正常运行。
flowchart TD
A[API Server] -->|监控 Pod 变更| B(kubelet)
B -->|创建/删除| C[容器运行时]
C --> D[容器]
B -->|上报状态| A
B -->|健康检查| E[Readiness<br/>Liveness<br/>Startup]
| 功能 | 说明 |
|---|---|
| Pod 管理 | 通过 API Server 监听 Pod 变更,确保容器按规范运行 |
| 健康检查 | 执行 Readiness、Liveness、Startup 探针 |
| 资源监控 | 采集节点和容器的资源使用情况 |
| Volume 管理 | 挂载和卸载存储卷 |
| 上报状态 | 定期向 API Server 上报节点和 Pod 状态 |
2.2 kube-proxy — 网络的”交通警”(可选)
角色:维护节点上的网络规则,实现 Service 的网络代理和负载均衡。
| 代理模式 | 实现方式 | 性能 | 复杂度 |
|---|---|---|---|
| iptables | Linux iptables 规则 | 中等 | 低 |
| IPVS | Linux IP Virtual Server | 高 | 中 |
| userspace | 用户态代理(已弃用) | 低 | — |
| kernelspace | Windows 内核态(仅 Windows) | 高 | 中 |
推荐 生产环境推荐 IPVS 模式,性能优于 iptables,支持更丰富的负载均衡算法。
2.3 容器运行时 — 容器的”发动机”
角色:负责运行容器的软件。Kubernetes 通过 CRI(Container Runtime Interface) 与容器运行时交互。
flowchart LR
A[kubelet] -->|CRI 接口| B{"容器运行时"}
B --> C[containerd<br/>⭐ 推荐]
B --> D[CRI-O]
B --> E[Docker + cri-dockerd]
| 运行时 | 特点 | 适用场景 |
|---|---|---|
| containerd | 轻量、稳定、K8s 默认 | ✅ 生产环境首选 |
| CRI-O | 专为 K8s 设计、极简 | ⭐ 替代方案 |
| Docker + cri-dockerd | 兼容 Docker 生态 | ⚠️ 迁移过渡期 |
面试题:K8s 1.24 之后为什么移除了 dockershim? Dockershim 是 kubelet 中用于支持 Docker 的适配层。移除后,Docker 不再作为 K8s 的内置容器引擎。这是推动社区向 CRI 标准靠拢、减轻维护负担的举措。用户可通过安装
cri-dockerd适配器继续使用 Docker。
🔧 :插件(Addons)🔌
插件扩展 Kubernetes 集群的功能。大多数插件是集群范围内的资源。
3.1 DNS(CoreDNS)
角色:集群范围内的 DNS 解析服务,为 Service 和 Pod 提供域名解析。
每个 Service 自动获得一个 DNS 记录:
<service>.<namespace>.svc.cluster.local
3.2 Dashboard
角色:基于 Web 的 Kubernetes 集群管理界面。
3.3 容器资源监控
角色:在集群范围内收集和存储容器指标。
| 工具 | 用途 |
|---|---|
| Metrics Server | 基础资源指标(CPU/内存) |
| Prometheus | 多维指标采集与告警 |
| Grafana | 指标可视化仪表盘 |
3.4 集群层面日志
角色:将容器日志收集到中央存储,支持检索和告警。
| 方案 | 采集方式 |
|---|---|
| EFK/ELK | Fluentd/Filebeat → Elasticsearch → Kibana |
| Loki | Promtail → Loki → Grafana |
| PLG | Promtail → Loki → Grafana(轻量) |
⚙️ :架构灵活性 🧩
Kubernetes 允许灵活地部署和管理组件,适应从小型开发环境到大规模生产部署的各种需求。
4.1 组件部署模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Static Pod | 通过 kubelet 直接管理控制平面组件 | kubeadm 默认方式 |
| 系统服务 | 通过 systemd 等系统服务管理器运行 | 部分发行版(如 K3s) |
| 二进制/容器 | 直接运行二进制文件或容器 | 自定义部署 |
4.2 etcd 部署架构
| 类型 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| Stacked(堆叠) | etcd 与控制平面同节点 | 简单、少用机器 | 控制平面故障节点同时丢失 etcd |
| External(外部) | etcd 部署在独立节点 | 高可用性强 | 增加机器成本和网络延迟 |
生产建议 对于生产环境 HA 集群,推荐使用 External etcd 或奇数节点(3/5/7)的 Stacked 模式。
4.3 组件通信流程
sequenceDiagram
participant U as kubectl/用户
participant AP as kube-apiserver
participant ET as etcd
participant SC as kube-scheduler
participant CM as controller-manager
participant KL as kubelet
U->>AP: kubectl apply -f deployment.yaml
AP->>ET: 存储资源声明
AP-->>CM: 控制器检测到变更
CM->>AP: 创建 Pod 对象
AP->>ET: 存储 Pod 状态
AP-->>SC: 调度器检测到未调度的 Pod
SC->>AP: 绑定 Pod 到节点
AP->>ET: 存储绑定结果
AP-->>KL: kubelet 监听到新 Pod
KL->>CR: 调用容器运行时创建容器
KL->>AP: 上报 Pod 运行状态
📊 面试速记
核心要点
| 组件 | 一句话总结 | 核心考点 |
|---|---|---|
| API Server | 集群的唯一入口 | 认证→授权→准入控制流程 |
| etcd | 集群的数据库 | Raft 共识、奇数节点、快照备份 |
| Scheduler | 把 Pod 分配到最佳节点 | 预选→优选→绑定、亲和性策略 |
| Controller Manager | 确保当前状态=期望状态 | 控制器模式、Informer 机制 |
| kubelet | 节点上的 Pod 管家 | Pod 生命周期管理、健康检查 |
| kube-proxy | 网络规则守护者 | iptables vs IPVS 模式 |
面试脑图
mindmap
root((K8s 组件))
控制平面
API Server
认证/授权
准入控制
水平扩展
etcd
Raft 协议
快照备份
奇数节点
Scheduler
预选 Predicates
优选 Priorities
亲和性调度
Controller
Deployment
StatefulSet
DaemonSet
Job/CronJob
工作节点
kubelet
Pod 管理
健康检查
资源上报
kube-proxy
iptables
IPVS
Container Runtime
containerd
CRI-O
插件
CoreDNS
Dashboard
Metrics Server
Prometheus/Grafana
关联文档
- K8s 核心概念 — 概念速查手册
- ../service/K8s Service 核心原理 — Service 底层原理与流量转发
- ../network/kube-proxy 流量转发与代理模式详解 — kube-proxy 三种代理模式
- ../../network/technology/eBPF 技术详解 — eBPF:下一代 kube-proxy 模式底层技术
- ../../network/tools/firewalld 与 iptables 对比 — iptables 规则对比(kube-proxy iptables 模式涉及)
- ../../network/technology/Calico CNI 网络插件详解 — CNI 网络插件实现
- ../../container/容器技术 — 容器运行时(containerd / CRI-O)
- ../../monitoring/监控与可观测性 — 集群监控体系
- 使用 kubeadm 创建集群 — 动手搭建集群