Kubernetes (K8s) 通俗原理解析:算力中心的"超级调度员"
在算力中心,我们可能有成百上千台服务器。如果还在一台台机器上手动跑程序,那运维人员得累死。Kubernetes (K8s) 就是为了解决这个问题而生的。
1. 什么是 K8s?(通俗比喻)
我们可以把 算力中心 想象成一个 繁忙的港口。
- 服务器 (Node) :就是 货船。有的船大(高性能 GPU 机器),有的船小(普通 CPU 机器)。
- 应用/任务 (Pod) :就是 集装箱。里面装着我们要跑的模型训练任务、Web 服务或者数据库。
- Kubernetes (K8s) :就是 港口调度指挥中心。
K8s 的核心工作:
指挥中心(K8s)不关心集装箱里装的是什么(是 PyTorch 还是 TensorFlow),它只关心:
- 调度:"这个集装箱(任务)需要 8块 H800 显卡,那艘大船(Node A)还有空位,把它吊过去。"
- 自愈:"哎呀,3号船(Node C)坏了!快把船上的集装箱(任务)全部转移到 4号船上去,别耽误客户发货。"
- 扩缩容:"双十一要到了,货物太多,赶紧多叫几艘船来(自动扩容)。"
2. 核心概念速记
在 K8s 的世界里,有几个词你会天天听到:
(1) Pod (豆荚/集装箱) ------ 最小的原子单位
- K8s 不直接管理程序,它管理 Pod。
- 一个 Pod 就像一个"小班级",里面可以是一个容器(Container),也可以是几个关系紧密的容器。它们共享网络和存储。
- 场景: 你提交一个 AI 训练任务,就是一个 Pod。
(2) Node (节点) ------ 干活的工人/机器
- 这就是真实的物理机或者虚拟机。
- Master Node (控制节点):工头,只发号施令。
- Worker Node (工作节点):搬砖的,负责真正跑 Pod。
(3) Deployment (部署) ------ 无状态任务管家
- 这是用来管理 Web 服务这种"无状态"应用的。
- 你告诉它:"给我保持 3 个 Nginx 副本活着"。
- 它就会盯着,死了一个补一个,多了一个杀一个。
(4) StatefulSet (有状态集) ------ 有状态任务管家
- 这是用来管理数据库、Redis 这种"有状态"应用的。
- 它保证 Pod 有固定的名字(Web-0, Web-1),数据不会丢,启动顺序也有讲究。
(5) Service (服务) ------ 前台接待/负载均衡
- Pod 的 IP 是会变的(船会换,集装箱位置会变)。
- Service 就是一个固定电话号码。外部访问这个号码,K8s 会自动把电话转接到当前活着的 Pod 上。
3. 算力中心运维实战场景
场景一:GPU 资源自动调度
痛点 :以前,用户 A 要跑大模型,得问运维:"哪台机器有 8 张空闲的卡?"运维得去查 Excel 表。
K8s 方案 :
用户提交任务(YAML描述文件)时写上:nvidia.com/gpu: 8。
K8s 调度器(Scheduler)会自动扫描整个集群,找到满足条件的节点,自动把 Pod 扔过去跑。如果没有满足的节点,就让任务排队(Pending)。
场景二:任务断点续训(故障自愈)
痛点 :跑了 3 天的模型,机器突然断电,由于没做容灾,任务挂了,3 天白跑。
K8s 方案 :
配置好 Checkpoint 挂载到共享存储(如 Alluxio/HDFS)。
当 K8s 发现节点挂了(NotReady),它会自动在另一台健康的节点上重新启动这个 Pod。Pod 启动后读取 Checkpoint,从昨天的进度继续跑,而不是从头开始。
小贴士:什么是 Checkpoint?
Checkpoint(检查点)就像游戏的"存档"。在 AI 训练中,它通常包含:
- 模型参数 (Weights):模型当前学到的"脑子"。
- 优化器状态 (Optimizer State):学习的"惯性"和方向(如动量)。
- 当前的轮数 (Epoch/Step) :已经学到第几课了。
有了这些,即使程序崩了,也能读取存档,无缝接着训练。
场景三:多租户资源隔离(Namespace)
痛点 :开发组和测试组共用一堆机器,经常出现"开发组把显存占满了,测试组没法测"的情况。
K8s 方案:
- 给开发组创建 Namespace
dev,配额(Quota)100 张卡。 - 给测试组创建 Namespace
test,配额 50 张卡。 - 大家互不干扰,谁也超不过自己的配额。
总结
K8s 不是用来把简单事情搞复杂的,它是用来把复杂事情标准化的 。
在算力中心,它把成百上千台异构的服务器整合成了一台巨大的超级计算机。用户不需要关心我在哪台机器上跑,只需要关心"给我多少资源"。