创建应用程序容器#
应用程序容器 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
其中 major
和 minor
对应于 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