Skip to content
Published on

[가상화] 08. KubeVirt + GPU: VM에서 GPU 가속 활용하기

Authors

들어가며

KubeVirt로 VM을 쿠버네티스에서 실행할 수 있게 되었고, GPU Operator로 GPU 관리를 자동화했습니다. 이제 두 기술을 결합하여 VM에서 GPU 가속을 활용하는 방법을 알아보겠습니다.

GPU Operator와 KubeVirt 통합

GPU Operator는 KubeVirt VM에 GPU를 제공하기 위한 두 가지 모드를 지원합니다.

노드 레이블링: gpu.workload.config

nvidia.com/gpu.workload.config 레이블 값에 따라 GPU의 사용 모드가 결정됩니다.

레이블 값설명대상
container기본값. 표준 컨테이너 GPUPod
vm-passthroughGPU 전체를 VM에 패스스루KubeVirt VM
vm-vgpuvGPU 인스턴스를 VM에 할당KubeVirt VM
# 노드를 VM 패스스루 모드로 설정
kubectl label node worker-gpu-01 \
  nvidia.com/gpu.workload.config=vm-passthrough --overwrite

# 노드를 vGPU 모드로 설정
kubectl label node worker-gpu-01 \
  nvidia.com/gpu.workload.config=vm-vgpu --overwrite

# 기본 컨테이너 모드로 복원
kubectl label node worker-gpu-01 \
  nvidia.com/gpu.workload.config=container --overwrite

모드 변경 시 동작 흐름

노드 레이블 변경
      |
      v
GPU Operator 감지
      |
      v
기존 GPU 소프트웨어 스택 정리
      |
      v
새 모드에 맞는 컴포넌트 배포
      |
      +-- container: Driver + Toolkit + Device Plugin
      |
      +-- vm-passthrough: VFIO Manager + Sandbox Device Plugin
      |
      +-- vm-vgpu: vGPU Manager + Sandbox Device Plugin

GPU 패스스루 워크플로우

GPU 패스스루는 물리 GPU 전체를 VM에 직접 할당하는 방식입니다. 네이티브에 가까운 성능을 제공합니다.

1단계: IOMMU 활성화

BIOS와 커널 모두에서 IOMMU를 활성화해야 합니다.

# Intel CPU의 경우 커널 파라미터 추가
# GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"

# AMD CPU의 경우
# GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt"

# GRUB 업데이트 후 재부팅
sudo update-grub
sudo reboot

# IOMMU 활성화 확인
dmesg | grep -i iommu
# 출력: DMAR: IOMMU enabled

2단계: VFIO Manager DaemonSet

GPU Operator가 VFIO Manager를 자동으로 배포합니다.

+------------------------------------------+
|            Worker Node                    |
|  +------------------------------------+  |
|  | VFIO Manager (DaemonSet)           |  |
|  |                                    |  |
|  |  1. vfio-pci 커널 모듈 로드         |  |
|  |  2. GPU를 호스트 드라이버에서 언바인드 |  |
|  |  3. GPU를 vfio-pci에 바인드          |  |
|  |                                    |  |
|  +------------------------------------+  |
|                                          |
|  GPU 상태:                                |
|  nvidia 드라이버 --> vfio-pci 드라이버     |
+------------------------------------------+

VFIO Manager의 동작 과정은 다음과 같습니다.

  • vfio-pci 커널 모듈 로드
  • GPU 디바이스를 NVIDIA 드라이버에서 분리(unbind)
  • GPU를 vfio-pci 드라이버에 바인드(bind)
  • VM이 GPU에 직접 접근 가능하게 됨

3단계: Sandbox Device Plugin

Sandbox Device Plugin이 패스스루 가능한 GPU를 검색하여 kubelet에 등록합니다.

+------------------------------------------+
| Sandbox Device Plugin (DaemonSet)        |
|                                          |
| 1. VFIO에 바인드된 GPU 디바이스 검색       |
| 2. nvidia.com/gpu 리소스로 kubelet에 등록 |
| 3. KubeVirt VMGPU를 요청 가능          |
+------------------------------------------+

vGPU 워크플로우

vGPU는 하나의 물리 GPU를 여러 VM에 분할하여 제공하는 방식입니다.

vGPU Manager 드라이버 배포

+------------------------------------------+
|            Worker Node                    |
|  +------------------------------------+  |
|  | vGPU Manager (DaemonSet)           |  |
|  |                                    |  |
|  |  - vGPU 호스트 드라이버 설치         |  |
|  |  - Mediated Device 또는 SR-IOV VF   |  |
|  |    생성                             |  |
|  +------------------------------------+  |
|                                          |
|  +------------------------------------+  |
|  | Sandbox Device Plugin              |  |
|  |  - vGPU 디바이스 검색               |  |
|  |  - nvidia.com/VGPU_TYPE으로 등록    |  |
|  +------------------------------------+  |
+------------------------------------------+

GPU 아키텍처별 vGPU 구현

GPU 아키텍처vGPU 구현 방식
Ampere 이전 (V100 등)Mediated Devices (MDEV)
Ampere (A100)MIG-backed vGPU 또는 MDEV
Hopper 이후 (H100)SR-IOV Virtual Functions

vGPU 타입 예시

A100에서 사용 가능한 vGPU 프로파일은 다음과 같습니다.

vGPU 타입프레임버퍼최대 인스턴스
A100-1-5C5GB7
A100-2-10C10GB3
A100-3-20C20GB2
A100-4-40C40GB1
A100-1-5CME5GB (MIG)7

KubeVirt CR 설정

permittedDevices 구성

KubeVirt CR에서 GPU 디바이스를 VM에서 사용할 수 있도록 허용해야 합니다.

apiVersion: kubevirt.io/v1
kind: KubeVirt
metadata:
  name: kubevirt
  namespace: kubevirt
spec:
  configuration:
    permittedHostDevices:
      pciHostDevices:
        - pciVendorSelector: '10DE:20B5'
          resourceName: 'nvidia.com/gpu'
          externalResourceProvider: true
      mediatedDevices:
        - mdevNameSelector: 'NVIDIA A100-1-5C'
          resourceName: 'nvidia.com/NVIDIA_A100-1-5C'

pciVendorSelector는 GPU의 PCI 벤더/디바이스 ID입니다. 다음 명령으로 확인할 수 있습니다.

# GPU PCI ID 확인
lspci -nn | grep NVIDIA
# 출력: 3b:00.0 3D controller [0302]: NVIDIA Corporation A100 [10DE:20B5]

VMI 스펙에 GPU 연결

GPU 패스스루 VMI

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: gpu-passthrough-vm
spec:
  running: true
  template:
    metadata:
      labels:
        app: gpu-vm
    spec:
      domain:
        cpu:
          cores: 8
        memory:
          guest: 32Gi
        devices:
          disks:
            - name: rootdisk
              disk:
                bus: virtio
          gpus:
            - name: gpu1
              deviceName: nvidia.com/gpu
          interfaces:
            - name: default
              masquerade: {}
      networks:
        - name: default
          pod: {}
      volumes:
        - name: rootdisk
          dataVolume:
            name: ubuntu-gpu-dv

vGPU VMI

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: vgpu-vm
spec:
  running: true
  template:
    spec:
      domain:
        cpu:
          cores: 4
        memory:
          guest: 16Gi
        devices:
          disks:
            - name: rootdisk
              disk:
                bus: virtio
          gpus:
            - name: vgpu1
              deviceName: nvidia.com/NVIDIA_A100-1-5C
          interfaces:
            - name: default
              masquerade: {}
      networks:
        - name: default
          pod: {}
      volumes:
        - name: rootdisk
          dataVolume:
            name: ubuntu-vgpu-dv

게스트 OS 드라이버 설치

GPU Operator는 VM 내부에 드라이버를 설치하지 않습니다. 게스트 OS에서 직접 설치해야 합니다.

Linux 게스트

# VM 콘솔에 접속
virtctl console gpu-passthrough-vm

# NVIDIA 드라이버 설치 (Ubuntu)
sudo apt-get update
sudo apt-get install -y linux-headers-$(uname -r)

# NVIDIA 드라이버 리포지토리 추가
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# 드라이버 설치
sudo apt-get install -y nvidia-driver-550

# 재부팅 후 확인
sudo reboot
nvidia-smi

Windows 게스트

1. NVIDIA 공식 사이트에서 드라이버 다운로드
   - 패스스루: 일반 GPU 드라이버
   - vGPU: NVIDIA vGPU 게스트 드라이버

2. RDP 또는 VNCWindows VM에 접속

3. 드라이버 설치 프로그램 실행

4. 재부팅 후 Device Manager에서 GPU 확인

전체 아키텍처 다이어그램

+------------------------------------------------------------------+
|                    Kubernetes Cluster                              |
|                                                                    |
|  +---------------------------+  +------------------------------+  |
|  | Container Node            |  | GPU Node (vm-passthrough)    |  |
|  | gpu.workload.config:      |  | gpu.workload.config:         |  |
|  |   container               |  |   vm-passthrough             |  |
|  |                           |  |                              |  |
|  | +-------+ +-------+      |  | +-------------------------+  |  |
|  | | Pod   | | Pod   |      |  | | VFIO Manager            |  |  |
|  | | GPU:1 | | GPU:1 |      |  | | (vfio-pci bind)         |  |  |
|  | +-------+ +-------+      |  | +-------------------------+  |  |
|  |                           |  |                              |  |
|  | NVIDIA Driver             |  | +-------------------------+  |  |
|  | Container Toolkit         |  | | Sandbox Device Plugin   |  |  |
|  | Device Plugin             |  | +-------------------------+  |  |
|  +---------------------------+  |                              |  |
|                                  | +--------+  +--------+     |  |
|                                  | |  VM 1  |  |  VM 2  |     |  |
|                                  | | GPU:1  |  | GPU:1  |     |  |
|                                  | +--------+  +--------+     |  |
|                                  +------------------------------+  |
+------------------------------------------------------------------+

성능 고려사항

패스스루 vs vGPU 성능 비교

항목패스스루vGPU
GPU 활용률100% (전용)공유 (프로파일에 따라)
성능 오버헤드1-3%5-10%
GPU 메모리전체 사용 가능프로파일에 따라 제한
VM 밀도1 GPU = 1 VM1 GPU = 여러 VM
라이브 마이그레이션제한적지원
라이선스추가 없음vGPU 라이선스 필요

벤치마크 참고값

다음은 A100 GPU에서의 일반적인 성능 비교입니다.

워크로드베어메탈패스스루vGPU (전체 프로파일)
ResNet-50 학습100%97-99%90-95%
BERT 추론100%98-99%92-96%
CUDA 벤치마크100%97-99%91-95%

유스케이스

1. VDI (Virtual Desktop Infrastructure) on K8s

+--------------------------------------------------+
| Kubernetes Cluster                                |
|                                                    |
| +--------+ +--------+ +--------+ +--------+      |
| | Win VM | | Win VM | | Win VM | | Win VM |      |
| | vGPU   | | vGPU   | | vGPU   | | vGPU   |      |
| +--------+ +--------+ +--------+ +--------+      |
|      |          |          |          |            |
|      +----------+----------+----------+            |
|                     |                              |
|              +------+------+                       |
|              | Physical GPU|                       |
|              | (A100/L40)  |                       |
|              +-------------+                       |
+--------------------------------------------------+

2. 레거시 Windows ML 워크로드

컨테이너화할 수 없는 Windows 기반 ML 애플리케이션을 KubeVirt VM에서 GPU와 함께 실행합니다.

3. 멀티테넌트 GPU 격리

vGPU를 사용하여 테넌트 간 GPU 메모리와 컴퓨팅 리소스를 하드웨어 수준에서 격리합니다.

4. VMware 마이그레이션

기존 VMware 환경의 GPU VM을 KubeVirt로 마이그레이션하여 라이선스 비용을 절감합니다.

트러블슈팅

일반적인 문제와 해결 방법

문제원인해결 방법
GPU가 VM에 보이지 않음permittedDevices 미설정KubeVirt CR에 디바이스 추가
VFIO 바인드 실패IOMMU 미활성화BIOS/커널 IOMMU 설정 확인
vGPU 생성 실패vGPU Manager 미설치GPU Operator vGPU 설정 확인
게스트에서 nvidia-smi 실패게스트 드라이버 미설치VM 내부에 드라이버 설치
# GPU 디바이스 상태 확인
kubectl get node worker-gpu-01 -o json | jq '.status.allocatable'

# VFIO 바인드 상태 확인
kubectl logs -n gpu-operator -l app=nvidia-vfio-manager

# Sandbox Device Plugin 로그 확인
kubectl logs -n gpu-operator -l app=nvidia-sandbox-device-plugin

마치며

KubeVirt와 GPU Operator의 결합은 VM 기반 GPU 워크로드를 쿠버네티스로 통합하는 강력한 방법입니다. 패스스루는 최대 성능이 필요한 경우에, vGPU는 GPU 공유와 효율성이 중요한 경우에 적합합니다.

다음 글에서는 QEMU, VirtualBox, VMware, KubeVirt를 종합적으로 비교하여 각 플랫폼의 장단점을 분석하겠습니다.


퀴즈: KubeVirt GPU 이해도 점검

Q1. GPU 패스스루 모드를 활성화하기 위한 노드 레이블 값은?

A) container B) vm-passthrough C) gpu-direct D) vfio-passthrough

정답: B) nvidia.com/gpu.workload.config=vm-passthrough 레이블을 설정합니다.


Q2. GPU 패스스루 시 VFIO Manager의 역할은?

A) VM 내부에 GPU 드라이버 설치 B) GPU를 vfio-pci 드라이버에 바인드 C) vGPU 인스턴스 생성 D) GPU 메트릭 수집

정답: B) VFIO Manager는 GPU를 NVIDIA 드라이버에서 분리하고 vfio-pci에 바인드하여 VM이 직접 접근할 수 있게 합니다.


Q3. GPU Operator가 VM에서 하지 않는 것은?

A) VFIO Manager 배포 B) Sandbox Device Plugin 배포 C) 게스트 OS 내 GPU 드라이버 설치 D) 노드 레이블링 자동화

정답: C) GPU Operator는 호스트 수준의 소프트웨어만 관리합니다. 게스트 OS 내부의 GPU 드라이버는 사용자가 직접 설치해야 합니다.


Q4. vGPU의 장점이 아닌 것은?

A) 하나의 GPU를 여러 VM에서 공유 B) 라이브 마이그레이션 지원 C) 추가 라이선스 비용 없음 D) 하드웨어 수준의 GPU 격리

정답: C) vGPU는 NVIDIA vGPU 라이선스가 필요합니다. 패스스루는 추가 라이선스가 필요하지 않습니다.