Статья-заметка по настройке рабочей ноды (worker) Kubernetes 1.27.1 для работы с GPU NVIDIA. Bare-metall, Alma Linux 9 (RHEL 9), Nvidia RTX 3080.
Поддерживаются видеокарты GTX 9xx и выше.
Подготовка и настройка драйверов (опционально)
Внимание! Отключите UEFI SecureBoot в BIOS.
1 |
modinfo nvidia |
Если после выполнения команды будет ошибка, то требуется установить драйвера.
1 2 3 |
dnf config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/rhel9/$(uname -i)/cuda-rhel9.repo dnf module install -y nvidia-driver:latest-dkms reboot |
Установка компонентов NVIDIA на рабочей ноде (worker)
1 2 3 |
curl -s -L https://nvidia.github.io/nvidia-docker/rhel9.0/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo dnf install -y nvidia-container-toolkit nvidia-container-toolkit-base nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml |
Если при выполнении nvidia-ctk будет ошибка, необходимо проверить предыдущий пункт про драйвера. Что-то не так. Если всё ок, можно идти дальше.
1 |
cp -f /etc/containerd/config.toml /etc/containerd/config.toml.orig |
Далее требуется отредактировать конфиг-файл containerd. Вот готовый patch файл.
Nvidia заменяет собой Runc, что позволяет шарить 1 GPU на множество контейнеров (не подов) (до 32-х).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cat <<EOF | tee /etc/containerd/config.toml.patch 70,71d69 < enable_cdi = true < cdi_spec_dirs = ["/etc/cdi", "/var/run/cdi"] 81c79 < default_runtime_name = "nvidia" --- > default_runtime_name = "runc" 115,124d112 < < [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] < privileged_without_host_devices = false < runtime_engine = "" < runtime_root = "" < runtime_type = "io.containerd.runc.v2" < < [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] < BinaryName = "/usr/bin/nvidia-container-runtime" < SystemdCgroup = true EOF |
1 2 |
patch /etc/containerd/config.toml -i /etc/containerd/config.toml.patch systemctl restart containerd |
Развертывание Nvidia плагина в кластере
Выполнить на control-plane
1 2 |
curl -O https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml kubectl create -f nvidia-device-plugin.yml |
Для теста работоспособности можно выполнить следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: restartPolicy: Never containers: - name: cuda-container image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2 resources: limits: nvidia.com/gpu: 1 # requesting 1 GPU tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule EOF |
1 |
kubectl logs gpu-pod |
В логах не должно быть ошибок. CUDA тест должен выполниться успешно. Не забудьте удалить pod.
И еще есть приятная информация — т.к мы подменяем runc на форк от Nvidia, то есть возможность делить 1 GPU на множество подов. Официальное число — 1 GPU делится максимум до 32 подов. Я проверял работу 1 GPU на 2 пода. Ресурс GPU делится равномерно.