Kubernetes
Kubernetes(K8s)可在集群中运行容器,确保声明的副本数量正常运行,并调度 GPU 训练和推理任务。
Kubernetes(常简称为 K8s)是一种开源系统,可在机器集群上运行容器化应用。用户声明工作负载的期望状态,例如要运行哪个容器镜像、要保持多少个副本,以及每个副本需要多少 CPU、内存和 GPU容量;Kubernetes 会持续启动、重启、迁移和扩缩容器,使其符合期望状态。Google 于 2014 年 6 月公布了该项目,其基础是 Google 内部的 Borg 集群管理器;2015 年 7 月发布 1.0 版本时,Google 将其作为新成立的云原生计算基金会的种子项目。Kubernetes 在希腊语中意为舵手,K8s 则用 8 替代了 K 和 s 之间的八个字母。在机器学习运维(MLOps)中,Kubernetes 是运行分布式训练作业、批量推理和模型服务的常用基础层,可在共享硬件上运行这些任务。
架构与控制循环#
一个集群由控制平面和工作节点组成。控制平面包含供所有客户端访问的 API 服务器、存储集群状态的 etcd、负责将新 Pod 分配给节点的调度器,以及各自监视一种对象的控制器。每个工作节点,无论是本地部署的服务器还是云虚拟机,都会运行 kubelet 代理和 containerd 或 CRI-O 等容器运行时。Kubernetes 调度的最小单元是 Pod:一个或多个共享网络地址和存储卷的容器。
工作负载通常以 YAML 编写为对象,并使用 kubectl 应用。Deployment 会保持指定数量的相同 Pod 运行,并在镜像变更时逐步替换它们;Service 为这些 Pod 提供一个稳定地址,并在它们之间分发请求;Job 则会运行 Pod,直到任务完成。控制器会比较声明状态与实际运行状态,并针对任何差异采取行动:
同一个循环也让 Kubernetes 具备自我修复能力。节点故障时,其 Pod 会退出运行状态,控制器便会在健康节点上创建替代 Pod。因容量不足而处于 Pending 状态的 Pod,也是集群自动扩缩容器添加节点的信号。
Kubernetes 在机器学习中的应用#
GPU 通过设备插件提供给 Pod,设备插件会将 GPU 声明为可计数资源,例如 nvidia.com/gpu;GPU 也可通过动态资源分配提供,该功能自 Kubernetes 1.34 起稳定可用,允许 Pod 按 GPU 型号或内存等属性请求设备。NVIDIA GPU Operator 会在 GPU 节点上安装驱动和插件,还可以将一块 GPU 划分为多个实例,或让多个 Pod 分时共享 GPU。OpenAI 于 2021 年报告称,已将单个 Kubernetes 集群扩展至 7,500 个节点,用于训练 GPT-3和 CLIP等模型。
开源项目在 Kubernetes 之上添加了面向机器学习的专用层:
- Kubeflow:在集群上运行分布式 PyTorch 训练、机器学习流水线和笔记本。
- Kueue:对批处理和训练作业进行排队并执行团队配额管理,避免某个团队独占资源,让昂贵的 GPU 保持繁忙。
- KServe:通过自动扩缩的端点提供模型服务,包括在模型空闲时缩容至零。
- 水平 Pod 自动扩缩器:根据 CPU 使用率或队列长度等自定义指标增加或减少推理副本,从而在流量变化时保持延迟稳定。
Job 是运行一次性 GPU 任务(例如批量推理)最简单的方式。Ultralytics 官方 Docker 镜像已包含 yolo 命令和 YOLO26 nano权重,因此这个 Job 只需设置命令并申请一块 GPU:
apiVersion: batch/v1
kind: Job
metadata:
name: yolo26-predict
spec:
backoffLimit: 2 # retry a failed pod at most twice
template:
spec:
restartPolicy: Never
containers:
- name: yolo
image: ultralytics/ultralytics:latest
command: ["yolo", "predict", "model=yolo26n.pt", "source=https://ultralytics.com/images/bus.jpg"]
resources:
limits:
nvidia.com/gpu: 1 # schedule only onto a node with a free GPU使用 kubectl apply -f job.yaml 提交任务后,调度器会将 Pod 安排到有空闲 GPU 的节点上;kubectl logs job/yolo26-predict 则会打印预测模式下的目标检测结果。训练 Job 遵循相同模式,并为检查点添加持久卷;此外,还会在 /dev/shm 处添加内存卷,供 PyTorch数据加载器工作进程使用。
Kubernetes、Docker 与无服务器架构的对比#
- Docker:构建镜像并在一台机器上运行容器。Kubernetes 则在多台机器之间调度容器;从 1.24 版本起,它通过 containerd 或 CRI-O 运行由 Docker 构建的镜像,而不再使用 Docker Engine。
- 无服务器计算:Google Cloud Run 和 AWS Lambda 等服务完全隐藏集群,按请求计费;Knative 则将同样的缩容至零模式带到 Kubernetes 集群中。
- 托管 Kubernetes:Google Kubernetes Engine(GKE)、Amazon Elastic Kubernetes Service(EKS)和 Azure Kubernetes Service(AKS)会为客户运行控制平面;GKE Autopilot 还会管理工作节点。










