Skip to content

uat2-gpu 集群: 122.36 节点修复 + HAMi 部署 + AMD GPU 测试

日期: 2026-08-17 集群: uat2-gpu (4节点 RKE2 HA) | szb122035/36/37 + szb122009 K8s 版本: v1.35.6+rke2r1 HAMi 版本: v2.6.1


1. 122.36 节点标签修复

问题

122.36 节点缺少 worker 角色标签,仅有 control-plane,etcd

修复

bash
kubectl label node szb122036.local node-role.kubernetes.io/worker=true

结果

节点角色Internal-IP
szb122009worker192.168.122.9
szb122035control-plane,etcd,worker192.168.122.35
szb122036.localcontrol-plane,etcd,worker192.168.122.36
szb122037.localcontrol-plane,etcd,worker192.168.122.37

所有节点 ExternalIP 均为 <none>(内网部署正常现象)。


2. 122.9 AMD GPU 检测

访问方式

122.9 SSH 未开启,通过 K8s API + 特权 Pod 检测。

GPU 硬件信息

属性
PCI 地址0000:04:00.0
Vendor/Device1002:744C (AMD)
Subsystem1DA2:471E (Sapphire)
GPU 型号AMD Radeon RX 7900 XTX
VRAM24 GB GDDR6
GPU 最大频率2371 MHz (boost)
驱动amdgpu (kernel module)
KFD/dev/kfd ✓ (ROCm 兼容)
DRIcard1, renderD128
待机功耗/温度17W / 36°C

3. HAMi v2.6.1 部署

Harbor 镜像

镜像Tag
cnrancher/mirrored-projecthami-hamiv2.6.1
cnrancher/mirrored-projecthami-kube-schedulerv1.35.4
cnrancher/mirrored-liangjw-kube-webhook-certgenv1.1.1

部署命令

bash
# 手动创建 TLS Secret(因 webhook job 在 122.9 无法连接 K8s API 10.43.0.1:443)
openssl req -x509 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt -days 3650 -nodes \
  -subj "/CN=hami-scheduler.hami-system.svc" \
  -addext "subjectAltName=DNS:hami-scheduler.hami-system.svc,DNS:127.0.0.1"

kubectl create ns hami-system
kubectl -n hami-system create secret tls hami-scheduler-tls \
  --cert=tls.crt --key=tls.key

# Helm 安装
helm install hami /root/hami/hami -n hami-system \
  -f /root/hami/hami-values.yaml \
  --kubeconfig /etc/rancher/rke2/rke2.yaml \
  --kube-insecure-skip-tls-verify --no-hooks

Values Override (hami-values.yaml)

yaml
version: "v2.6.1"
scheduler:
  kubeScheduler:
    image: 192.168.122.156:30000/cnrancher/mirrored-projecthami-kube-scheduler
    imageTag: "v1.35.4"
  extender:
    image: "192.168.122.156:30000/cnrancher/mirrored-projecthami-hami"
  patch:
    enabled: false
  nodeSelector:
    node-role.kubernetes.io/control-plane: "true"
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      operator: Exists
      effect: NoSchedule
devicePlugin:
  image: "192.168.122.156:30000/cnrancher/mirrored-projecthami-hami"
  monitorimage: "192.168.122.156:30000/cnrancher/mirrored-projecthami-hami"
  deviceSplitCount: 1
  nvidianodeSelector:
    gpu: "on"
  tolerations:
    - operator: Exists

HAMi Device Plugin AMD 兼容性问题

HAMi v2.6.1 device plugin 仅含 NVIDIA 二进制,在 AMD 节点上 CrashLoopBackOff:

Detected non-NVML platform: could not load NVML library
Incompatible platform detected

解决: 移除 122.9 的 gpu=on 标签,手动 patch 节点注册 amd.com/gpu 资源。


4. AMD GPU 资源注册

bash
# 移除 gpu=on 标签
kubectl label node szb122009 gpu-

# 手动 patch 节点
kubectl patch node szb122009 --type=merge --subresource=status \
  -p '{"status":{"capacity":{"amd.com/gpu":"1"},
       "allocatable":{"amd.com/gpu":"1"}}}'

⚠️ 手动 patch 在 kubelet 重启后会丢失,建议部署 rocm/k8s-device-plugin 实现持久化。


5. GPU 功能验证

测试 Pod(特权 + GPU 设备挂载)

yaml
apiVersion: v1
kind: Pod
metadata:
  name: amd-gpu-test
spec:
  nodeName: szb122009
  tolerations: [{operator: Exists}]
  containers:
  - name: test
    image: 192.168.122.156:30000/cnrancher/mirrored-projecthami-hami:v2.6.1
    command: ["/bin/sh", "-c", "sleep 3600"]
    securityContext: {privileged: true}
    resources:
      limits: {amd.com/gpu: "1"}
    volumeMounts:
    - {name: dev-dri, mountPath: /dev/dri}
    - {name: dev-kfd, mountPath: /dev/kfd}
    - {name: host-sys, mountPath: /host-sys, readOnly: true}
  volumes:
  - {name: dev-dri, hostPath: {path: /dev/dri}}
  - {name: dev-kfd, hostPath: {path: /dev/kfd}}
  - {name: host-sys, hostPath: {path: /sys}}

验证结果 ✅

/dev/dri/card1          ✓ (226:1)
/dev/dri/renderD128     ✓ (226:128)
/dev/kfd                ✓ (235:0)
VRAM Total: 25,753,026,560 bytes (24 GB) ✓
KFD GPU ID: 45442       ✓
GPU Clock: 500MHz / 2371MHz (boost) ✓
Mem Clock: 456MHz / 772MHz / 1249MHz ✓
Power: 17W (idle), Temp: 36°C ✓

6. 小模型测试(待完成)

当前限制

  • 无互联网访问,无法拉取 ROCm 推理镜像(rocm/pytorch, ollama:rocm 等)
  • Harbor 中无 ML 推理框架镜像

后续步骤

Step 1: 在有网机器拉取并推送镜像:

bash
docker pull ollama/ollama:0.6.8-rocm
docker tag ollama/ollama:0.6.8-rocm 192.168.122.156:30000/cnrancher/ollama:rocm
docker push 192.168.122.156:30000/cnrancher/ollama:rocm

Step 2: 部署 Ollama Pod(注意 HSA_OVERRIDE_GFX_VERSION=11.0.0 for RX 7900 XTX/gfx1100):

yaml
apiVersion: v1
kind: Pod
metadata:
  name: ollama-amd
spec:
  nodeName: szb122009
  tolerations: [{operator: Exists}]
  containers:
  - name: ollama
    image: 192.168.122.156:30000/cnrancher/ollama:rocm
    securityContext: {privileged: true}
    env:
    - {name: HSA_OVERRIDE_GFX_VERSION, value: "11.0.0"}
    - {name: OLLAMA_HOST, value: "0.0.0.0:11434"}
    resources:
      limits: {amd.com/gpu: "1"}
    volumeMounts:
    - {name: dev-dri, mountPath: /dev/dri}
    - {name: dev-kfd, mountPath: /dev/kfd}
  volumes:
  - {name: dev-dri, hostPath: {path: /dev/dri}}
  - {name: dev-kfd, hostPath: {path: /dev/kfd}}

Step 3: 测试小模型:

bash
kubectl exec ollama-amd -- ollama pull qwen2.5:3b
kubectl exec ollama-amd -- ollama run qwen2.5:3b "你好,请介绍一下自己"

7. 集群最终状态

节点角色IPGPU
szb122009worker192.168.122.91× RX 7900 XTX (24GB)
szb122035CP,Etcd,Worker192.168.122.35-
szb122036.localCP,Etcd,Worker192.168.122.36-
szb122037.localCP,Etcd,Worker192.168.122.37-

HAMi: scheduler ✅ running on 122.35 | device-plugin ⚠️ NVIDIA-only (AMD 节点需单独部署)


8. 已知限制与后续步骤

  1. HAMi Device Plugin 不支持 AMD: 需部署 rocm/k8s-device-plugin 实现 amd.com/gpu 自动注册
  2. 手动 Patch 不持久: kubelet 重启后需重新 patch,建议部署 AMD device plugin
  3. 122.9 SSH 不可达: 所有操作需通过 K8s API
  4. 无互联网: 无法获取 ROCm 推理镜像,需通过离线方式导入
  5. 清理: 临时文件 /root/hami/、debug pod、临时证书

命令速查

bash
# 重新 patch GPU 资源
kubectl patch node szb122009 --type=merge --subresource=status \
  -p '{"status":{"capacity":{"amd.com/gpu":"1"},"allocatable":{"amd.com/gpu":"1"}}}'

# HAMi 升级
helm -n hami-system upgrade hami /root/hami/hami -f /root/hami/hami-values.yaml \
  --kubeconfig /etc/rancher/rke2/rke2.yaml --kube-insecure-skip-tls-verify

9. vLLM vGPU 部署方案

架构

  • vLLM Pod 1: DeepSeek-R1-Distill-Qwen-1.5B (~3GB VRAM, 15% GPU)
  • vLLM Pod 2: Qwen2.5-3B-Instruct (~6GB VRAM, 30% GPU)
  • Open WebUI: 前端界面 (CPU only)

部署文件

vllm-deploy/
├── Dockerfile              # vLLM + ROCm 镜像构建
├── build-and-push.sh       # 构建并推送镜像
├── deploy.sh               # 一键部署脚本
├── vllm-deepseek.yaml      # DeepSeek 部署
├── vllm-qwen.yaml          # Qwen 部署
├── open-webui.yaml         # Open WebUI 部署
└── README.md               # 详细文档

快速开始

  1. 在有外网机器上构建镜像: cd vllm-deploy && ./build-and-push.sh
  2. 在 122.37 上部署: cd vllm-deploy && ./deploy.sh
  3. 访问 Open WebUI: http://192.168.122.9:30080

注意事项

  • vLLM 对 AMD RDNA3 (gfx1100) 支持为实验性
  • 使用 HSA_OVERRIDE_GFX_VERSION=11.0.0 启用兼容模式
  • 通过 vLLM --gpu-memory-utilization 实现 vGPU 内存隔离
  • 手动 patch 的 GPU 资源在 kubelet 重启后需重新注册

详见 vllm-deploy/README.md