NVIDIA DGX Spark (ARM64/Blackwell) Kubernetes 集群 + GPU Operator 完整部署指南

摘要 :本文详细记录了在最新的 NVIDIA DGX Spark 服务器(搭载 Grace Blackwell GB10 芯片,ARM64 架构)上从零部署 Kubernetes 集群、Cilium 网络插件及 NVIDIA GPU Operator 的全过程。文档重点解决了国产化网络环境下的镜像拉取问题、DGX OS 的驱动兼容性问题以及 ARM64 架构下的 CDI 配置难题。


一、 环境背景与挑战

在顶级 AI 算力平台 DGX Spark 上部署 K8s 与普通 x86 服务器有显著不同,主要面临以下挑战:

  1. 架构特殊:基于 ARM64 架构,需确保所有组件镜像支持该架构。
  2. 硬件超前:Grace Blackwell (GB10) 需要较新的 Container Device Interface (CDI) 支持。
  3. 系统限制:DGX OS (Ubuntu 定制版) 预装了特定版本的 NVIDIA 驱动,K8s 不能覆盖安装。
  4. 网络环境 :国内无法访问 registry.k8s.ioquay.ionvcr.io,必须配置镜像加速。

1.1 硬件与软件信息

  • 硬件型号:NVIDIA DGX Spark
  • CPU 架构:aarch64 (ARM64)
  • GPU 型号:NVIDIA GB10 (Grace Blackwell)
  • 操作系统:Ubuntu 24.04 LTS (DGX OS)
  • 内核版本:6.14.0-1015-nvidia
  • Kubernetes 版本:v1.31.x

二、 系统前置准备 (System Preparation)

在执行 kubeadm init 之前,必须对 OS 进行基础配置。

2.1 关闭 Swap 与 配置内核模块

bash 复制代码
# 1. 临时关闭 Swap
sudo swapoff -a
# 注意:生产环境请注释掉 /etc/fstab 中的 swap 行以永久生效

# 2. 加载必要的内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 3. 配置系统参数 (开启 IP 转发)
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

2.2 配置 Containerd (关键步骤)

DGX 环境下,必须正确配置 containerd 的 Cgroup 驱动,并配置沙箱镜像以适应国内网络。

bash 复制代码
# 1. 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 2. 开启 SystemdCgroup (K8s 必需)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# 3. 修改 Sandbox 镜像为国内源 (DaoCloud 加速)
sudo sed -i 's|registry.k8s.io/pause:3.8|m.daocloud.io/registry.k8s.io/pause:3.8|g' /etc/containerd/config.toml

# 4. 重启服务
sudo systemctl restart containerd

三、 Kubernetes 集群初始化

3.1 初始化 Control Plane

bash 复制代码
# 指定 Pod 网段 (需与后续 Cilium 配置一致)
sudo kubeadm init --pod-network-cidr=10.0.0.0/8 --kubernetes-version=v1.31.14 \
  --image-repository registry.aliyuncs.com/google_containers

3.2 配置 Kubectl

bash 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.3 解除 Master 节点污点

由于 DGX 通常作为单机集群使用,需要允许 Pod 调度到 Master 节点:

bash 复制代码
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

四、 部署 Cilium 网络插件 (国内加速版)

由于 cilium-cli 下载困难且 quay.io 镜像拉取慢,这里采用 Helm + 国内镜像源的方式部署。

4.1 安装 Helm

bash 复制代码
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

4.2 安装 Cilium

使用 m.daocloud.io 代理加速镜像拉取:

bash 复制代码
# 添加仓库
helm repo add cilium https://helm.cilium.io/
helm repo update

# 安装 (指定镜像源)
helm install cilium cilium/cilium --version 1.16.1 \
   --namespace kube-system \
   --set ipam.mode=cluster-pool \
   --set ipam.operator.clusterPoolIPv4PodCIDRList="10.0.0.0/8" \
   --set kubeProxyReplacement=true \
   --set operator.replicas=1 \
   --set image.repository="m.daocloud.io/quay.io/cilium/cilium" \
   --set image.useDigest=false \
   --set operator.image.repository="m.daocloud.io/quay.io/cilium/operator" \
   --set operator.image.useDigest=false

4.3 🚑 故障排查:解决 "Node NotReady"

现象 :Cilium Pod 已 Running,但 kubectl get nodes 显示 NotReady,报错 cni plugin not initialized
原因 :Kubelet 启动时 CNI 配置尚未生成,生成后 Kubelet 未自动感知。
解决方案

bash 复制代码
# 组合拳重启:强制 Containerd 加载 CNI 配置,并重启 Kubelet 汇报状态
sudo systemctl restart containerd
sudo systemctl restart kubelet

执行后稍等片刻,节点状态应变为 Ready


五、 部署 NVIDIA GPU Operator (核心难点)

这是最关键的一步。DGX OS 不能重装驱动,且 ARM64 架构需要开启 CDI。

5.1 清理旧环境 (防止冲突)

如果之前尝试安装失败,必须彻底清理全局资源,否则会报 invalid ownership metadata

bash 复制代码
# 1. 删除命名空间
kubectl delete namespace gpu-operator --wait=false

# 2. 清理 ClusterRole 和 Binding (这些是全局资源,delete ns 删不掉)
kubectl delete clusterrole gpu-operator
kubectl delete clusterrolebinding gpu-operator
kubectl delete clusterrole node-feature-discovery
kubectl delete clusterrolebinding node-feature-discovery
kubectl delete crd clusterpolicies.nvidia.com

5.2 使用优化后的 Helm 命令安装

配置详解

  • driver.enabled=false: 关键,直接使用宿主机预装的 DGX 驱动。
  • cdi.enabled=true: 关键,Blackwell/ARM64 架构必需,使用 CDI 机制挂载设备。
  • toolkit.env: 修正 Containerd 配置文件路径。
  • node-feature-discovery.image: 替换为国内加速镜像。
bash 复制代码
# 添加仓库
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update

# 部署
helm install --wait --generate-name \
    -n gpu-operator --create-namespace \
    nvidia/gpu-operator \
    --set driver.enabled=false \
    --set toolkit.enabled=true \
    --set cdi.enabled=true \
    --set cdi.default=true \
    --set mig.strategy=single \
    --set toolkit.env[0].name=CONTAINERD_CONFIG \
    --set toolkit.env[0].value=/etc/containerd/config.toml \
    --set toolkit.env[1].name=CONTAINERD_SOCKET \
    --set toolkit.env[1].value=/run/containerd/containerd.sock \
    --set node-feature-discovery.image.repository=m.daocloud.io/registry.k8s.io/nfd/node-feature-discovery

5.3 验证 Operator 状态

bash 复制代码
watch kubectl get pods -n gpu-operator

当看到 nvidia-device-plugin-daemonset 状态为 Running 时,说明显卡挂载成功。


六、 算力验证 (Verification)

由于 nvcr.io 的 sample 镜像在国内极难拉取,我们使用 Docker Hub 的官方基础镜像进行验证。

6.1 创建测试 YAML

新建文件 gpu-test.yaml

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: gpu-test-simple
spec:
  restartPolicy: Never
  containers:
  - name: cuda-container
    # 使用 Docker Hub 官方镜像 + DaoCloud 加速
    image: m.daocloud.io/docker.io/nvidia/cuda:12.4.1-base-ubuntu22.04
    resources:
      limits:
        nvidia.com/gpu: 1
    command: ["/bin/sh", "-c"]
    # 运行 nvidia-smi 查看显卡信息
    args: ["nvidia-smi"]

6.2 运行测试

bash 复制代码
kubectl apply -f gpu-test.yaml
sleep 15
kubectl logs gpu-test-simple

6.3 成功标志

输出结果中应包含 NVIDIA GB10 显卡信息:

text 复制代码
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05              Driver Version: 580.95.05      CUDA Version: 13.0     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                  Persistence-M| Bus-Id          Disp.A | Volatile Uncorr. ECC |
|=========================================+========================+======================|
|   0  NVIDIA GB10                    On  |   0000000F:01:00.0 Off |                  N/A |
+-----------------------------------------+------------------------+----------------------+

七、 总结与避坑指南

  1. 关于网络 :不要尝试直连 registry.k8s.ionvcr.io,即使是加速器有时也不稳定。使用 m.daocloud.io 前缀配合 Docker Hub 基础镜像最稳妥。
  2. 关于 DGX 驱动 :永远不要在 GPU Operator 中开启 driver.enabled=true,否则会覆盖 DGX OS 的优化驱动,导致系统不稳定。
  3. 关于残留清理 :Helm uninstall 往往删不干净 ClusterRole,重新安装前务必手动 kubectl delete clusterrole ...
  4. 关于 ARM64 :务必确认所有组件(特别是 Cilium 和 NFD)的镜像都支持 arm64 架构。

希望这篇文档能帮助大家在国产化网络环境下顺利驯服 DGX "怪兽"。

相关推荐
蝎子莱莱爱打怪1 小时前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
武子康4 小时前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP18 小时前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库19 小时前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟19 小时前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人20 小时前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
计算机程序猿学长20 小时前
大数据毕业设计-基于django的音乐网站数据分析管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
大数据·django·课程设计
B站计算机毕业设计超人20 小时前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
十月南城20 小时前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
中烟创新20 小时前
灯塔AI智能体获评“2025-2026中国数智科技年度十大创新力产品”
大数据·人工智能·科技