На днях мне понадобилась локальная среда c Kubernetes для запуска GPU задач и тестирования сервисов с ИИ. Мой рабочий компьютер — это ноутбук Lenovo Legion следующей конфигурации:
- Процессор 13th Gen Intel(R) Core(TM) i7-13650HX (2.60 GHz)
- Оперативная память 32 GB
- Видеокарта NVIDIA GeForce RTX 5070 Laptop GPU
- Диск 1 TB SSD
Каждый раз арендовать облако и временно развертывать K8s-окружение, чтобы экономить на стоимости — не очень удобно. Поэтому я решил попробовать сконфигурировать локальную среду. Оказалось, что Kubernetes с доступом к GPU внутри WSL2 — это реально. Но есть несколько неочевидных нюансов, которые ломают рантайм.
TL;DR
Итоговый стек:
- Windows 11 + NVIDIA driver (с поддержкой WSL)
- Podman
- WSL2 (Ubuntu 24.04)
- K3s (containerd)
- NVIDIA Container Toolkit
- NVIDIA device plugin
- фикс: runtimeClassName: nvidia для device plugin
Что хотелось получить
По сути — мини-кластер на ноутбуке, который работает по следующей схеме:
Pod → Kubernetes → containerd → NVIDIA runtime → WSL GPU → Windows driver → RTX GPU
С возможностью делать:
- локальный инференс
- эксперименты с AI-инфраструктурой и GPU
Шаг 1: Проверка GPU в WSL
Если после установки WSL2 у вас работает Nvidia System Management:
nvidia-smi— двигаемся дальше.
Шаг 2: Linux-драйверы
WSL — особенная штука. Драйвер для GPU живет в Windows, Linux просто проксирует доступ через /usr/lib/wsl
Если nvidia-smi не находится:
echo 'export PATH=$PATH:/usr/lib/wsl/lib' >> ~/.bashrc
source ~/.bashrcЧего не стоит делать:
apt install nvidia-utils-*Такая установка системных пакетов внутри Linux почти гарантированно все сломает.
Шаг 3: Проверка GPU в контейнерах
Перед установкой Kubernetes важно убедиться, что GPU работает в контейнерах.
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
podman run --rm --device=nvidia.com/gpu=all ubuntu nvidia-smiЕсли последняя команда выполняется успешно, то runtime настроен правильно.
Шаг 4: Установка K3s
curl -sfL https://get.k3s.io | sh -Настраиваем kubeconfig:
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
export KUBECONFIG=~/.kube/configПроверяем доступна ли наша единственная Kubernetes нода:
kubectl get nodesШаг 5: Подключение NVIDIA runtime
sudo nvidia-ctk runtime configure --runtime=containerd
sudo systemctl restart k3sПосле перезапуска K3s убеждаемся, что поддержка GPU есть в конфиге:
sudo grep nvidia /var/lib/rancher/k3s/agent/etc/containerd/config.tomlШаг 6: Установка device plugin
kubectl apply -f \
https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.17.1/deployments/static/nvidia-device-plugin.ymlNVIDIA runtime и device plugin
После выполнения шага 6 я столкнулся со следующей ситуацией вокруг device plugin — он запускается и не падает, но не видит GPU. В логах можно увидеть:
No devices found. Waiting indefinitely.
Incompatible strategy detected autoПричина такого поведения кроется в том, что device plugin запускается под обычным runtime (runc), а не под NVIDIA runtime. Т. е.:
- внутри pod’а нет CUDA / NVML
- GPU не может быть обнаружен
- nvidia.com/gpu не регистрируется
Нужно заставить сам device plugin использовать NVIDIA runtime:
kubectl patch daemonset nvidia-device-plugin-daemonset \
-n kube-system \
--type='merge' \
-p '{"spec":{"template":{"spec":{"runtimeClassName":"nvidia"}}}}'Перезапускаем pod:
kubectl delete pod -n kube-system -l name=nvidia-device-plugin-dsи проверяем доступные GPU:
kubectl get node -o jsonpath='{.status.capacity.nvidia\.com/gpu}'Команда должна вернуть 1.
Финальная проверка
Для тестирования работы GPU внутри WSL2 можно запустить следующий pod:
cat <<'EOF' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: cuda-smoke-test
spec:
restartPolicy: Never
runtimeClassName: nvidia
containers:
- name: cuda
image: nvcr.io/nvidia/k8s/cuda-sample:nbody
args: ["nbody", "-gpu", "-benchmark"]
resources:
limits:
nvidia.com/gpu: 1
EOFи проверить его состояние и логи:
kubectl get pod cuda-smoke-test -w
kubectl logs cuda-smoke-testЧто в итоге получилось
- локальный Kubernetes на ноутбуке с Nvidia RTX 5070 (8GB vRAM)
- с возможность GPU scheduling
- тестирования задач с CUDA и LLM
Такое окружение хорошо подходит для локального инференса LLM, экспериментов и обучения. Но его не стоит использовать для бенчмарков и более серьезных задач.