本文由 Claude-3.7-Sonnet 生成。

从裸机到容器:应对复杂性的演进

1. 物理服务器时代的困境

最初,应用程序直接部署在物理服务器上,导致:

  • 资源利用率低下(一台服务器只运行一个应用)
  • 环境一致性问题(”在我的机器上能运行”)
  • 应用隔离性差

2. 虚拟机的改进

虚拟化技术出现,每台物理服务器可运行多个虚拟机:

  • 提高了资源利用率
  • 但启动慢、资源占用大

3. 容器(Container)的革命

容器技术解决了关键痛点:

  • 轻量级(共享宿主机OS内核)
  • 快速启动(秒级)
  • 可移植性强(构建一次,到处运行)
  • 资源占用小

但问题出现了: 当容器数量增长,单机管理变得困难,集群管理更是挑战。

Kubernetes组件的逐步演进

1. Pod:为什么不直接使用容器?

容器本身有局限性:

  • 单个容器难以满足应用的协作需求
  • 需要将紧密关联的功能组合在一起

因此诞生了Pod:

  • Pod是最小部署单元,包含一个或多个容器
  • 共享网络命名空间和存储卷
  • 同一Pod中的容器总是在同一节点上运行
  • 适合边车(sidecar)模式,如日志收集、代理容器

2. ReplicaSet:确保可用性

Pod解决了部署问题,但如何确保高可用?

  • 如果Pod崩溃怎么办?
  • 如何保持指定数量的实例?

ReplicaSet应运而生:

  • 自动维护指定数量的Pod副本
  • 监控Pod状态,替换失败的Pod
  • 实现应用的可扩展性

3. Deployment:应对变更

应用需要更新,但如何安全更新?

  • 如何避免更新过程中的服务中断?
  • 如何在出问题时回滚?

Deployment提供了解决方案:

  • 管理ReplicaSet的版本更迭
  • 实现无缝的滚动更新
  • 提供版本历史和回滚能力

4. Service:解决网络稳定性

Pod是临时的,IP地址会变,如何稳定访问?

  • Pod重启后IP会改变
  • 扩缩容会导致Pod增减
  • 客户端如何发现可用服务?

Service提供了答案:

  • 提供稳定的网络端点(IP和DNS名)
  • 自动负载均衡到后端Pod
  • 服务发现机制

注意: 并非所有Pod都需要Service,但如果需要被网络访问,通常都需要Service。如:

  • 前端应用需要Service暴露给用户
  • 后端API需要Service供其他服务调用
  • 仅做数据处理的批处理Pod可能不需要Service
  • 是一个网络抽象层
  • 为 Pod 提供稳定的访问端点(IP/DNS)
  • 不包含任何容器或运行时代码
  • 只是定义了一组网络规则,告诉流量如何路由到 Pod

Service不仅仅是”一组规则”,而是一个完整的Kubernetes资源对象,它包含:

  • 虚拟IP(ClusterIP) - 在集群内部稳定不变的IP地址
  • 服务发现机制 - 通过DNS或环境变量提供
  • 负载均衡功能 - 将流量分发到多个后端Pod
  • 端口映射规则 - 定义服务端口与目标Pod端口的映射
  • 在实现层面,kube-proxy确实会在每个节点上创建规则(如iptables规则),但Service本身是一个在控制平面定义和管理的抽象对象。

完整的Kubernetes架构图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
+--------------------------------------------------------------------+
| Kubernetes集群 |
+--------------------------------------------------------------------+
|
| 管理
v
+------------------+ +---------------------------+
| 控制平面组件 | | 工作节点 (Node) |
+------------------+ +---------------------------+
| - API Server | | +-----------------------+ |
| - etcd |<--->| | Pod | |
| - Scheduler | | | +-------------------+ | |
| - Controller Mgr | | | | Container Container| | |
+------------------+ | | +-------------------+ | |
| +-----------------------+ |
| |
| +-----------------------+ |
| | Services | |
| | (ClusterIP/NodePort) | |
| +-----------------------+ |
| |
| +-----------------------+ |
| | kubelet | |
| | kube-proxy | |
| | Container Runtime | |
| +-----------------------+ |
+---------------------------+
^
|
+-----------------------------+-----------------------------+
| |
+---------------+ +---------------+ +------------------+ +---------------+
| Deployment | | StatefulSet | | DaemonSet | | Job/CronJob |
+---------------+ +---------------+ +------------------+ +---------------+
| 管理无状态应用 | | 管理有状态应用 | | 每节点运行一个Pod | | 批处理任务 |
+-------+-------+ +---------------+ +------------------+ +---------------+
|
| 管理
v
+---------------+
| ReplicaSet |
+---------------+
| 维护Pod副本数 |
+-------+-------+
|
| 创建
v
+------------------+ 被发现 +------------------+
| Pod |<---------| Service |
+------------------+ 并访问 +------------------+
| 容器组 | | 提供稳定网络终点 |
+------------------+ +------------------+
^ ^
| 挂载 | 配置
+------------------+ +------------------+
| Volume | | ConfigMap/Secret |
+------------------+ +------------------+
| 持久化存储 | | 配置和敏感信息 |
+------------------+ +------------------+

+-------------------------------------------------------------------+
| Kubernetes 集群 |
+-------------------------------------------------------------------+
|
|
v
+------------------------+ +------------------------+
| 控制平面 (Master) | | 工作节点 (Node) |
+------------------------+ +------------------------+
| - API Server | | +--------------------+ |
| - etcd | | | kubelet | |
| - Controller Manager | | | kube-proxy | |
| - Scheduler | | | Container Runtime | |
+------------------------+ | +--------------------+ |
| |
| +--------------------+ |
| | Pod | |
| | +----------------+ | |
| | | Container(s) | | |
| | +----------------+ | |
| +--------------------+ |
| ... |
+------------------------+

+---------------------+ 管理 +---------------------+ 管理 +---------------------+
| Deployment |---------->| ReplicaSet |---------->| Pod |
+---------------------+ +---------------------+ +---------------------+
^
+---------------------+ 管理 +---------------------+ |
| StatefulSet |---------->| Pod | | 选择
+---------------------+ +---------------------+ |
|
+---------------------+ 管理 +---------------------+ +---------------------+
| DaemonSet |---------->| 每个节点上的Pod | | Service |
+---------------------+ +---------------------+ +---------------------+
集群级虚拟IP和负载均衡
+---------------------+ 管理 +---------------------+
| Job/CronJob |---------->| Pod |
+---------------------+ +---------------------+

+-------------------+
| Pod |
+-------------------+
/\
/ \
/ \
挂载卷 / \ 使用配置
/ \
/ \
+--------------+ +--------------+
| Volume | | ConfigMap |
+--------------+ +--------------+
| Secret | | 纯文本配置 |
+--------------+ +--------------+

+----------------------------------+
外部访问 -----------> | Service | 集群级资源
| (ClusterIP/NodePort/LoadBalancer)|
+----------------------------------+
|
| 根据标签选择Pod
| selector: app=myapp
v
+----------------------------------+
| Pod | Pod | Pod | 带有匹配标签的Pod
| app=myapp | app=myapp| app=myapp|
+----------------------------------+

这个架构是如何协同工作的:

  • 应用打包为容器
  • 容器组织为Pod
  • ReplicaSet确保Pod高可用
  • Deployment管理应用更新
  • Service提供稳定访问点
  • Deployment ——管理——> ReplicaSet ——管理——> Pod <——选择—— Service
  • 各种控制器满足不同应用场景
  • 整个系统通过控制平面协调

从单个容器到完整的云原生应用管理平台,Kubernetes的架构正是为了应对分布式系统的各种挑战而逐步设计和演进的。