以通俗易懂的方式 认识 Kubernetes(k8s)
第一步:问题是什么?
想象一下,你是一个公司的运维,公司有几十台服务器,要跑上百个应用。每个应用被打包成一个个容器(比如 Docker 容器)。一开始你手动把容器放到服务器上,但很快你发现:
- 某台服务器宕机了,上面的容器全挂了,你得手动重启到别的机器。
- 某个应用访问量暴增,你需要快速启动更多副本,但不知道该放哪台机器有空。
- 你想更新应用版本,得一个个容器停止、启动,期间服务会中断。
- 容器之间要互相通信,但每次重启 IP 地址都会变,配置很麻烦。
你头都大了,心想:能不能有个系统,自动帮我管这些事?这就是 Kubernetes 要解决的问题。
第二步:如果从零设计这样一个系统,我们需要什么?
我们从头思考,假如让你设计一个系统来管理成百上千个容器,你需要哪些最基本的功能?
-
容器该放哪台机器?
你得有一个“调度员”,他知道每台机器的资源(CPU、内存)还剩多少,然后为新来的容器找个合适的家。 -
怎么保证容器一直运行?
容器可能崩溃,机器可能断电,你需要一个“监工”,时刻盯着,一旦有容器挂了,马上在别处重启一个。 -
容器之间怎么找到对方?
容器的 IP 是动态的,你不能写死配置。需要一个“服务注册表”,每个容器启动时告诉系统“我叫什么,我在哪”,其他容器通过名字就能找到它,系统还要负责把请求分发给多个副本(负载均衡)。 -
容器需要存储数据怎么办?
有些容器要存数据库文件,重启后数据不能丢。你需要“存储管理”,把一块硬盘挂给容器,容器换了机器也能带着这块硬盘走。 -
应用的配置和密码放哪?
你不能把配置写死在容器里,因为不同环境(测试、生产)配置不一样。密码更不能明文放。你需要一个“配置中心”,让容器启动时动态获取这些信息。 -
应用怎么升级而不中断服务?
你想把旧版本换成新版本,不能一下子全停。你需要“滚动更新”,逐个替换,同时保证服务在线。 -
如果访问量大了怎么办?
需要“自动伸缩”,监控到负载高了,就多启动几个副本;低了就减少,省资源。
你看,这些基本需求,就是 Kubernetes 设计的出发点。
第三步:Kubernetes 是怎么满足这些需求的?——核心设计思想
Kubernetes 的设计其实很巧妙,它用了几个简单但强大的原理:
1. 你说“要什么”,而不是“怎么做”
你告诉系统:“我要运行 3 个 nginx 容器,每个需要 1 核 CPU、1G 内存。” 你不需要指定具体放哪台机器,怎么启动。系统会自动想办法让当前状态变成你说的那样。这叫声明式 API,就像你告诉餐厅你想吃什么,后厨自己去配菜、烹饪。
2. 永远在“纠正”状态
系统里有一个个“控制器”,它们像钟表一样不停地检查:现在的容器数量是 3 个吗?如果不是,就启动或停止一些。这叫控制循环。所以就算有人手动删了一个容器,控制器会马上补一个,保证总数不变。
3. 容器不是单独跑的,而是“成组”跑
有时候两个容器需要紧密合作,比如一个 Web 容器和一个日志收集容器,它们要共享网络和磁盘。Kubernetes 把这样的组合叫做 Pod(豆荚),一个 Pod 里的容器总是被调度到同一台机器上,共享 IP 和存储,就像一个小团队。
4. 给所有东西贴标签
每个 Pod 可以贴上标签,比如“app=nginx”“env=prod”。然后其他组件通过标签选择器来关联,比如一个服务说“我要找所有带 app=nginx 标签的 Pod”。这是一种非常灵活的关联方式,解耦了组件。
5. 层层抽象
Kubernetes 不是把所有功能混在一起,而是一层一层叠上去:
- Pod 是最小单元。
- 通过 ReplicaSet 保证 Pod 的数量。
- 通过 Deployment 实现 ReplicaSet 的滚动更新。
- 通过 Service 给一组 Pod 提供稳定的访问入口。
每一层解决一个问题,组合起来就很强大。
第四步:用简单的人体比喻看核心组件
我们可以把 Kubernetes 集群想象成一个公司:
- API Server:公司的前台,所有人(用户、其他组件)都通过前台办事。所有请求都要经过他,他也负责把状态记录到公司档案里。
- etcd:公司的档案室,高保密柜子,存放所有信息(比如谁在哪个工位、当前运行什么任务)。数据不会丢。
- Controller Manager:一群监工,每人负责一件事。比如“副本监工”确保每个任务有指定人数,“节点监工”检查哪个工人(机器)生病了。
- Scheduler:调度员,新任务来了,他根据各工位(节点)的资源情况,把任务分给合适的工人。
- Kubelet:每个工位上的小组长,负责接收调度员分配的任务,管理本工位上的容器,并定期向公司汇报本工位的健康状态。
- Kube-proxy:每个工位上的网络管理员,负责让本工位的服务能被其他工位找到,并做负载均衡。
第五步:Kubernetes 的本质是什么?
用第一性原理来看,Kubernetes 本质上是一个分布式操作系统。
- 你把整个集群(几十台机器)看成一台巨大的计算机。
- 这台计算机的 CPU 和内存是所有机器的总和。
- 它的文件系统就是各种持久化存储。
- 它的进程就是一个个 Pod。
- 它的网络端口就是 Service。
- 它的系统调用就是 Kubernetes API。
你只需要告诉这个“大计算机”你要运行什么应用(就像在单机上输入命令),它自己会调度资源、处理故障、应对流量变化,你完全不用关心底层的机器细节。
所以,Kubernetes 的诞生不是偶然,而是从“如何管理大量容器”这个最基本问题出发,一步步设计出来的。它的每个组件都对应一个最基本的需求,每个概念都源自一个简单的逻辑。明白了这些,你就抓住了它的精髓。