HAMi 安装后的集群架构
完成 HAMi 安装后,集群不再是一个普通的 Kubernetes 集群,它变成了一个具备 GPU 虚 拟化能力的 AI 基础设施平台。本文将拆解安装完成后集群中每一层、每一个组件的职责和依赖关系。
5 层架构总览
安装完成后的集群由 5 层组成,每一层为上层提供服务:
从下往上看:
| 层级 | 作用 | 类比 |
|---|---|---|
| Kubernetes 基础设施层 | 容器编排、网络通信、资源管理 | 操作系统 |
| NVIDIA GPU Runtime Stack | 让容器能访问 GPU 硬件 | GPU 驱动程序 |
| GPU 调度层 | GPU 资源切分、共享、调度决策 | 资源管理器 |
| 监控层 | 采集和存储所有组件的指标 | 监控系统 |
| 可视化层 | GPU 资源的可视化管理界面 | 仪表盘 |
这 5 层之间的关系是严格的依赖关系:上层依赖下层,下层不依赖上层。例如 HAMi Scheduler 需要 Kubernetes 提供调度框架扩展点,但 Kubernetes 本身并不关心 HAMi 的存在。
Helm Releases
安装过程中通过 Helm 部署了多个 Release。Helm Release 是什么?你可以把它理解为一个应用包的运行实例,类似于 apt install 安装了一个软件包,或者 docker compose up 启动了一组服务。每个 Release 包含一组 Kubernetes 资源(Pod、Service、ConfigMap 等),可以统一安装、升级和卸载。
执行 helm list -A 可以看到所有 Release:
NAMESPACE NAME CHART STATUS
gpu-operator gpu-operator-xxxxxxxxxx gpu-operator-v25.3.0 deployed
kube-system hami hami-2.9.0 deployed
monitoring prometheus kube-prometheus-stack-75.15.1 deployed
kube-system my-hami-webui hami-webui-x.x.x deployed
各 Release 的职责
| Release | 命名空间 | 职责 | 安装时机 |
|---|---|---|---|
| gpu-operator | gpu-operator | NVIDIA GPU 软件栈的自动化管理,自动部署驱动、工具包、指标采集器 | 安装 Prometheus 后 |
| hami | kube-system | GPU 虚拟化与调度增强,支持显存切分和多 Pod 共享 GPU | 安装 GPU Operator 后 |
| prometheus | monitoring | 集 群监控,采集和存储所有组件的指标数据 | 安装 K8s 后,最先安装的监控组件 |
| my-hami-webui | kube-system | GPU 资源可视化界面,展示 GPU 使用情况和调度状态 | 安装 HAMi 后(可选) |
CNI 插件(Calico)不会出现在
helm list中,因为它是通过kubectl create应用 tigera-operator manifests 安装的,不经过 Helm。
它们之间的安装顺序是有依赖关系的:
Prometheus 必须先于 GPU Operator 和 HAMi WebUI 安装,因为它们都依赖 Prometheus 来采集和提供指标数据。
Pod 详解
安装完成后,集群中运行着大量 Pod。执行 kubectl get pods -A 你会看到类似以下输出。本节将按类别逐一解释每个 Pod 的作用。
K8s 核心组件
这些是 Kubernetes 自身的控制平面组件,在初始化集群时由 kubeadm 创建。
| Pod | 作用 |
|---|---|
| kube-apiserver | Kubernetes 的 API 入口,所有组件(kubectl、scheduler、controller-manager)都通过它通信 |
| kube-scheduler | 决定 Pod 运行在哪个节点上,HAMi Scheduler 作为扩展参与其中 |
| kube-controller-manager | 运行各种控制器(Deployment、ReplicaSet、Node 等),维持集群期望状态 |
| etcd | 分布式键值存储,保存集群所有状态数据(Pod、Service、ConfigMap 等) |
| kube-proxy | 每个 Node 上运行,维护 Service 的网络转发规则(iptables/IPVS) |
| coredns | 集群内部 DNS 服务,为 Service 提供名称解析 |
如果没有它们:整个 Kubernetes 集群无法运行。kube-apiserver 是唯一可以直接操作 etcd 的组件,如果它挂了,整个控制平面瘫痪。
对 AI 基础设施的意义:Kubernetes 是 GPU 工作负载的编排基础。没有 K8s,GPU 任务只能手动分配到机器上运行,无法实现自动调度、弹性伸缩、故障恢复。
网络组件
由 Calico manifests(tigera-operator)创建。
| Pod | 作用 |
|---|---|
| tigera-operator | Deployment,管理 Calico 的生命周期,监听 Installation 资源并部署、调和所有 Calico 组件 |
| calico-node | DaemonSet,每个节点运行一个,负责 Pod 之间的网络连通性、IP 地址管理、路由和网络策略执行 |
| calico-kube-controllers | Deployment,运行 Calico 的控制面逻辑(策略、命名空间、端点同步,IPAM 垃圾回收) |
| calico-typha | Deployment,聚合 datastore watch 连接,避免大规模集群压垮 Kubernetes API |
| csi-node-driver | DaemonSet,Calico 的 CSI 驱动,为高级策略功能挂载 Pod 级别的卷 |
如果没有它们:Pod 之间无法通信。Kubernetes 的 Service 机制完全失效,DNS 解析不通,跨 Pod 的分布式训练无法进行。
对 AI 基础设施的意义:AI 训练经常涉及分布式工作负载(多 Pod 协同训练),网络性能直接影响训练效率。Calico 提供高性能路由(BGP/VXLAN)和 NetworkPolicy 隔离能力,让不同工作负载互不干扰。
NVIDIA GPU Runtime Stack
由 gpu-operator Helm Release 创建。这一层解决的核心问题是:让容器能访问 GPU 硬件。
| Pod | 作用 |
|---|---|
| nvidia-driver-daemonset | DaemonSet,在每个 GPU 节点上安装 NVIDIA 内核驱动。它通过容器化方式管理驱动,避免了手动在宿主机上编译安装驱动的繁琐过程 |
| nvidia-container-toolkit-daemonset | DaemonSet,在每个节点上配置 containerd,让它知道如何把 GPU 设备和库挂进容器。修改 containerd 的配置,注册 nvidia runtime |
| gpu-feature-discovery | DaemonSet,检测本节点 GPU 的型号、显存、算力等信息,以 Label 和 Annotation 的形式写到 Node 对象上,供调度器决策 |
| nvidia-dcgm-exporter | DaemonSet,通过 DCGM(Data Center GPU Manager)采集 GPU 利用率、显存使用、温度、功耗等指标,以 Prometheus 格式暴露 |
| nvidia-operator-validator | DaemonSet,验证 GPU 软件栈是否正常(驱动是否加载、Toolkit 是否配置、节点是否就绪) |
| nvidia-cuda-validator | Job,运行一次后退出,验证 CUDA 运行时是否可用 |
如果没有它们:
- 没有 nvidia-driver-daemonset:GPU 硬件无法被操作系统识别,
nvidia-smi命令不存在 - 没有 nvidia-container-toolkit-daemonset:容器内无法使用 GPU,即使驱动已安装,Pod 里执行
nvidia-smi也会报错 - 没有 gpu-feature-discovery:调度器不知道节点有什么 GPU,无法根据 GPU 型号、显存做调度决策
- 没有 nvidia-dcgm-exporter:Prometheus 没有 GPU 指标数据,无法监控 GPU 使用率
- 没有 validator:无法自动检测 GPU 软件栈的安装问题
对 AI 基础设施的意义:GPU Runtime Stack 是 AI 工作负载的基础设施层。它让 GPU 从"裸机设备"变成"Kubernetes 可管理的资源"。没有这一层,AI 训练和推理任务无法以容器化方式运行。
HAMi 调度组件
由 hami Helm Release 创建。这一层解决的核心问题是:让 GPU 从整卡分配变成可切分、可共享。
| Pod | 作用 |
|---|---|
| hami-scheduler | Deployment,HAMi 调度器。它注册为 Kubernetes Scheduler Extender,参与 Pod 的 GPU 调度决策。支持 binpack/spread 策略、优先级调度、GPU 资源配额等高级功能 |
| hami-device-plugin | DaemonSet(每个 GPU 节点一个),替代 NVIDIA 原生 device-plugin。它向 kubelet 注册自定义 GPU 资源(显存、算力),并在 Pod 创建时执行显存切分和设备挂载 |