创建应用程序容器#

应用程序容器 Dockerfile#

nvidia-driver-daemonset 包含一个 nvidia-fs-sidecar 容器,它将 NVIDIA GPU 驱动程序和 GDS 内核模块加载到主机中,然后特权容器可以在其他 Pod 中访问它们。为了启动您自己的应用程序容器并使用 GDS,用户空间库必须安装在您的应用程序容器中。这可以通过在应用程序容器 Dockerfile 中使用 CUDA 容器镜像作为基础镜像来轻松完成

1FROM nvcr.io/nvidia/cuda:11.7.1-devel-ubuntu20.04
2RUN  apt-get update && apt-get install -y libcufile-dev

如果不需要完整的 CUDA 基础容器镜像,可以使用 Ubuntu 基础镜像,并将以下命令添加到 Dockerfile 以安装 CUDA 工具包和 libcufile 用户空间库,而无需完整安装 CUDA

1FROM ubuntu:20.04
2RUN  wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb && \
3        dpkg -i cuda-keyring_1.0-1_all.deb && \
4        apt-get update && \
5        apt-get -y install cuda-toolkit-<major>-<minor> libcufile-dev

其中 majorminor 对应于 CUDA 版本。例如,CUDA 11.8 的 major = 11,minor = 8

Kubernetes Pod YAML 文件#

构建应用程序容器后,必须创建一个 YAML 文件来描述将在 Kubernetes 中启动的 Pod 的规范。如果您的应用程序容器镜像本地托管在 Docker 中,那么您必须运行以下命令来创建私有 Docker 注册表并将镜像推送到其中,以便 Kubernetes 可以访问它

1sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2
2sudo docker tag <your image name>:<your image version> localhost:5000/<your image name>:<your image version>
3sudo docker push localhost:5000/<your image name>:<your image version>

以下 YAML 示例给出了 YAML 中必须包含的最低要求(名称、镜像位置和运行命令除外)

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4name: gds-application
 5spec:
 6hostNetwork: true
 7hostIPC: true
 8containers:
 9- name: gds-application
10    image: <your application image>
11    imagePullPolicy: Always
12    command: [ "/bin/bash", "-c", "--" ]
13    args: [ "while true; do sleep 30; done;" ]
14    securityContext:
15    privileged: true
16    volumeMounts:
17    - name: udev
18        mountPath: /run/udev
19    volumeMounts:
20    - name: kernel-config
21        mountPath: /sys/kernel/config
22    volumeMounts:
23    - name: dev
24        mountPath: /run/dev
25    volumeMounts:
26    - name: sys
27        mountPath: /sys
28    volumeMounts:
29    - name: results
30        mountPath: /results
31    volumeMounts:
32    - name: lib
33        mountPath: /lib/modules
34volumes:
35    - name: udev
36    hostPath:
37        path: /run/udev
38    - name: kernel-config
39    hostPath:
40        path: /sys/kernel/config
41    - name: dev
42    hostPath:
43        path: /run/dev
44    - name: sys
45    hostPath:
46        path: /sys
47    - name: results
48    hostPath:
49        path: /results
50    - name: lib
51    hostPath:
52        path: /lib/modules