在气隙环境安装 NVIDIA GPU Operator#
关于气隙安装#
本页介绍如何在受限互联网访问的集群中成功部署 GPU Operator。默认情况下,GPU Operator 需要互联网访问,原因如下:
在 GPU Operator 安装期间需要拉取容器镜像。
driver
容器需要在驱动程序安装之前下载几个操作系统软件包。提示
使用预编译驱动程序容器消除了
driver
容器下载操作系统软件包的需求,并消除了创建本地软件包仓库的需求。
为了满足这些要求,可能需要创建本地镜像仓库和/或本地软件包仓库,以便必要的镜像和软件包可用于您的集群。在后续章节中,我们将详细介绍如何配置 GPU Operator 以使用本地镜像仓库和本地软件包仓库。如果您的集群位于代理之后,另请遵循在代理环境安装 GPU Operator中的步骤。
对于具有不同互联网连接级别的不同环境,需要不同的步骤。下表列出了支持的用例/环境
网络流 |
|||
---|---|---|---|
用例 |
拉取镜像 |
拉取软件包 |
|
1 |
具有完全互联网访问的 HTTP 代理 |
K8s 节点 –> HTTP 代理 –> 互联网镜像仓库 |
Driver 容器 –> HTTP 代理 –> 互联网软件包仓库 |
2 |
具有有限互联网访问的 HTTP 代理 |
K8s 节点 –> HTTP 代理 –> 互联网镜像仓库 |
Driver 容器 –> HTTP 代理 –> 本地软件包仓库 |
3a |
完全气隙 (带 HTTP 代理) |
K8s 节点 –> 本地镜像仓库 |
Driver 容器 –> HTTP 代理 –> 本地软件包仓库 |
3b |
完全气隙 (不带 HTTP 代理) |
K8s 节点 –> 本地镜像仓库 |
Driver 容器–> 本地软件包仓库 |
注意
对于气隙环境中的 Red Hat Openshift 部署(用例 2、3a 和 3b),请参阅在断开连接或气隙环境中部署 GPU Operator。
注意
确保 Kubernetes 节点可以成功访问本地 DNS 服务器。对于用例 1 和 2,镜像仓库和软件包仓库的公共名称解析是强制性的。
在继续下一节之前,获取用于 GPU Operator 配置的 values.yaml
文件。
$ curl -sO https://raw.githubusercontent.com/NVIDIA/gpu-operator/v1.7.0/deployments/gpu-operator/values.yaml
注意
将上述命令中的 v1.7.0
替换为您要使用的版本。
本地镜像仓库#
在没有互联网访问的情况下,GPU Operator 要求所有镜像都托管在集群中所有节点都可访问的本地镜像仓库中。为了使 GPU Operator 能够与本地仓库一起工作,用户可以在 values.yaml
中指定本地仓库、镜像、标签以及拉取 secret。
要从 NVIDIA 仓库拉取正确的镜像,您可以利用 values.yaml
文件中指定的 repository
、image
和 version
字段。
容器镜像的通用语法是 <repository>/<image>:<version>
。
如果未指定版本,您可以从 NVIDIA NGC 目录 https://catalog.ngc.nvidia.com/containers 中检索信息。搜索镜像,例如 gpu-operator
,然后检查该镜像的可用标签。
下面显示了一个 Operator 容器镜像的示例
operator:
repository: nvcr.io/nvidia
image: gpu-operator
version: "v24.9.2"
例如,要拉取 gpu-operator 镜像版本 v24.9.2,请使用以下指令
$ docker pull nvcr.io/nvidia/gpu-operator:v24.9.2
关于 driver 镜像有一个注意事项。版本字段必须附加在工作节点上运行的操作系统名称。
driver:
repository: nvcr.io/nvidia
image: driver
version: "570.86.15"
要为 Ubuntu 20.04 拉取 driver 镜像
$ docker pull nvcr.io/nvidia/driver:570.86.15-ubuntu20.04
要将镜像推送到本地仓库,只需通过在镜像前加上镜像仓库信息来标记拉取的镜像。
使用上述示例,这将导致
$ docker tag nvcr.io/nvidia/gpu-operator:v24.9.2 <local-registry>/<local-path>/gpu-operator:v24.9.2
$ docker tag nvcr.io/nvidia/driver:570.86.15-ubuntu20.04 <local-registry>/<local-path>/driver:570.86.15-ubuntu20.04
最后,将镜像推送到本地仓库
$ docker push <local-registry>/<local-path>/gpu-operator:v24.9.2
$ docker push <local-registry>/<local-path>/driver:570.86.15-ubuntu20.04
使用仓库字段中的本地仓库信息更新 values.yaml
。
注意
将下面的 <repo.example.com:port> 替换为您的本地镜像仓库 URL 和端口。
GPU Operator v1.9.0 的 values.yaml
示例
operator:
repository: <repo.example.com:port>
image: gpu-operator
version: 1.9.0
imagePullSecrets: []
initContainer:
image: cuda
repository: <repo.example.com:port>
version: 11.4.2-base-ubi8
validator:
image: gpu-operator-validator
repository: <repo.example.com:port>
version: 1.9.0
imagePullSecrets: []
driver:
repository: <repo.example.com:port>
image: driver
version: "470.82.01"
imagePullSecrets: []
manager:
image: k8s-driver-manager
repository: <repo.example.com:port>
version: v0.2.0
toolkit:
repository: <repo.example.com:port>
image: container-toolkit
version: 1.7.2-ubuntu18.04
imagePullSecrets: []
devicePlugin:
repository: <repo.example.com:port>
image: k8s-device-plugin
version: v0.10.0-ubi8
imagePullSecrets: []
dcgmExporter:
repository: <repo.example.com:port>
image: dcgm-exporter
version: 2.3.1-2.6.0-ubuntu20.04
imagePullSecrets: []
gfd:
repository: <repo.example.com:port>
image: gpu-feature-discovery
version: v0.4.1
imagePullSecrets: []
nodeStatusExporter:
enabled: false
repository: <repo.example.com:port>
image: gpu-operator-validator
version: "1.9.0"
migManager:
enabled: true
repository: <repo.example.com:port>
image: k8s-mig-manager
version: v0.2.0-ubuntu20.04
node-feature-discovery:
image:
repository: <repo.example.com:port>
pullPolicy: IfNotPresent
# tag, if defined will use the given image tag, else Chart.AppVersion will be used
# tag:
imagePullSecrets: []
本地软件包仓库#
作为 GPU operator 一部分部署的 driver
容器需要某些软件包在驱动程序安装过程中可用。在受限互联网访问或气隙安装中,用户需要为其操作系统发行版创建本地镜像仓库,并使以下软件包可用:
注意
KERNEL_VERSION 是 GPU 节点上运行的底层内核版本 GCC_VERSION 是与用于构建底层内核的版本匹配的 gcc 版本
对于可以运行预编译驱动程序容器的集群,配置本地软件包仓库不是必需的。
必需软件包
ubuntu:
linux-headers-${KERNEL_VERSION}
linux-image-${KERNEL_VERSION}
linux-modules-${KERNEL_VERSION}
centos:
elfutils-libelf.x86_64
elfutils-libelf-devel.x86_64
kernel-headers-${KERNEL_VERSION}
kernel-devel-${KERNEL_VERSION}
kernel-core-${KERNEL_VERSION}
gcc-${GCC_VERSION}
rhel/rhcos:
kernel-headers-${KERNEL_VERSION}
kernel-devel-${KERNEL_VERSION}
kernel-core-${KERNEL_VERSION}
gcc-${GCC_VERSION}
例如,对于 Ubuntu,可以在 archive.ubuntu.com
找到这些软件包。这是要为您的集群本地复制的镜像。您可以使用 apt-mirror
将这些软件包镜像到您的本地软件包仓库服务器。
对于 CentOS,可以使用 reposync
创建本地镜像。
在所有必需的软件包都镜像到本地仓库后,需要按照特定于发行版的文档创建仓库列表。需要在部署 GPU Operator 的命名空间中创建一个包含仓库列表文件的 ConfigMap
。
下面显示了 Ubuntu 22.04 的仓库列表示例(通过 HTTP 访问本地软件包仓库)
custom-repo.list
:
deb [arch=amd64] http://<local pkg repository>/ubuntu/mirror/archive.ubuntu.com/ubuntu jammy main universe
deb [arch=amd64] http://<local pkg repository>/ubuntu/mirror/archive.ubuntu.com/ubuntu jammy-updates main universe
deb [arch=amd64] http://<local pkg repository>/ubuntu/mirror/archive.ubuntu.com/ubuntu jammy-security main universe
下面显示了 Ubuntu 20.04 的仓库列表示例(通过 HTTP 访问本地软件包仓库)
custom-repo.list
:
deb [arch=amd64] http://<local pkg repository>/ubuntu/mirror/archive.ubuntu.com/ubuntu focal main universe
deb [arch=amd64] http://<local pkg repository>/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-updates main universe
deb [arch=amd64] http://<local pkg repository>/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-security main universe
下面显示了 CentOS 8 的仓库列表示例(通过 HTTP 访问本地软件包仓库)
custom-repo.repo
:
[baseos]
name=CentOS Linux $releasever - BaseOS
baseurl=http://<local pkg repository>/repos/centos/$releasever/$basearch/os/baseos/
gpgcheck=0
enabled=1
[appstream]
name=CentOS Linux $releasever - AppStream
baseurl=http://<local pkg repository>/repos/centos/$releasever/$basearch/os/appstream/
gpgcheck=0
enabled=1
[extras]
name=CentOS Linux $releasever - Extras
baseurl=http://<local pkg repository>/repos/centos/$releasever/$basearch/os/extras/
gpgcheck=0
enabled=1
从文件创建 ConfigMap
对象
$ kubectl create configmap repo-config -n gpu-operator --from-file=<path-to-repo-list-file>
如果容器化软件平台(例如 Tanzu)将 Kubernetes 集群节点升级到较新的操作系统版本,请根据需要更新 custom-repo.list
文件和 config map。
创建 config map 后,使用此信息更新 values.yaml
,以使 GPU Operator 将仓库配置挂载到 driver
容器中,从而拉取所需的软件包。根据操作系统发行版,GPU Operator 会自动将此 config map 挂载到相应的目录中。
driver:
repoConfig:
configMapName: repo-config
如果自签名证书用于基于 HTTPS 的内部仓库,则必须为这些证书添加 config map。然后在 GPU Operator 安装期间指定 config map。根据操作系统发行版,GPU Operator 也会自动将此 config map 挂载到相应的目录中。同样,证书文件格式和后缀(例如 .crt
或 .pem
)也取决于操作系统发行版。
$ kubectl create configmap cert-config -n gpu-operator --from-file=<path-to-cert-file-1> --from-file=<path-to-cert-file-2>
driver:
certConfig:
name: cert-config
部署 GPU Operator#
使用更新后的 values.yaml
下载并部署 GPU Operator Helm Chart。
从 NGC 仓库获取 chart
$ helm fetch https://helm.ngc.nvidia.com/nvidia/charts/gpu-operator-v24.9.2.tgz
使用自定义的 values.yaml
安装 GPU Operator
$ helm install --wait gpu-operator \
-n gpu-operator --create-namespace \
gpu-operator-v24.9.2.tgz \
-f values.yaml
检查 pod 的状态以确保所有容器都在运行
$ kubectl get pods -n gpu-operator