MicroK8s에서 NVIDIA GPU 지원 설정
작성자: walter
1. 개요
MicroK8s는 기본적으로 containerd를 컨테이너 런타임으로 사용합니다. GPU 지원을 위해 gpu-operator를 설치하고 CONTAINERD_RUNTIME_CLASS를 nvidia로 설정해야 합니다. MicroK8s의 containerd 설정 방식이 일반적인 Kubernetes 환경과 다르므로, 이를 반영하여 NVIDIA GPU를 활성화하는 방법을 정리합니다.
2. MicroK8s의 containerd 설정 방식
MicroK8s는 containerd 설정을 /var/snap/microk8s/current/args/containerd.toml 파일에서 관리합니다. 하지만 이 파일은 직접 수정하는 것이 아니라, 템플릿 파일을 기반으로 생성됩니다.
2.1 containerd 설정 파일 경로
- 템플릿 파일:
/var/snap/microk8s/current/args/containerd-template.toml - 실제 적용 파일:
/var/snap/microk8s/current/args/containerd.toml - 환경 변수 파일:
/var/snap/microk8s/current/args/containerd-env
2.2 containerd 설정 파일 재생성 과정
MicroK8s에서 containerd를 재시작할 때 containerd-template.toml을 기반으로 새로운 containerd.toml이 생성됩니다.
sudo systemctl restart snap.microk8s.daemon-containerd
이때, 환경 변수 파일을 기준으로 설정이 적용됩니다.
설정이 정상적으로 반영되었는지 확인하려면 다음 명령어를 사용합니다.
sudo journalctl -u snap.microk8s.daemon-containerd -f
3. NVIDIA GPU 지원 설정
3.1 containerd에서 NVIDIA 런타임 활성화
기본적으로 containerd.toml 파일에서 런타임은 runc로 설정되어 있습니다. GPU를 사용하려면 gpu-operator 설치 후 CONTAINERD_RUNTIME_CLASS를 nvidia로 변경해야 합니다.
3.2 NVIDIA 컨테이너 런타임 설정 추가
- 템플릿 파일 수정
sudo vi /var/snap/microk8s/current/args/containerd-template.toml
runtimes항목에 NVIDIA 런타임을 추가:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
runtime_type = "io.containerd.runc.v2"
privileged_without_host_devices = false
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
- containerd 재시작
sudo systemctl restart snap.microk8s.daemon-containerd
- 설정 확인
microk8s.kubectl get runtimeclass
4. GPU Operator 설치 및 적용
- Helm을 이용한 GPU Operator 설치
helm repo add nvidia <https://nvidia.github.io/gpu-operator>
helm repo update
helm install gpu-operator nvidia/gpu-operator --set driver.enabled=false --set toolkit.enabled=true
CONTAINERD_RUNTIME_CLASS설정
kubectl patch clusterpolicy gpu-cluster-policy --type=json -p='[{"op": "replace", "path": "/spec/runtimeClass", "value": "nvidia"}]'
- 정상 작동 확인
kubectl get pods -n gpu-operator
GPU 관련 Pod가 정상적으로 실행되고 있는지 확인합니다.
5. 다이어그램
- MicroK8s는 containerd 설정을 템플릿 파일을 기반으로 생성하므로 직접 수정하면 안 됩니다.
/var/snap/microk8s/current/args/containerd-template.toml에서nvidia런타임을 추가한 후 containerd를 재시작해야 합니다.gpu-operator를 Helm으로 설치하고CONTAINERD_RUNTIME_CLASS를nvidia로 변경해야 합니다.- 설정 후
kubectl get pods -n gpu-operator를 실행하여 정상적으로 GPU가 동작하는지 확인합니다.
이 과정을 따르면 MicroK8s에서 NVIDIA GPU를 활용할 수 있습니다.
6. GPU Operator
- NVIDIA가 제공하는 Helm 기반의 오퍼레이터로, GPU를 자동으로 설정하고 관리합니다.
- 주요 기능:
- NVIDIA 드라이버 설치 및 관리
- NVIDIA 컨테이너 툴킷 설치
- NVIDIA Device Plugin 배포 (자동 포함)
- GPU 모니터링을 위한
DCGM Exporter추가 - NVIDIA MIG(Multi-Instance GPU) 지원
k delete clusterrolebinding gpu-operator
k delete clusterrole gpu-operator
k delete clusterpolicy cluster-policy
k delete namespace gpu-operator-resources
helm install gpu-operator -n gpu-operator --create-namespace \
nvidia/gpu-operator $HELM_OPTIONS \
--version=v24.9.2 \
--set toolkit.env[0].name=CONTAINERD_CONFIG \
--set toolkit.env[0].value=/var/snap/microk8s/current/args/containerd-template.toml \
--set toolkit.env[1].name=CONTAINERD_SOCKET \
--set toolkit.env[1].value=/var/snap/microk8s/common/run/containerd.sock \
--set toolkit.env[2].name=CONTAINERD_RUNTIME_CLASS \
--set toolkit.env[2].value=nvidia \
--set toolkit.env[3].name=CONTAINERD_SET_AS_DEFAULT \
--set-string toolkit.env[3].value=true
helm install --wait --generate-name \
-n gpu-operator --create-namespace \
nvidia/gpu-operator \
--version=v24.9.2 \
--set toolkit.version=v1.16.3-ubuntu22.04 \
--set toolkit.env[0].name=CONTAINERD_CONFIG \
--set toolkit.env[0].value=/etc/containerd/config.toml \
--set toolkit.env[1].name=CONTAINERD_SOCKET \
--set toolkit.env[1].value=/run/containerd/containerd.sock \
--set toolkit.env[2].name=CONTAINERD_RUNTIME_CLASS \
--set toolkit.env[2].value=nvidia \
--set toolkit.enabled=true
kubectl -n gpu-operator delete pod $(kubectl -n gpu-operator get pod | grep -i 'Terminating' | awk '{print $1}') --force=true --wait=false --grace-period=0 이슈
microk8s에서 확인하고 실행하는 설정파일이 기존 k8s와 다른 문제로 /var/snap/microk8s/current/args 안에 설정파일 확인 필요