Skip to content

02 - Kubernetes 架构深入

集群总览

K8s 集群由两部分组成:控制平面(Control Plane)工作节点(Worker Nodes)

┌─────────────────────────────────────────────────────────────────┐
│                        Kubernetes Cluster                       │
│                                                                 │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │                 Control Plane (Master)                     │  │
│  │                                                           │  │
│  │  ┌──────────┐  ┌──────────────┐  ┌───────────────────┐   │  │
│  │  │  etcd    │  │  API Server  │  │ Controller Manager│   │  │
│  │  │  (数据库) │  │  (唯一入口)   │  │ (控制循环)        │   │  │
│  │  └──────────┘  └──────────────┘  └───────────────────┘   │  │
│  │                                                           │  │
│  │  ┌───────────────────┐  ┌──────────────────────────┐     │  │
│  │  │    Scheduler      │  │  Cloud Controller Mgr    │     │  │
│  │  │   (调度器)         │  │  (云控制器,可选)         │     │  │
│  │  └───────────────────┘  └──────────────────────────┘     │  │
│  └───────────────────────────────────────────────────────────┘  │
│                              │                                  │
│                         kubectl / API                           │
│                              │                                  │
│  ┌─────────────────────┐  ┌─────────────────────┐              │
│  │   Worker Node 1     │  │   Worker Node 2     │  ...         │
│  │                     │  │                     │              │
│  │  ┌───────────────┐  │  │  ┌───────────────┐  │              │
│  │  │   kubelet     │  │  │  │   kubelet     │  │              │
│  │  │  (节点代理)    │  │  │  │  (节点代理)    │  │              │
│  │  ├───────────────┤  │  │  ├───────────────┤  │              │
│  │  │  kube-proxy   │  │  │  │  kube-proxy   │  │              │
│  │  │  (网络代理)    │  │  │  │  (网络代理)    │  │              │
│  │  ├───────────────┤  │  │  ├───────────────┤  │              │
│  │  │ Container     │  │  │  │ Container     │  │              │
│  │  │ Runtime       │  │  │  │ Runtime       │  │              │
│  │  │ (containerd)  │  │  │  │ (containerd)  │  │              │
│  │  ├───────────────┤  │  │  ├───────────────┤  │              │
│  │  │ ┌───┐ ┌───┐  │  │  │  │ ┌───┐ ┌───┐  │  │              │
│  │  │ │Pod│ │Pod│  │  │  │  │ │Pod│ │Pod│  │  │              │
│  │  │ └───┘ └───┘  │  │  │  │ └───┘ └───┘  │  │              │
│  │  └───────────────┘  │  │  └───────────────┘  │              │
│  └─────────────────────┘  └─────────────────────┘              │
└─────────────────────────────────────────────────────────────────┘

控制平面组件

1. API Server(kube-apiserver)

  • K8s 的唯一入口,所有操作都通过它
  • 提供 RESTful API
  • kubectl 命令本质上就是调用 API Server
  • 负责认证(Authentication)、授权(Authorization)、准入控制(Admission Control)

2. etcd

  • 分布式键值存储数据库
  • 存储集群的所有状态数据(Pod、Service、ConfigMap 等)
  • 是集群的"大脑记忆"——etcd 挂了,集群就"失忆"了
  • 生产环境必须做好备份

3. Scheduler(kube-scheduler)

  • 决定新创建的 Pod 运行在哪个节点
  • 考虑因素:资源需求、亲和性/反亲和性、污点容忍、数据局部性等
  • 调度过程:过滤(排除不满足条件的节点)→ 打分(给候选节点排序)→ 绑定

4. Controller Manager(kube-controller-manager)

  • 运行各种控制器(Controller),是 K8s 自动化的核心
  • 每个控制器都是一个控制循环,不断将"当前状态"调整为"期望状态"

主要控制器:

控制器职责
Deployment Controller管理 Deployment,确保副本数正确
ReplicaSet Controller确保指定数量的 Pod 副本在运行
Node Controller监控节点健康状态
Job Controller管理一次性任务
EndpointSlice Controller管理 Service 的后端 Pod 列表
ServiceAccount Controller管理命名空间的默认 ServiceAccount

5. Cloud Controller Manager(可选)

  • 与云厂商 API 交互
  • 管理云资源:负载均衡器、存储卷、节点实例
  • 阿里云 ACK 就有自己的 Cloud Controller Manager

工作节点组件

1. kubelet

  • 运行在每个节点上的代理进程
  • 确保 Pod 中的容器正在运行且健康
  • 向 API Server 汇报节点状态
  • 不管理非 K8s 创建的容器

2. kube-proxy

  • 维护节点上的网络规则
  • 实现 Service 的负载均衡
  • 通过 iptables/IPVS 规则将流量转发到正确的 Pod

3. 容器运行时(Container Runtime)

  • 负责实际运行容器
  • K8s 通过 CRI(Container Runtime Interface)与容器运行时交互
  • 常见运行时:containerd(Docker Desktop 使用)、CRI-O

核心概念:声明式 vs 命令式

K8s 的设计哲学是声明式(Declarative),而不是命令式(Imperative)。

bash
# 命令式(告诉系统怎么做)
docker run -d --name web -p 80:80 nginx
docker scale web=3  # Docker 不支持,只是示意

# 声明式(告诉系统想要什么状态)
# "我要 3 个 nginx Pod,对外暴露 80 端口"
# K8s 自动确保这个状态一直被维持
yaml
# desired-state.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3          # 我要 3 个副本
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

核心循环

期望状态(YAML) → API Server → Controller 不断检查 → 当前状态 ≠ 期望状态 → 自动调整

下一步

03 - 搭建本地 K8s 环境