前提条件

创建您的 NGC 个人密钥

您需要创建一个 NGC 个人密钥才能将 UCS Tools 与 NGC 一起使用。请勿将 NGC 个人密钥与 NGC API 密钥混淆。NGC 个人密钥以 “nvapi-” 开头,允许您设置作用域。请按照以下步骤获取具有必要作用域的 NGC 个人密钥

  • 登录 NGC

  • 点击右上角的个人资料,然后选择 “设置”

  • 点击 “生成个人密钥”

  • 您将看到一个对话框,您可以在其中创建密钥。添加以下作用域

    • 私有仓库

    • NGC 目录

它应该看起来类似于下面显示的图像

Generating the NGC Personal Key with scopes added

一旦您拥有了具有必要作用域的 NGC 个人密钥,下一步是在 UCS Tools 中通过运行以下命令设置此密钥。

ucf_ms_builder_cli registry repo set-api-key -a $NGC_PERSONAL_KEY

部署系统

这些说明需要在您的系统上安装 Ubuntu Server LTS 22.04。

开发者系统的 MicroK8s

本文档中的说明已在以下环境中测试通过:

  • Ubuntu: 22.04

安装 MicroK8s

使用 MicroK8s 安装并等待 Kubernetes 启动

$ sudo snap install microk8s --classic
$ microk8s status --wait-ready
$ microk8s start

启用插件

安装以下 MicroK8s 插件

$ microk8s enable dashboard dns gpu helm3 ingress registry storage

开发者系统的 NVIDIA 云原生堆栈

请参考以下链接以阅读更多关于云原生堆栈的信息:https://github.com/NVIDIA/cloud-native-stack

安装 Ubuntu 操作系统

Ubuntu Server 可以从 http://cdimage.ubuntu.com/releases/22.04/release/ 下载。

有关安装 Ubuntu Server 的更多信息,请参阅 Ubuntu Server 安装指南。

安装 CUDA 驱动程序

CUDA 安装说明可从 https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local 获取

一旦 NVIDIA 驱动程序安装完成,请重启系统并运行以下命令以验证 NVIDIA 驱动程序已加载

nvidia-smi

预期输出

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05             Driver Version: 535.104.05   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090        On  | 00000000:65:00.0 Off |                  Off |
|  0%   30C    P8               5W / 450W |    133MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      1119      G   /usr/lib/xorg/Xorg                          107MiB |
|    0   N/A  N/A      1239      G   /usr/bin/gnome-shell                         13MiB |
+---------------------------------------------------------------------------------------+

安装 Docker CE

  1. 设置仓库并更新 apt 包索引

$ sudo apt-get update
  1. 安装软件包以允许 apt 通过 HTTPS 使用仓库

$ sudo apt-get install -y \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg-agent \
   software-properties-common
  1. 添加 Docker 的官方 GPG 密钥

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. 通过搜索指纹的最后 8 个字符,验证您现在是否拥有指纹为 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 的密钥

$ sudo apt-key fingerprint 0EBFCD88

pub   rsa4096 2017-02-22 [SCEA]
 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
  1. 使用以下命令设置稳定仓库

$ sudo add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"
  1. 安装 Docker Engine - Community 更新 apt 包索引

$ sudo apt-get update
  1. 安装 Docker Engine

$ sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  1. 通过运行 hello-world 镜像来验证 Docker Engine - Community 是否正确安装

$ sudo docker run hello-world

有关如何安装 Docker 的更多信息,请访问 https://docs.docker.net.cn/install/linux/docker-ce/ubuntu/

安装 NVIDIA 容器工具包

  1. 设置软件包仓库

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
     && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
     && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
           sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
           sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
  1. 更新软件包索引

sudo apt update
  1. 安装 NVIDIA 容器工具包

sudo apt-get install -y nvidia-docker2
  1. 更新 Docker 默认运行时。

  2. 编辑 docker 守护程序配置以添加以下行并保存文件

"default-runtime" : "nvidia"

示例

$ sudo nano /etc/docker/daemon.json

{
  "runtimes": {
       "nvidia": {
           "path": "nvidia-container-runtime",
          "runtimeArgs": []
       }
  },
  "default-runtime" : "nvidia"
}
  1. 现在执行以下命令以重启 docker 守护程序

sudo systemctl daemon-reload && sudo systemctl restart docker
  1. 验证 docker 默认运行时。

  2. 执行以下命令以验证 docker 默认运行时为 NVIDIA

$ sudo docker info | grep -i runtime

输出

Runtimes: nvidia runc
Default Runtime: nvidia

安装 Containerd

  1. 设置仓库并更新 apt 包索引

sudo apt-get update
  1. 安装软件包以允许 apt 通过 HTTPS 使用仓库

sudo apt-get install -y apt-transport-https gnupg-agent libseccomp2 autotools-dev debhelper software-properties-common
  1. 配置 Containerd 的前提条件

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
  1. 设置必需的 sysctl 参数;这些参数在重启后仍然保留

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
  1. 无需重启应用 sysctl 参数

sudo sysctl --system
  1. 下载 Containerd tarball

wget https://github.com/containerd/containerd/releases/download/v1.6.6/cri-containerd-cni-1.6.6-linux-amd64.tar.gz
sudo tar --no-overwrite-dir -C / -xzf cri-containerd-cni-1.6.6-linux-amd64.tar.gz
rm -rf cri-containerd-cni-1.6.6-linux-amd64.tar.gz
  1. 安装 Containerd

sudo mkdir -p /etc/containerd
wget  https://raw.githubusercontent.com/NVIDIA/cloud-native-stack/master/playbooks/config.toml
sudo mv config.toml /etc/containerd/ && sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl enable containerd && sudo systemctl restart containerd

有关安装 Containerd 的更多信息,请参考使用发布 Tarball 安装 Containerd。

安装 Kubernetes

  1. 在开始安装之前,请确保 Containerd 已启动并启用

sudo systemctl start containerd && sudo systemctl enable containerd
  1. 执行以下命令以添加 apt 密钥

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo mkdir -p  /etc/apt/sources.list.d/
  1. 创建 kubernetes.list

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
  1. 现在执行以下命令以安装 kubelet、kubeadm 和 kubectl

sudo apt-get update
sudo apt-get install -y -q kubelet=1.27.0-00 kubectl=1.24.1-00 kubeadm=1.27.0-00
sudo apt-mark hold kubelet kubeadm kubectl
  1. 使用 Containerd 创建 kubelet 默认配置

cat <<EOF | sudo tee /etc/default/kubelet
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint="unix:/run/containerd/containerd.sock"
EOF
  1. 重新加载系统守护程序

sudo systemctl daemon-reload

禁用交换分区

sudo swapoff -a
sudo nano /etc/fstab

注意

在所有以 /swap 开头的行之前添加 #。# 是注释,结果应如下所示

UUID=e879fda9-4306-4b5b-8512-bba726093f1d / ext4 defaults 0 0
UUID=DCD4-535C /boot/efi vfat defaults 0 0
#/swap.img       none    swap    sw      0       0

初始化 Kubernetes

以下步骤说明如何初始化 Kubernetes 集群以作为控制平面节点运行

  1. 执行以下命令

sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --cri-socket=/run/containerd/containerd.sock --kubernetes-version="v1.27.0"

输出

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
 https://kubernetes.ac.cn/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join <your-host-IP>:6443 --token 489oi5.sm34l9uh7dk4z6cm \
   --discovery-token-ca-cert-hash sha256:17165b6c4a4b95d73a3a2a83749a957a10161ae34d2dfd02cd730597579b4b34
  1. 按照输出中的说明,执行如下所示的命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 通过以下命令,您将 pod 网络插件安装到控制平面节点。我们在此处使用 calico 作为 pod 网络插件

kubectl apply -f https://docs.projectcalico.org/v3.21/manifests/calico.yaml
  1. 更新 Calico Daemonset

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=ens\*,eth\*,enc\*,enp\*
  1. 执行以下命令以确保所有 Pod 都已启动并正在运行

kubectl get pods --all-namespaces

输出

NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-65b8787765-bjc8h   1/1     Running   0          2m8s
kube-system   calico-node-c2tmk                          1/1     Running   0          2m8s
kube-system   coredns-5c98db65d4-d4kgh                   1/1     Running   0          9m8s
kube-system   coredns-5c98db65d4-h6x8m                   1/1     Running   0          9m8s
kube-system   etcd-#yourhost                             1/1     Running   0          8m25s
kube-system   kube-apiserver-#yourhost                   1/1     Running   0          8m7s
kube-system   kube-controller-manager-#yourhost          1/1     Running   0          8m3s
kube-system   kube-proxy-6sh42                           1/1     Running   0          9m7s
kube-system   kube-scheduler-#yourhost                   1/1     Running   0          8m26s
  1. get nodes 命令显示控制平面节点已启动并准备就绪

kubectl get nodes

输出

NAME             STATUS   ROLES                  AGE   VERSION
#yourhost        Ready    control-plane,master   10m   v1.27.0
  1. 由于我们使用的是单节点 Kubernetes 集群,因此默认情况下集群不会在控制平面节点上调度 Pod。要在控制平面节点上调度 Pod,我们必须通过执行以下命令来删除污点

kubectl taint nodes --all node-role.kubernetes.io/master-

有关更多信息,请参考 kubeadm 安装指南

安装最新版本的 Helm

执行以下命令以下载并 安装最新版本的 Helm

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

添加额外节点

以下步骤说明如何向 NVIDIA 云原生堆栈添加额外节点

注意

如果您不添加额外节点,请跳过此步骤并继续下一步安装 NVIDIA Network Operator

  1. 确保在额外节点上安装 Containerd 和 Kubernetes 软件包。

  1. 一旦在额外节点上完成前提条件,请在控制平面节点上执行以下命令,然后在额外节点上执行 join 命令输出,以将额外节点添加到 NVIDIA 云原生堆栈

sudo kubeadm token create --print-join-command

输出

示例

sudo kubeadm join 10.110.0.34:6443 --token kg2h7r.e45g9uyrbm1c0w3k     --discovery-token-ca-cert-hash sha256:77fd6571644373ea69074dd4af7b077bbf5bd15a3ed720daee98f4b04a8f524e

注意

控制平面节点和工作节点不应具有相同的节点名称。

  1. get nodes 命令显示主节点和工作节点已启动并准备就绪

kubectl get nodes

输出

NAME             STATUS   ROLES                  AGE   VERSION
#yourhost        Ready    control-plane,master   10m   v1.27.0
#yourhost-worker Ready                           10m   v1.27.0

安装 GPU Operator

  1. 添加 NVIDIA 仓库

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
  1. 更新 Helm 仓库

helm repo update
  1. 安装 GPU Operator

注意

由于我们预装了 NVIDIA 驱动程序和 NVIDIA 容器工具包,因此在安装 GPU Operator 时需要设置为 false。

helm install --version 23.3.2 --create-namespace --namespace nvidia-gpu-operator --devel nvidia/gpu-operator --set driver.enabled=false,toolkit.enabled=false --wait --generate-name
  1. 验证 GPU Operator 的状态

请注意,GPU Operator 的安装可能需要几分钟。安装所需的时间取决于您的互联网速度。

kubectl get pods --all-namespaces | grep -v kube-system
NAMESPACE                NAME                                                              READY   STATUS      RESTARTS   AGE
default                  gpu-operator-1622656274-node-feature-discovery-master-5cddq96gq   1/1     Running     0          2m39s
default                  gpu-operator-1622656274-node-feature-discovery-worker-wr88v       1/1     Running     0          2m39s
default                  gpu-operator-7db468cfdf-mdrdp                                     1/1     Running     0          2m39s
gpu-operator-resources   gpu-feature-discovery-g425f                                       1/1     Running     0          2m20s
gpu-operator-resources   nvidia-cuda-validator-s6x2p                                       0/1     Completed   0          48s
gpu-operator-resources   nvidia-dcgm-exporter-wtxnx                                        1/1     Running     0          2m20s
gpu-operator-resources   nvidia-dcgm-jbz94                                                 1/1     Running     0          2m20s
gpu-operator-resources   nvidia-device-plugin-daemonset-hzzdt                              1/1     Running     0          2m20s
gpu-operator-resources   nvidia-device-plugin-validator-9nkxq                              0/1     Completed   0          17s
gpu-operator-resources   nvidia-operator-validator-cw4j5                                   1/1     Running     0          2m20s

有关更多信息,请参考 NGC 上的 GPU Operator 页面

  1. 对于多个工作节点,执行以下命令以修复 CoreDNS 和节点功能发现。

kubectl delete pods $(kubectl get pods -n kube-system | grep core | awk '{print $1}') -n kube-system; kubectl delete pod $(kubectl get pods -o wide -n gpu-operator-resources | grep node-feature-discovery | grep -v master | awk '{print $1}') -n gpu-operator-resources

带有 MIG 的 GPU Operator

注意

带有 MIG 的 GPU Operator 仅支持 A100 和 A30 GPU

多实例 GPU (MIG) 允许基于 NVIDIA Ampere 架构(例如 NVIDIA A100)的 GPU 安全地划分为独立的 GPU 实例,用于 CUDA 应用程序。有关启用 MIG 功能的更多信息,请参考带有 MIG 的 GPU Operator。

验证 GPU Operator

GPU Operator 通过 nvidia-device-plugin-validation pod 和 nvidia-driver-validation pod 进行验证。如果两者都成功完成(请参阅 kubectl get pods --all-namespaces | grep -v kube-system 的输出),则 NVIDIA 云原生堆栈按预期工作。本节提供了两个示例,用于验证 GPU 是否可从 Pod 内部使用以手动验证。

  1. 示例 1:nvidia-smi

执行以下命令

cat <<EOF | tee nvidia-smi.yaml
apiVersion: v1
kind: Pod
metadata:
 name: nvidia-smi
spec:
 restartPolicy: OnFailure
 containers:
   - name: nvidia-smi
     image: "nvidia/cuda:12.2.0-base-ubuntu22.04"
     args: ["nvidia-smi"]
EOF

kubectl apply -f nvidia-smi.yaml
kubectl logs nvidia-smi

输出

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05             Driver Version: 535.104.05   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090        On  | 00000000:65:00.0 Off |                  Off |
|  0%   30C    P8               5W / 450W |    133MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      1119      G   /usr/lib/xorg/Xorg                          107MiB |
|    0   N/A  N/A      1239      G   /usr/bin/gnome-shell                         13MiB |
+---------------------------------------------------------------------------------------+
  1. 示例 2:CUDA-Vector-Add

  1. 创建 pod YAML 文件

$ cat <<EOF | tee cuda-samples.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda-vector-add
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
EOF
  1. 执行以下命令以创建示例 GPU Pod

$ kubectl apply -f cuda-samples.yaml
  1. 确认 cuda-samples Pod 已创建

$ kubectl get pods

如果 get pods 命令显示 Pod 状态为 completed,则 NVIDIA 云原生堆栈按预期工作。

AWS 的 NVIDIA 云原生堆栈

本文档中的说明已在以下环境中测试通过:

EC2 实例配置

  • 实例类型:g4dn.2xlarge

  • 操作系统:带有 64 位 (x86) 的 Ubuntu Server 22.04 LTS 镜像

  • 存储:最小 150 GB

  • 网络

    • 保持端口 22 对 ssh 开放

    • 部署应用程序后可能需要打开其他端口

使用您在实例创建时生成的密钥 SSH 进入实例

ssh -i /path/to/<your_key>.pem ubuntu@<aws_instance_ip>

安装 Containerd

  1. 安装软件包以允许 apt 通过 HTTPS 使用仓库

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates gnupg-agent libseccomp2 autotools-dev debhelper software-properties-common
  1. 配置 Containerd 的前提条件

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter
  1. 设置必需的 sysctl 参数;这些参数在重启后仍然保留

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
  1. 无需重启应用 sysctl 参数

sudo sysctl --system
  1. 下载 Containerd tarball

wget https://github.com/containerd/containerd/releases/download/v1.6.8/cri-containerd-cni-1.6.8-linux-amd64.tar.gz
sudo tar --no-overwrite-dir -C / -xzf cri-containerd-cni-1.6.8-linux-amd64.tar.gz
rm -rf cri-containerd-cni-1.6.8-linux-amd64.tar.gz
  1. 安装 Containerd

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

有关安装 Containerd 的更多信息,请参考使用发布 Tarball 安装 Containerd。

安装 Kubernetes

  1. 在开始安装之前,请确保 Containerd 已启动并启用

sudo systemctl start containerd && sudo systemctl enable containerd
  1. 执行以下命令以安装 kubelet kubeadm 和 kubectl

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo mkdir -p  /etc/apt/sources.list.d/
  1. 创建 Kubernetes.list

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
  1. 现在执行以下命令

sudo apt-get update

sudo apt-get install -y -q kubelet=1.23.12-00 kubectl=1.23.12-00 kubeadm=1.23.12-00

sudo apt-mark hold kubelet kubeadm kubectl
  1. 初始化 Kubernetes 集群以作为主节点运行

  1. 禁用交换分区

sudo swapoff -a

sudo nano /etc/fstab
  1. 在所有以 /swap 开头的行之前添加 #。# 是注释,结果应如下所示

    UUID=e879fda9-4306-4b5b-8512-bba726093f1d / ext4 defaults 0 0
    UUID=DCD4-535C /boot/efi vfat defaults 0 0
    #/swap.img       none    swap    sw      0       0
    
  2. 执行以下命令

sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --cri-socket=/run/containerd/containerd.sock --kubernetes-version="v1.23.12"

输出将显示在执行时将 pod 网络部署到集群的命令以及加入集群的命令。

  1. 按照输出中的说明,执行如下所示的命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 通过以下命令,您将 pod 网络插件安装到控制平面节点。此处使用 Calico 作为 pod 网络插件

kubectl apply -f  https://projectcalico.docs.tigera.io/archive/v3.21/manifests/calico.yaml
  1. 您可以执行以下命令以确保所有 Pod 都已启动并正在运行

kubectl get pods --all-namespaces

输出

NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-65b8787765-bjc8h   1/1     Running   0          2m8s
kube-system   calico-node-c2tmk                          1/1     Running   0          2m8s
kube-system   coredns-5c98db65d4-d4kgh                   1/1     Running   0          9m8s
kube-system   coredns-5c98db65d4-h6x8m                   1/1     Running   0          9m8s
kube-system   etcd-#hostname                             1/1     Running   0          8m25s
kube-system   kube-apiserver-#hostname                   1/1     Running   0          8m7s
kube-system   kube-controller-manager-#hostname          1/1     Running   0          8m3s
kube-system   kube-proxy-6sh42                           1/1     Running   0          9m7s
kube-system   kube-scheduler-#hostname                   1/1     Running   0          8m26s
  1. get nodes 命令显示控制平面节点已启动并准备就绪

kubectl get nodes

Output:


NAME             STATUS   ROLES                  AGE   VERSION
#yourhost        Ready    control-plane          10m   v1.23.12
  1. 由于我们使用的是单节点 Kubernetes 集群,因此默认情况下集群不会在控制平面节点上调度 Pod。要在控制平面节点上调度 Pod,我们必须通过执行以下命令来删除污点

kubectl taint nodes --all node-role.kubernetes.io/master-

有关更多信息,请参阅 kubeadm 安装指南

安装 Helm

执行以下命令以下载 Helm 3.10.0

wget https://get.helm.sh/helm-v3.10.0-linux-amd64.tar.gz

tar -zxvf helm-v3.10.0-linux-amd64.tar.gz

sudo mv linux-amd64/helm /usr/local/bin/helm

有关 Helm 的更多信息,请参阅 Helm 3.10.0 发行说明安装 Helm 指南 以获取更多信息。

安装 GPU Operator

  1. 添加 NVIDIA helm 仓库

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
  1. 更新 helm 仓库

helm repo update
  1. 要为带有 Tesla T4 的 AWS G4 实例安装 GPU Operator

helm install --version 23.3.2 --create-namespace --namespace gpu-operator-resources --devel nvidia/gpu-operator --wait --generate-name
  1. 验证 GPU Operator 的状态

kubectl get pods --all-namespaces | grep -v kube-system

NAMESPACE                NAME                                                             READY   STATUS      RESTARTS   AGE

gpu-operator-resources   gpu-operator-1590097431-node-feature-discovery-master-76578jwwt   1/1     Running     0          5m2s
gpu-operator-resources   gpu-operator-1590097431-node-feature-discovery-worker-pv5nf       1/1     Running     0          5m2s
gpu-operator-resources   gpu-operator-74c97448d9-n75g8                                     1/1     Running     1          5m2s
gpu-operator-resources   gpu-feature-discovery-6986n                                       1/1     Running     0          5m2s
gpu-operator-resources   nvidia-container-toolkit-daemonset-pwhfr                          1/1     Running     0          4m58s
gpu-operator-resources   nvidia-cuda-validator-8mgr2                                       0/1     Completed   0          5m3s
gpu-operator-resources   nvidia-dcgm-exporter-bdzrz                                        1/1     Running     0          4m57s
gpu-operator-resources   nvidia-device-plugin-daemonset-zmjhn                              1/1     Running     0          4m57s
gpu-operator-resources   nvidia-device-plugin-validator-spjv7                              0/1     Completed   0          4m57s
gpu-operator-resources   nvidia-driver-daemonset-7b66v                                     1/1     Running     0          4m57s
gpu-operator-resources   nvidia-operator-validator-phndq                                   1/1     Running     0          4m57s

注意

GPU Operator 的安装可能需要几分钟。所需时间取决于您的互联网速度。

有关更多信息,请参考 NGC 上的 GPU Operator 页面

  1. 要使用 nvidia-smi 验证 GPU Operator 安装,请执行以下操作

执行以下命令

cat <<EOF | tee nvidia-smi.yaml
apiVersion: v1
kind: Pod
metadata:
 name: nvidia-smi
spec:
 restartPolicy: OnFailure
 containers:
   - name: nvidia-smi
     image: "nvidia/cuda:12.2.0-base-ubuntu22.04"
     args: ["nvidia-smi"]
EOF

kubectl apply -f nvidia-smi.yaml
kubectl logs nvidia-smi

输出

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05             Driver Version: 535.104.05   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090        On  | 00000000:65:00.0 Off |                  Off |
|  0%   30C    P8               5W / 450W |    133MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      1119      G   /usr/lib/xorg/Xorg                          107MiB |
|    0   N/A  N/A      1239      G   /usr/bin/gnome-shell                         13MiB |
+---------------------------------------------------------------------------------------+

这就结束了 AWS 集群的设置。

AWS 弹性 Kubernetes 服务 (AWS EKS)

启动 Holoscan 就绪 EKS 集群

Holoscan 就绪 EKS 集群将连接到您的 AWS 账户,并使用 terraform 以及 NVIDIA GPU Operator 创建所有需要的资源。默认情况下,它会创建一个 CPU 节点(实例类型 = t2.xlarge,磁盘大小 = 512GB)和 2 个 GPU 节点(实例类型 = p3.2xlarge,磁盘大小 = 512GB)。

请克隆仓库 NVIDIA Terraform Modules / EKS

如果您想使用 NVIDIA 云原生附加组件包(有关更多详细信息,请参阅 在 AWS EKS 上安装 NVIDIA 云原生附加组件包(可选) 部分)作为部署系统的一部分,请将您的工作目录更改为 examples/cnpack 目录。否则,请从 nvidia-terraform-modules/eks 文件夹运行以下命令。

按照仓库中的说明启动集群。一旦 terraform apply 完成,您可以执行以下验证步骤。

  1. 通过运行以下命令,使用 aws cli 更新您的 kube 配置

aws eks update-kubeconfig --name tf-<cluster-name-in-terraform.tfvars> --region us-west-2

现在您应该可以在 kubectl cli 中看到集群,并且应该看到三个节点(默认:1 个 CPU 节点和 2 个 GPU 节点)。

kubectl get nodes
  1. 通过运行以下命令验证 GPU operator。(请注意,集群创建后可能需要约 5 分钟才能使所有 GPU Operator 资源准备就绪)

kubectl get pod -n gpu-operator

名称中带有 -validator 的 Pod 应处于 Completed 状态,所有其他 Pod 应正在运行。

我们还将通过运行以下命令来验证驱动程序是否正常工作,您应该看到 NVIDIA-SMI 输出。

kubectl exec -it -n gpu-operator nvidia-device-plugin-daemonset-<your-pod-number> -- nvidia-smi

现在您的集群已准备好使用。

在 AWS EKS 上安装 NVIDIA 云原生附加组件包(可选)

NVIDIA 云原生服务附加组件包是一系列工具的集合,旨在支持在 Kubernetes 集群上创建和运行云原生服务。

在继续之前,请确保您已启动并有权访问 Holoscan 就绪 EKS 的 CNPack 版本。(有关更多详细信息,请参阅 启动 Holoscan 就绪 EKS 集群 中的步骤 1。)

连接 AWS 托管服务
  1. 在您的 nvidia-terraform-modules/eks/examples/cnpack 文件夹中,运行 terraform output 以获取以下信息。

~/nvidia-terraform-modules/eks/examples/cnpack $ terraform output
amp_ingest_role_arn = "arn:aws:iam::0000000000000:role/amp-ingest-role-f1b"
amp_query_endpoint = "https://aps-workspaces.us-west-2.amazonaws.com/workspaces/ws-example/api/v1/query"
amp_remotewrite_endpoint = "https://aps-workspaces.us-west-2.amazonaws.com/workspaces/ws-example/api/v1/remote_write"
aws_pca_arn = "arn:aws:acm-pca:us-west-2:0000000000000:certificate-authority/example-pca-arn-hash"
  1. 从 NGC 下载 CNPack。

ngc registry resource download-version "nv-holoscan-cloud-native/cnpack/cnpack:0.16.0"
cd cnpack_v0.16.0
chmod +x nvidia-cnpack-linux-x86_64
./nvidia-cnpack-linux-x86_64  --help
  1. 使用以下模板创建 CNPack 配置,并将文件命名为 nvidia-platform.yaml。对于 EKS 集成,我们启用了 fluentbit 用于日志聚合、prometheus 用于指标以及 cert-manager。

apiVersion: v1alpha3
kind: NvidiaPlatform
spec:
    # The platform block contains general configuration that is important to all components
    platform:
        # Required value specifying the Wildcard Domain to configure for ingress.
        wildcardDomain: "*.my-cluster.my-domain.com"
        # Required value to specify the port to configure for ingress.
        externalPort: 443
        # Optional infrastructure provider configuration for AWS EKS
        eks:
            # The region in-which the cluster is installed.
            region: us-west-2

    # The ingress block configures the ingress controller
    ingress:
        # Whether this component should be enabled Default is true.
        enabled: false

    # The postgres block configures the postgres operator
    postgres:
        # Whether this component should be enabled Default is true.
        enabled: false

    # The certManager block configures the certificate management system
    certManager:
        # Whether this component should be enabled Default is true.
        enabled: true
        # Optional configuration for the AWS Private CA service integration.
        #
        # Dependencies:
        #   - EKS Infrastructure provider configuration (spec.platform.eks)
        awsPCA:
            # Whether this component should be enabled Default is true.
            enabled: true
            # The ARN required to communicate with the AWS Private CA service.
            arn: <aws_pca_arn>
            # The common name of the configured Private CA.
            commonName: my-cert.my-domain.com
            # The domain name of the configured Private CA.
            domainName: my-domain.com

    # The trustManager block configures the trust bundle management system
    #
    # Dependencies:
    #   - cert-manager
    trustManager:
        # Whether this component should be enabled Default is true.
        enabled: false

    # The keycloack block configures Keycloak as an OIDC provider
    #
    # Dependencies:
    #   - cert-manager
    #   - postgres
    #   - ingress
    keycloak:
        # Whether this component should be enabled Default is true.
        enabled: false

    # The prometheus block configures the Prometheus metrics service
    #
    # Dependencies:
    #   - cert-manager
    prometheus:
        # Whether this component should be enabled Default is true.
        enabled: true
        # Optional configuration for connecting Prometheus to an AWS Managed Prometheus instance.
        awsRemoteWrite:
            # The URL of the AWS managed prometheus service.
            url: <amp_remotewrite_endpoint>
            # The ARN required to communicate with the AWS Managed Prometheus Service.
            arn: <amp_ingest_role_arn>

    # The grafana block configures the Grafana dashboard service
    #
    # Dependencies:
    #   - prometheus
    #   - cert-manager
    #   - ingress
    grafana:
        # Whether this component should be enabled Default is true.
        enabled: true
        # Optional value to override the hostname used to expose grafana.
        customHostname: my-host.my-cluster.my-domain.com

    # The elastic block configures the Elastic Cloud on Kubernetes operator
    elastic:
        # Whether this component should be enabled Default is true.
        enabled: true

    # The fluentbit block configures the fluentbit log aggregation service
    #
    # Dependencies:
    #   - Infrastructure provider configuration (spec.platform.eks or spec.platform.aks or empty spec.platform for CNS)
    fluentbit:
        # Whether this component should be enabled Default is true.
        enabled: true
  1. 使用以下命令在您的集群中创建 CNPack。CNPack 将使用您的 KUBECONFIG 连接到集群并执行其服务的安装。

./nvidia-cnpack-linux-x86_64 create -f nvidia-platform.yaml
  1. 通过运行以下两个命令验证 CNPack 安装状态,并确保所有 Pod 都处于运行状态。

kubectl get po -n nvidia-platform
kubectl get po -n nvidia-monitoring
  1. 如果您想从集群中删除 cnpack,请运行 ./nvidia-cnpack-linux-x86_64 delete

故障排除

如果在任何时候,您的 kubectl 或 terraform 命令显示类似 “couldn’t get current server API group list: the server has asked for the client to provide credentials” 的错误,请刷新您 ~/.aws/credentials 文件中的 AWS 凭证。

删除 Holoscan 就绪 EKS 集群

注意: 请确保在运行 destroy 命令之前,已删除您安装的所有应用程序(helm charts、其他 Kubernetes 资源)。

  1. 刷新您的 AWS 凭证。

  2. 在您运行 terraform apply 的同一目录中,运行 terraform destroy,并在提示时输入 “yes”。

Azure Kubernetes 服务 (Microsoft AKS)

启动 Holoscan 就绪 AKS 集群

Holoscan 就绪 AKS 集群将连接到您的 Azure 账户,并使用 terraform 以及 NVIDIA GPU Operator 创建所有需要的资源。默认情况下,它会创建一个 CPU 节点(实例类型 = Standard_D16_v5,磁盘大小 = 100GB)和 2 个 GPU 节点(实例类型 = Standard_NC6s_v3,磁盘大小 = 100GB)。

请克隆仓库 NVIDIA Terraform Modules / AKS

如果您想使用 NVIDIA 云原生附加组件包(有关更多详细信息,请参阅 在 Azure AKS 上安装 NVIDIA 云原生附加组件包(可选) 部分)作为部署系统的一部分,请将您的工作目录更改为 examples/cnpack 目录。否则,请从 nvidia-terraform-modules/aks 根目录运行以下命令。

按照仓库中的说明启动集群。一旦 terraform apply 完成,您可以执行以下验证步骤。

  1. 通过运行以下命令,使用 az cli 更新您的 kube 配置

az aks get-credentials --name ucf-cnpack-cluster --resource-group ucf-cnpack-cluster-rg

现在您应该可以在 kubectl cli 中看到集群,并且应该看到三个节点(1 个 CPU 节点和 2 个 GPU 节点)。(注意:第一次在集群上运行此命令时,可能会要求您登录 Microsoft。)

kubectl get nodes
  1. 通过运行以下命令验证 GPU operator。(请注意,集群创建后可能需要约 5 分钟才能使所有 GPU Operator 资源准备就绪)

kubectl get pod -n gpu-operator

名称中带有 -validator 的 Pod 应处于 Completed 状态,所有其他 Pod 应正在运行。

我们还将通过运行以下命令来验证驱动程序是否正常工作,您应该看到 NVIDIA-SMI 输出。

kubectl exec -it -n gpu-operator nvidia-device-plugin-daemonset-<your-pods-number> -- nvidia-smi

现在您的集群已准备好使用。

在 Azure AKS 上安装 NVIDIA 云原生附加组件包(可选)

NVIDIA 云原生服务附加组件包是一系列工具的集合,旨在支持在 Kubernetes 集群上创建和运行云原生服务。

在继续之前,请确保您已启动并有权访问 Holoscan 就绪 AKS 的 CNPack 版本。(有关更多详细信息,请参阅 启动 Holoscan 就绪 AKS 集群 中的步骤 1。)

连接 Azure 托管服务
  1. 在您的 nvidia-terraform-modules/aks/examples/cnpack 文件夹中,运行 terraform output 以获取以下信息。

~/nvidia-terraform-modules/aks/examples/cnpack $ terraform output
cluster_managed-client-id = "x123xxxxxxx"
fluentbit-secret-name = "fluentbit-secrets"
fluentbit-secret-namespace = "nvidia-platform"
prometheus-query-url = "https://ucf-cnpack-prom-xxxx.westus2.prometheus.monitor.azure.com"
  1. 从 NGC 下载 CNPack。

ngc registry resource download-version "nv-holoscan-cloud-native/cnpack/cnpack:0.16.0"
cd cnpack_v0.16.0
chmod +x nvidia-cnpack-linux-x86_64
./nvidia-cnpack-linux-x86_64  --help
  1. 使用以下模板创建 CNPack 配置,并将文件命名为 nvidia-platform.yaml。对于 EKS 集成,我们启用了 fluentbit 用于日志聚合、prometheus 用于指标以及 cert-manager。

apiVersion: v1alpha3
kind: NvidiaPlatform
spec:
  platform:
    wildcardDomain: "*.holoscandev.nvidia.com"
    externalPort: 443
    aks: {}
  certManager:
    enabled: true
  prometheus:
    enabled: true
    aksRemoteWrite:
      url: "<see note #1>"
      clientId: "<cluster_managed-client-id> in your terraform output"
  fluentbit:
    enabled: true
    aks:
      secretName: "<fluentbit-secret-name in your terraform output>"
  trustManager:
    enabled: false
  keycloak:
    enabled: false
  grafana:
    customHostname: grafana.holoscandev.com
    enabled: false
  elastic:
    enabled: false
  ingress:
    enabled: false
  postgres:
    enabled: false

注意 #1:要获取 AKS Remote Write URL,您需要转到 Azure 门户,搜索 ucf-cnpack-prom(或您在 terraform.tfvars 文件中使用的名称),然后选择同名的 Azure Monitor Workspace 的资源。然后,将 Metrics Ingestion Endpoint 的值复制到 spec.Promtheus.aksRemoteWrite.url

  1. 使用以下命令在您的集群中创建 CNPack。CNPack 将使用您的 KUBECONFIG 连接到集群并执行其服务的安装。

./nvidia-cnpack_Linux_x86_64 create -f nvidia-platform.yaml
  1. 通过运行以下两个命令验证 CNPack 安装状态,并确保所有 Pod 都处于运行状态。

kubectl get po -n nvidia-platform
kubectl get po -n nvidia-monitoring
  1. 如果您想从集群中删除 cnpack,请运行 ./nvidia-cnpack_Linux_x86_64 delete

故障排除

如果在任何时候,您的 kubectl 或 terraform 命令显示类似 “couldn’t get current server API group list: the server has asked for the client to provide credentials” 的错误,请再次运行 az login

如果您从 terraform apply 中看到以下内容

│ Error: chart "gpu-operator" matching vX.Y.Z not found in nvidia index. (try 'helm repo update'): no chart
│ version found for gpu-operator-vX.Y.Z

运行 helm repo update,然后再次运行 terraform apply

删除 Holoscan 就绪 AKS 集群

注意

确保在运行 destroy 命令之前,已删除您安装的所有应用程序(helm charts、其他 Kubernetes 资源)。

  1. 通过运行 az login 刷新您的 Azure 登录。

  2. 在您运行 terraform apply 的同一目录中,运行 terraform destroy,并在提示时输入 “yes”。

Google Kubernetes 引擎 (GCP GKE)

启动 Holoscan 就绪 GKE 集群

Holoscan 就绪 GKE 集群将连接到您的 GCP 账户,并使用 terraform 以及 NVIDIA GPU Operator 创建所有需要的资源。默认情况下,它会创建一个 CPU 节点(实例类型 = n1-standard-4,磁盘大小 = 512GB)和 2 个 GPU 节点(实例类型 = n1-standard-4,带有 nvidia-tesla-v100,磁盘大小 = 512GB)。

请克隆仓库 NVIDIA Terraform Modules / GKE

如果您想使用 NVIDIA 云原生附加组件包(有关更多详细信息,请参阅 在 GKE 上安装 NVIDIA 云原生附加组件包(可选) 部分)作为部署系统的一部分,请将您的工作目录更改为 examples/cnpack 目录。否则,请从 nvidia-terraform-modules/gke 根目录运行以下命令。

按照仓库中的说明启动集群。一旦 terraform apply 完成,您可以执行以下验证步骤。

  1. 通过运行以下命令,使用 az cli 更新您的 kube 配置

gcloud components install gke-gcloud-auth-plugin

gcloud container clusters get-credentials <CLUSTER_NAME> --region=<REGION>

现在您应该可以在 kubectl cli 中看到集群,并且应该看到三个节点(1 个 CPU 节点和 2 个 GPU 节点)。(注意:第一次在集群上运行此命令时,可能会要求您登录 Microsoft。)

kubectl get nodes
  1. 通过运行以下命令验证 GPU operator。(请注意,集群创建后可能需要约 5 分钟才能使所有 GPU Operator 资源准备就绪)

kubectl get pod -n gpu-operator

名称中带有 -validator 的 Pod 应处于 Completed 状态,所有其他 Pod 应正在运行。

我们还将通过运行以下命令来验证驱动程序是否正常工作,您应该看到 NVIDIA-SMI 输出。

kubectl exec -it -n gpu-operator nvidia-device-plugin-daemonset-<your-pods-number> -- nvidia-smi

现在您的集群已准备好使用。

在 GKE 上安装 NVIDIA 云原生附加组件包(可选)

NVIDIA 云原生服务附加组件包是一系列工具的集合,旨在支持在 Kubernetes 集群上创建和运行云原生服务。

在继续之前,请确保您已启动并有权访问 Holoscan 就绪 GKE 的 CNPack 版本。(有关更多详细信息,请参阅 启动 Holoscan 就绪 GKE 集群 中的步骤 1。)

连接 GCP 托管服务
  1. 在您的 nvidia-terraform-modules/gke/examples/cnpack 文件夹中,运行 terraform output 以获取以下信息。

~/nvidia-terraform-modules/gke/examples/cnpack $ terraform output
gcp_service_account_email_for_prometheus = "tf-gke-prom-svc-acct-xxxxxdxxx.com"
  1. 从 NGC 下载 CNPack。

ngc registry resource download-version "nv-holoscan-cloud-native/cnpack/cnpack:0.16.0"
cd cnpack_v0.16.0
chmod +x nvidia-cnpack-linux-x86_64
./nvidia-cnpack-linux-x86_64  --help
  1. 使用以下模板创建 CNPack 配置,并将文件命名为 nvidia-platform.yaml。对于 EKS 集成,我们启用了 fluentbit 用于日志聚合、prometheus 用于指标以及 cert-manager。

apiVersion: v1alpha3
kind: NvidiaPlatform
spec:
  platform:
    wildcardDomain: "*.holoscandev.nvidia.com"
    externalPort: 443
    gke: {}
  certManager:
    enabled: true
  prometheus:
    enabled: true
    gkeRemoteWrite:
      gcpServiceAccount: "<name-of-your-gcp-service-account> in your terraform output"
  fluentbit:
    enabled: true
  trustManager:
    enabled: false
  keycloak:
    enabled: false
  grafana:
    customHostname: grafana.holoscandev.com
    enabled: false
  elastic:
    enabled: false
  ingress:
    enabled: false
  postgres:
    enabled: false
  1. 使用以下命令在您的集群中创建 CNPack。CNPack 将使用您的 KUBECONFIG 连接到集群并执行其服务的安装。

./nvidia-cnpack_Linux_x86_64 create -f nvidia-platform.yaml
  1. 通过运行以下两个命令验证 CNPack 安装状态,并确保所有 Pod 都处于运行状态。

kubectl get po -n nvidia-platform
kubectl get po -n nvidia-monitoring
  1. 如果您想从集群中删除 cnpack,请运行 ./nvidia-cnpack_Linux_x86_64 delete

故障排除

如果在任何时候,您的 kubectl 或 terraform 命令显示类似 “couldn’t get current server API group list: the server has asked for the client to provide credentials” 的错误,请再次运行 gcloud auth application-default login

删除 Holoscan 就绪 GKE 集群

注意

确保在运行 destroy 命令之前,已删除您安装的所有应用程序(helm charts、其他 Kubernetes 资源)。

  1. 通过运行 gcloud auth application-default login 刷新您的 GCP 登录。

  2. 在您运行 terraform apply 的同一目录中,运行 terraform state rm kubernetes_namespace_v1.gpu-operator,然后运行 terraform destroy,并在提示时输入 “yes”。