Infra
Nvidia MicroK8s 설정

MicroK8s에서 NVIDIA GPU 지원 설정

작성자: walter

1. 개요

MicroK8s는 기본적으로 containerd를 컨테이너 런타임으로 사용합니다. GPU 지원을 위해 gpu-operator를 설치하고 CONTAINERD_RUNTIME_CLASSnvidia로 설정해야 합니다. 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_CLASSnvidia로 변경해야 합니다.

3.2 NVIDIA 컨테이너 런타임 설정 추가

  1. 템플릿 파일 수정
sudo vi /var/snap/microk8s/current/args/containerd-template.toml
 
  1. 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"
 
  1. containerd 재시작
sudo systemctl restart snap.microk8s.daemon-containerd
 
  1. 설정 확인
microk8s.kubectl get runtimeclass
 

4. GPU Operator 설치 및 적용

  1. 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
 
  1. CONTAINERD_RUNTIME_CLASS 설정
kubectl patch clusterpolicy gpu-cluster-policy --type=json -p='[{"op": "replace", "path": "/spec/runtimeClass", "value": "nvidia"}]'
 
  1. 정상 작동 확인
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_CLASSnvidia로 변경해야 합니다.
  • 설정 후 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 안에 설정파일 확인 필요