WSL k3s GPU Operator
1. wsl 설치
wsl --install -d Ubuntu-26.04
2. 접속 후 업데이트 및 업그레이드
sudo apt update && sudo apt upgrade -y
3. k3s 설치
// 설치
curl -sfL https://get.k3s.io | sh -
// 테스트 (굳이 안해도됨)
sudo chmod 644 /etc/rancher/k3s/k3s.yaml
// 확인 (굳이 안해도됨)
kubectl get node --kubeconfig /etc/rancher/k3s/k3s.yaml
NAME STATUS ROLES AGE VERSION
desktop Ready control-plane 4m5s v1.35.5+k3s1
설치 후 kubeconfig 위치 변경
// 폴더 생성
mkdir -p ~/.kube
// 복사
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
// 권한 변경
sudo chown $(id -u):$(id -g) ~/.kube/config
// 환경변수 설정
echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc
source ~/.bashrc
// 테스트
kubectl get node
NAME STATUS ROLES AGE VERSION
desktop Ready control-plane 102s v1.35.5+k3s1
4. WSL 내부 GPU확인
nvdia-smi 명령어를 통해 아래와 같이 나오면 GPU사용가능
nvidia-smi
Wed Jun 17 23:10:50 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 575.64.01 Driver Version: 576.88 CUDA Version: 12.9 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 5xxx On | 00000000:01:00.0 On | N/A |
| 0% 43C P8 xxW / xxxW | xxxxMiB / xxxxxMiB | 9% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
5. NVIDIA Container Toolkit 설치
해당 가이드대로 설치한다
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
sudo apt-get update && sudo apt-get install -y --no-install-recommends \
ca-certificates \
curl \
gnupg2
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.19.1-1
sudo apt-get install -y \
nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}
6. containerd 설정 후 재시작
k3s는 재시작하면 config.toml을 재생성하므로 tmpl를 만들어두고 이를 사용하도록 한다.
/var/lib/rancher/k3s/agent/etc/containerd 해당 경로의 config.toml 파일을 복사한 뒤 내용을 추가한다.
// 복사
sudo cp /var/lib/rancher/k3s/agent/etc/containerd/config.toml /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
// 추가
sudo vi /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
// 파일 끝에 추가
[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"
// 재시작
sudo systemctl restart k3s
7. GPU Operator 설치
helm 설치
sudo apt-get install curl gpg apt-transport-https --yes
curl -fsSL https://packages.buildkite.com/helm-linux/helm-debian/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/helm.gpg] https://packages.buildkite.com/helm-linux/helm-debian/any/ any main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
helm repo 추가
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
&& helm repo update
gpu-operator 설치
driver는 wsl에서 관리하고, toolkit은 위에서 설치했으므로 enabled=false로 설정하고 설치
// 설치
helm install gpu-operator nvidia/gpu-operator \
-n gpu-operator \
--create-namespace \
--set driver.enabled=false \
--set toolkit.enabled=false
// 조회
kubectl get pods -n gpu-operator
NAME READY STATUS RESTARTS AGE
gpu-operator-fdfdb94d4-k5hgv 1/1 Running 0 98s
gpu-operator-node-feature-discovery-gc-585b876f9c-ln6fh 1/1 Running 0 98s
gpu-operator-node-feature-discovery-master-7f6684fb45-srbnx 1/1 Running 0 98s
gpu-operator-node-feature-discovery-worker-prczd 1/1 Running 0 98s
설치하면 4개가 나오는데 사실 nvidia 관련 pod들이 더 실행되어야한다.
k3s로 설치해서 node에 라벨을 자동으로 안붙여줘서 그런거같은데, node에 라벨을 붙여주고 restart한다
// 로그찍어보면 label이 없다고함
kubectl logs -f gpu-operator-fdfdb94d4-k5hgv -n gpu-operator
{"level":"info","ts":1781708654.030799,"logger":"controllers.ClusterPolicy","msg":"No NFD label found, polling for new nodes.","requeueAfter":45}
// 라벨을 붙여준다
kubectl label node <node이름> nvidia.com/gpu.present=true feature.node.kubernetes.io/pci-10de.present=true
// rollout
kubectl rollout restart deploy -n gpu-operator
kubectl rollout restart ds -n gpu-operator
다시 get pod해보면 nvidia 관련된 pod들이 실행된다.
하지만, 에러가 발생하는데 WSL은 기본적으로 shared mount를 지원 안 해서 발생한다.
// 조회
kubectl get pods -n gpu-operator
NAME READY STATUS RESTARTS AGE
gpu-feature-discovery-z5scz 0/1 Init:0/1 0 35s
gpu-operator-54f9874dfb-2jktc 1/1 Running 0 72s
gpu-operator-node-feature-discovery-gc-77c98d7b86-tgspd 1/1 Running 0 72s
gpu-operator-node-feature-discovery-master-6b7c5c5c7c-9ctf5 1/1 Running 0 72s
gpu-operator-node-feature-discovery-worker-nh68d 1/1 Running 0 52s
nvidia-dcgm-exporter-k9xwp 0/1 Init:0/1 0 36s
nvidia-device-plugin-daemonset-4zrkn 0/1 Init:0/1 0 38s
nvidia-operator-validator-fnd8l 0/1 Init:CreateContainerError 0 39s
// 에러로그
kubectl describe pods nvidia-operator-validator-fnd8l -n gpu-operator
Error: failed to generate container "87d5f73a778cafe98bcc8b47b2fdfcd374483328f6eab18bca95b132040e7de5" spec: failed to generate spec: path "/" is mounted on "/" but it is not a shared or slave mount
기타 다른 해결방법이 많은데, 우선 간단하게 해결하는 방법은 아래와 같다. 대신 wsl 기동할때마다 해줘야함
// wsl 재시작할때마다 해줘야 함
sudo mount --make-rshared /
// 이후 다시 조회하면 정상으로 실행됨.
kubectl get pods -n gpu-operator
NAME READY STATUS RESTARTS AGE
gpu-feature-discovery-z5scz 1/1 Running 0 3m11s
gpu-operator-54f9874dfb-2jktc 1/1 Running 0 3m48s
gpu-operator-node-feature-discovery-gc-77c98d7b86-tgspd 1/1 Running 0 3m48s
gpu-operator-node-feature-discovery-master-6b7c5c5c7c-9ctf5 1/1 Running 0 3m48s
gpu-operator-node-feature-discovery-worker-nh68d 1/1 Running 0 3m28s
nvidia-cuda-validator-p2sdv 0/1 Completed 0 22s
nvidia-dcgm-exporter-k9xwp 0/1 Running 0 3m12s
nvidia-device-plugin-daemonset-4zrkn 1/1 Running 0 3m14s
nvidia-operator-validator-fnd8l 1/1 Running 0 3m15s
describe node를 해서 nvidia.com/gpu: 1이 잘 나오는지 확인한다.
안나오면 설정이 제대로 되지 않은 것이다.
kubectl describe node
...
Allocatable:
...
nvidia.com/gpu: 1
...
8. 테스트 pod 실행
테스트 pod를 실행해본다. 아래는 참고사항이다.
- GPU limits를 명시할 때 requests는 명시하지 않아도 된다.
- limits와 requests를 모두 명시할 수 있지만, 두 값은 동일해야 한다.
- limits 명시 없이는 GPU requests를 명시할 수 없다.
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
restartPolicy: Never
containers:
- name: cuda
image: "nvidia/cuda:12.3.0-base-ubuntu22.04"
command:
- nvidia-smi
resources:
limits:
nvidia.com/gpu: 1
pod를 조회 후 log를 찍어 확인한다.
// Pod 조회
kubectl get pods
NAME READY STATUS RESTARTS AGE
gpu-test 0/1 Completed 0 15s
// log 출력
kubectl logs -f gpu-test
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 575.64.01 Driver Version: 576.88 CUDA Version: 12.9 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 5xxx On | 00000000:01:00.0 On | N/A |
| 0% 43C P8 xxW / xxxW | xxxxMiB / xxxxxMiB | 9% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
기타. 에러관련
'failed to create containerd container: cdi device injection failed unresolvable cdi devices k8s.device-plugin.nvidia.com/gpu' 가끔 해당 에러를 출력하는 경우가 있는데, 2가지방법으로 처리가 가능하다.
1) containerd 재설정
enable_cdi 옵션 추가
// 수정
sudo vi /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
// 해당부분 찾아서 기존에 있는 내용에 아래 2줄 추가
[plugins."io.containerd.grpc.v1.cri"]
...
enable_cdi = true
cdi_spec_dirs = ["/etc/cdi", "/var/run/cdi"]
// 재시작
sudo systemctl restart k3s
2) cdi 변경
cdi를 비활성화 한다.
kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
-p='[{"op": "replace", "path": "/spec/cdi/enabled", "value":false}]'
기본적으로 WSL에서 GPU Operator 사용 방법이며, Timeslice, Volcano, KAI, MIG(DRA) 등을 같이 사용한다.
* MIG는 참고로 일반 PC용 그래픽카드에서는 지원하지 않는다. 집에서 테스트하기엔 어려움