实验 2: 本地 Fake GPU 安装 HAMi
本实验将引导你搭建一个纯本地 Kubernetes 集群——使用 OrbStack(macOS)或 kind(Linux/Ubuntu)——配合 run-ai/fake-gpu-operator,然后在线安装 HAMi。
这个实验不需要真实 NVIDIA GPU,适合用于课堂预习、讲解 HAMi 组件组成、验证 GPU Pod 调度流程,以及在个人电脑上快速熟悉 HAMi 的基础使用方式。
你将得到什么
完成本实验后,你会得到一个本地 Kubernetes 集群:
- fake-gpu-operator 在 CPU 节点上模拟
nvidia.com/gpu资源 - HAMi scheduler、admission webhook 等控制面组件正常运行
- 普通 Pod 可以通过
nvidia.com/gpu申请模拟 GPU - 可以观察 fake GPU 资源从节点发现、Pod 申请、调度到运行的完整链路
fake GPU 不能代表真实 GPU 的显存隔离、算力隔离、CUDA 运行时和驱动能力。本实验用于理解 HAMi 组成和基础调度链路;涉及真实显存切分、nvidia.com/gpumem、nvidia.com/gpucores、CUDA 程序运行和性能隔离时,仍需要真实 NVIDIA GPU 环境。
安装全景图
整个本地安装过程分 7 步:
| 步骤 | 目的 | 解决什么问题 |
|---|---|---|
| 搭建并确认环境 | 创建/验证集群,检查 kubectl 和 Helm | 确保 Kubernetes 集群可用 |
| 安装 fake-gpu-operator | 模拟 NVIDIA GPU 资源 | 让无 GPU 节点也能上报 nvidia.com/gpu |
| 安装 HAMi | 部署 HAMi 控制面 | 观察 HAMi scheduler、webhook 等组件 |
| 安装 Prometheus | 部署监控栈 | 采集 GPU 指标,给 HAMi WebUI 提供数据源 |
| 运行模拟 GPU 工作负载 | 验证调度链路 | 体验 Pod 申请 GPU 后被调度运行 |
| 安装 HAMi WebUI | 部署可视化管理界面 | 图形化查看 GPU 节点、资源分配和使用趋势 |
| 观察 HAMi 和 fake GPU | 理解组件职责边界 | 明确哪些能力需要真实 GPU |
前提条件
- macOS (OrbStack)
- Linux (Ubuntu + kind)
- macOS,Intel 或 Apple Silicon 均可
- 已安装 OrbStack 并启用内置 Kubernetes
- 能访问 GitHub、GHCR 和 HAMi Helm 仓库
- 本机至少 4 CPU、8 GB 内存可用
OrbStack 自带 Kubernetes(基于 k3s),无需额外安装 kind 或 Docker Desktop。资源占用更少,启动更快,macOS 上做本地实验首选。
检查 Helm(后面安装 fake-gpu-operator 和 HAMi 都需要):
helm version
如果 Helm 未安装:
brew install helm
- Ubuntu 20.04 LTS 或更高版本,x86_64 或 ARM64
- 已安装 Docker Engine 且正在运行
- 已安装
kindv0.20.0 或更高版本 - 已安装
kubectl - 已安装 Helm 3.x 或更高版本
- 能访问 GitHub、GHCR 和 HAMi Helm 仓库
- 本机至少 4 CPU、8 GB 内存可用
kind(Kubernetes IN Docker)在 Docker 容器内运行完整的 Kubernetes 集群。它适用于任何安装了 Docker 的 Linux 发行版,无需特殊系统集成,是 Linux 上本地 Kubernetes 开发的标准工具。
如需安装前置依赖,请执行以下命令:
# Docker Engine
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
# kind
KIND_VERSION=v0.23.0
curl -Lo ./kind "https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-linux-amd64"
chmod +x ./kind && sudo mv ./kind /usr/local/bin/kind
# kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl && rm kubectl
# Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
步骤 1: 搭建并确认本地环境
- macOS
- Linux
OrbStack 的 Kubernetes 在你通过 OrbStack UI 启用后会自动运行。验证集群是否就绪:
kubectl version
输出示例:
Client Version: v1.33.9
Kustomize Version: v5.6.0
Server Version: v1.33.9+orb1
Server Version 中的 +orb1 后缀标识这是 OrbStack 内置的 Kubernetes 发行版。
查看集群节点:
kubectl get nodes -o wide
输出示例:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
orbstack Ready control-plane,master 148d v1.33.9+orb1 192.168.139.2 <none> OrbStack 7.0.5-orbstack-00330-ge3df4e19b0a0-dirty docker://29.4.0
创建本地 Kubernetes 集群:
kind create cluster --name hami-lab
输出示例:
Creating cluster "hami-lab" ...
✓ Ensuring node image (kindest/node:v1.32.2) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-hami-lab"
--name hami-lab 标志指定了集群名称。生成的节点将命名为 hami-lab-control-plane。kind 会自动将 kubectl 上下文设置为新集群。
验证集群是否就绪:
kubectl version
输出示例:
Client Version: v1.32.2
Kustomize Version: v5.5.0
Server Version: v1.32.2
查看集群节点:
kubectl get nodes -o wide
输出示例:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
hami-lab-control-plane Ready control-plane 2m v1.32.2 172.18.0.2 <none> Debian GNU/Linux 12 (bookworm) 6.5.0-41-generic containerd://1.7.18
设置 NODE_NAME 变量
本实验后续部分使用 NODE_NAME shell 变量来避免硬编码节点名称。在这里设置一次,后续所有命令都会自动使用:
NODE_NAME=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
echo "NODE_NAME=${NODE_NAME}"
| 平台 | 示例值 |
|---|---|
| macOS | orbstack |
| Linux | hami-lab-control-plane |
从这里开始,所有命令在 macOS 和 Linux 上完全一致。你唯一会注意到的区别是示例输出中的节点名称。
步骤 2: 安装 fake-gpu-operator
fake-gpu-operator 会在没有 NVIDIA GPU 的节点上模拟 GPU 资源,并把节点容量写成 nvidia.com/gpu。这一步替代了真实 GPU 环境中的 NVIDIA GPU Operator、驱动、device-plugin 和 DCGM 指标采集链路。