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     │     │
│   │ (协调控制)   │                 │ (网络配置)  │     │
│   └─────────────┘                 └─────────────┘     │
│                                                         │
└─────────────────────────────────────────────────────────┘

最小化集群架构

对于学习和测试环境,可以使用 minikubek3s 快速启动一个最小化集群:

# 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(任务)                                            │
│  ├── 最小调度单元                                      │
│  ├── 共享网络和存储                                    │
│  └── 可以包含多个容器                                   │
│                                                         │
└─────────────────────────────────────────────────────────┘

思考题

  1. 为什么 K8s 选择将 Pod 作为最小调度单元,而不是直接调度容器?
  2. 如果 ETCD 故障,集群会发生什么?有哪些容灾措施?
  3. Controller Manager 中的各个控制器是如何协调工作的?

引用与参考

  1. Kubernetes Documentation
  2. ETCD Documentation
  3. Kubernetes The Hard Way - 手动部署 K8s 深入理解架构
  4. Kubernetes In Action - 经典书籍

下篇预告

下一篇文章我们将深入探讨 Pod 生命周期与核心概念,包括:

  • Pod 的多种创建方式
  • Init Container 与 Sidecar 模式
  • 探针配置与健康检查
  • 资源限制与 QoS 策略

敬请期待!