在气隙环境安装 NVIDIA GPU Operator#

关于气隙安装#

本页介绍如何在受限互联网访问的集群中成功部署 GPU Operator。默认情况下,GPU Operator 需要互联网访问,原因如下:

  1. 在 GPU Operator 安装期间需要拉取容器镜像。

  2. 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 文件中指定的 repositoryimageversion 字段。

容器镜像的通用语法是 <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