Kubernetes 核心概念与整体架构
深入理解 K8s 的核心组件与整体架构,从 Control Plane 到 Node,从 API Server 到 ETCD,构建坚实的云原生基础。
概述
Kubernetes(简称 K8s)已成为现代云原生架构的标准编排平台。本文将带你从宏观视角理解 K8s 的整体架构,掌握其核心概念,为后续深入学习打下坚实基础。
学习目标:
- 理解 K8s 的设计理念与核心优势
- 掌握 Control Plane 与 Node 的职责划分
- 了解各核心组件的作用与协作方式
- 理解 ETCD 在集群中的地位
Kubernetes 整体架构图
┌─────────────────────────────────────────────────────────────────────────────┐
│ Control Plane │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ kube- │ │ kube- │ │ kube- │ │ cloud- │ │
│ │ api-server │ │ scheduler │ │ controller- │ │ controller │ │
│ │ │ │ │ │ manager │ │ │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └─────────────┘ │
│ │ │ │ │
│ └────────────────┴────────────────┘ │
│ │ │
│ ┌────────────────────┴────────────────────┐ │
│ │ ETCD │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
│
│ API Server
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Node 1 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Pod │ │ Pod │ │ Pod │ │ Pod │ │ Pod │ │
│ │ [C1][C2]│ │ [C1] │ │ [C1][C2]│ │ [C1] │ │ [C1] │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │ │ │
│ └─────────┴─────────┴─────────┴─────────┘ │
│ │ │
│ ┌────────────────────┴────────────────────┐ │
│ │ kubelet │ │ │
│ └─────────────────────────────────────────┘ │
│ ┌────────────────────┴────────────────────┐ │
│ │ kube-proxy │ │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Node 2 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Pod │ │ Pod │ │ Pod │ ... │
│ │ [C1] │ │ [C1][C2]│ │ [C1] │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ └─────────┴─────────┴─────────┘ │
│ ┌────────────────────┴────────────────────┐ │
│ │ kubelet │ kube-proxy │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
Control Plane:集群大脑
Control Plane 是 K8s 集群的控制中心,负责整个集群的管理和决策。
1. kube-apiserver
作用:集群的网关,所有操作都通过 API Server 进行。
# 核心特性:
# - RESTful API:提供标准 HTTP 接口
# - 认证鉴权:支持多种认证方式(证书、Token、OIDC)
# - 准入控制:支持 Webhook 插件进行请求校验
# - 双重功能:既是 API 服务器,也是状态存储的前端
核心职责:
- 处理所有 RESTful 请求(GET/POST/DELETE/WATCH)
- 统一管理集群状态
- 是 etcd 与集群组件之间的桥梁
2. kube-scheduler
作用:为新创建的 Pod 选择最合适的 Node。
# 调度决策考虑因素:
# - 资源需求:CPU、内存、存储
# - 亲和性/反亲和性规则
# - 污点与容忍
# - 数据局部性
# - 公平调度
调度流程:
预选(Predicates) → 优选(Priorities) → 选定(Select)
↓ ↓ ↓
过滤不合格节点 计算优先级分数 选择最优节点
3. kube-controller-manager
作用:运行各种控制器,确保集群状态符合期望。
# 主要控制器:
# - Deployment Controller:维护部署的期望副本数
# - ReplicaSet Controller:维护 Pod 的期望副本数
# - StatefulSet Controller:管理有状态应用
# - DaemonSet Controller:确保每个节点运行一个 Pod
# - Job/CronJob Controller:管理批处理任务
# - Service Controller:维护 Service 与 Endpoints 的关联
# - Endpoint Controller:自动管理 Service 的端点
4. cloud-controller-manager
作用:与云服务商交互,管理云资源。
# 云特定控制器:
# - Node Controller:检查云节点状态
# - Route Controller:设置云网络路由
# - Service Controller:创建云负载均衡器
# - PV Controller:管理云存储卷
ETCD:集群存储
ETCD 是 K8s 的唯一数据存储,保存整个集群的所有状态。
为什么选择 ETCD?
┌────────────────────────────────────────────────────────┐
│ ETCD 核心特性 │
├────────────────────────────────────────────────────────┤
│ ✓ 分布式一致性:基于 Raft 协议 │
│ ✓ 高可用:支持集群部署,无单点故障 │
│ ✓ 高效监听:支持 Watch 机制,实时感知变化 │
│ ✓ 低延迟:专为元数据场景优化 │
│ ✓ 简单可靠:无需复杂配置,开箱即用 │
└────────────────────────────────────────────────────────┘
存储内容
# ETCD 中存储的数据:
# - Pod 信息:metadata, spec, status
# - Service 信息:ClusterIP, Endpoints
# - ConfigMap/Secret:应用配置
# - 节点信息:节点状态、能力标签
# - 调度信息:正在调度的任务
# - 元数据:Namespace、Quota、RBAC 规则
生产环境建议
# ETCD 配置最佳实践:
etcd:
# 1. 使用独立磁盘(避免与工作负载争抢 IO)
# 2. 启用 SSD(写入密集型)
# 3. 定期备份(etcdctl snapshot save)
# 4. 监控指标:sync_duration, proposal_duration
# 5. 合理参数:
# - --snapshot-count: 5000~10000
# - --heartbeat-interval: 500~1000ms
Node:工作节点
Node 是集群中实际运行工作负载的机器。
Node 组件
┌─────────────────────────────────────────────────────────┐
│ Node │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ kubelet │ │
│ │ - 与 API Server 通信,汇报节点状态 │ │
│ │ - 接收 Pod 规范,创建/停止容器 │ │
│ │ - 监控容器健康,执行探针检查 │ │
│ │ - 管理存储卷和网络 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ kube-proxy │ │
│ │ - 维护网络规则(iptables/ipvs) │ │
│ │ - 实现 Service 负载均衡 │ │
│ │ - 处理 Pod 间通信 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Container Runtime │ │
│ │ (containerd / CRI-O / Docker) │ │
│ │ - 拉取镜像 │ │
│ │ - 启动/停止容器 │ │
│ │ - 管理容器生命周期 │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
kubelet 职责详解
# kubelet 工作流程:
1. 注册节点
└── 向 API Server 注册自身信息
2. 同步状态
└── 定期向 API Server 汇报节点资源状态
3. Pod 同步
├── 接收分配到本节点的 Pod 列表
├── 创建/更新/删除容器
└── 维护容器健康状态
4. 资源管理
├── 清理不再需要的容器/镜像
└── 报告资源使用情况
5. 探针执行
├── livenessProbe:存活探针
├── readinessProbe:就绪探针
└── startupProbe:启动探针
kube-proxy 网络模型
# kube-proxy 工作模式:
# 方式一:iptables(默认)
# 优点:稳定可靠
# 缺点:节点多时规则膨胀,性能下降
# 方式二:IPVS(推荐大规模场景)
# 优点:支持更多负载均衡算法,性能更好
# 配置:--mode ipvs
# 方式三:userspace(已废弃)
# 仅供参考,不再推荐
Pod:最小调度单元
Pod 是 K8s 中的基本执行单位,也是我们部署应用的入口。
Pod 结构
┌─────────────────────────────────────────────────────────┐
│ Pod │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 共享网络空间 │ │
│ │ (localhost 可以互相访问) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │Container│ │Container│ │Container│ ... │ │
│ │ │ C1 │ │ C2 │ │ C3 │ │ │
│ │ │nginx:1.0│ │app:v2.0 │ │redis:6 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ │ │
│ │ 共享存储卷 (Volume) │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Pause 容器 │ │
│ │ (基础设施容器,保留网络/存储命名空间) │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
Pod 生命周期
# Pod 状态流转:
Pending → Running → Succeeded/Failed
↓ ↓ ↓
调度中 容器运行 执行完成
# 特殊状态:
# - Waiting:等待资源或依赖
# - Terminating:正在删除
# - CrashLoopBackOff:容器反复崩溃
组件协作流程
Pod 创建流程
用户/控制器
│
▼
┌────────────────────────────────────────────────────────┐
│ kube-apiserver │
│ 接收创建请求 │
└────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ kube-scheduler │
│ 为 Pod 选择合适节点 │
└────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ kubelet │
│ 接收调度指令,创建 Pod │
└────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ Container Runtime │
│ 拉取镜像,启动容器 │
└────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ 容器运行中 │
│ kubelet 汇报状态到 API Server │
└────────────────────────────────────────────────────────┘
状态同步机制
┌─────────────────────────────────────────────────────────┐
│ 状态同步循环 │
├─────────────────────────────────────────────────────────┤
│ │
│ Control Plane Node │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ kube-sched │ │ kubelet │ │
│ │ (期望状态) │ ───────────────▶│ (执行状态) │ │
│ └─────────────┘ └──────┬──────┘ │
│ │ │ │
│ │ ┌─────────────┐ │ │
│ │ │ kube-apiser │◀──────┘ │
│ │ │ ver │ │ │
│ │ └──────┬──────┘ │ │
│ │ │ │ │
│ │ ┌──────▼──────┐ │ │
│ │ │ ETCD │◀──────┘ │
│ │ │ (存储状态) │ │ │
│ │ └─────────────┘ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Controller │ │ kube- │ │
│ │ Manager │ │ proxy │ │
│ │ (协调控制) │ │ (网络配置) │ │
│ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
最小化集群架构
对于学习和测试环境,可以使用 minikube 或 k3s 快速启动一个最小化集群:
# minikube 快速启动
minikube start --driver=docker
# 查看集群状态
kubectl cluster-info
# 查看节点
kubectl get nodes
# 最小化架构特点:
# - Control Plane 和 Node 可以运行在同一台机器
# - ETCD 单实例运行
# - 所有组件以进程形式运行
# - 适用于开发、测试、学习
常见问题与避坑指南
Q1:ETCD 存储满了怎么办?
# 原因:持续写入导致 DB 膨胀
# 解决:
# 1. 启用压缩:etcd --auto-compaction
# 2. 定期碎片整理:etcdctl defrag
# 3. 监控 DB 大小,提前预警
# 4. 合理配置 quota
Q2:调度太慢怎么排查?
# 查看调度延迟
kubectl get events --sort-by='.lastTimestamp' | grep Scheduled
# 查看调度器日志
kubectl logs -n kube-system kube-scheduler-xxx
# 检查节点资源
kubectl describe node | grep -A5 "Allocated"
Q3:Pod 一直 Pending?
# 排查步骤
1. kubectl describe pod <name> # 查看事件
2. kubectl get nodes # 检查节点是否足够
3. kubectl describe node <node> # 检查资源是否足够
4. 检查污点和容忍是否匹配
Q4:API Server 响应慢?
# 可能原因:
# - ETCD 磁盘 IO 高
# - Watch 过载
# - 认证压力大
# 解决方案:
# - ETCD 使用 SSD
# - 开启缓存
# - 优化客户端 Watch 逻辑
总结
┌─────────────────────────────────────────────────────────┐
│ 核心要点回顾 │
├─────────────────────────────────────────────────────────┤
│ │
│ Control Plane(大脑) │
│ ├── kube-apiserver:统一入口 │
│ ├── kube-scheduler:Pod 调度 │
│ ├── kube-controller-manager:控制器 │
│ └── cloud-controller-manager:云集成 │
│ │
│ ETCD(存储) │
│ ├── K8s 唯一数据源 │
│ ├── Raft 一致性协议 │
│ └── 生产环境建议高可用部署 │
│ │
│ Node(工人) │
│ ├── kubelet:Pod 管理 │
│ ├── kube-proxy:网络代理 │
│ └── Container Runtime:容器运行 │
│ │
│ Pod(任务) │
│ ├── 最小调度单元 │
│ ├── 共享网络和存储 │
│ └── 可以包含多个容器 │
│ │
└─────────────────────────────────────────────────────────┘
思考题
- 为什么 K8s 选择将 Pod 作为最小调度单元,而不是直接调度容器?
- 如果 ETCD 故障,集群会发生什么?有哪些容灾措施?
- Controller Manager 中的各个控制器是如何协调工作的?
引用与参考
- Kubernetes Documentation
- ETCD Documentation
- Kubernetes The Hard Way - 手动部署 K8s 深入理解架构
- Kubernetes In Action - 经典书籍
下篇预告
下一篇文章我们将深入探讨 Pod 生命周期与核心概念,包括:
- Pod 的多种创建方式
- Init Container 与 Sidecar 模式
- 探针配置与健康检查
- 资源限制与 QoS 策略
敬请期待!