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 不断检查 → 当前状态 ≠ 期望状态 → 自动调整