device plugin 은 부품이고 GPU Operator 는 그 부품을 포함한 완성 패키지다.
NVIDIA device plugin 은 쿠버네티스 Device Plugin 프레임워크를 구현한 단일 컴포넌트로, 노드의 GPU 를 발견해 kubelet 에 nvidia.com/gpu 리소스로 등록하는 일만 한다. DaemonSet 하나만 배포하면 되어 가볍지만 드라이버 설치, NVIDIA Container Toolkit 설치와 런타임 설정, 모니터링, MIG 설정은 운영자가 직접 해야 한다.
GPU Operator 는 Operator 패턴으로 그 전제 조건을 자동화한다. 내부에 device plugin 을 포함하고 컨테이너화된 드라이버 설치·관리, Container Toolkit 설정, DCGM Exporter(Prometheus 메트릭), GPU Feature Discovery(노드 라벨링), MIG Manager, Node Feature Discovery 를 함께 배포하며 CRD 로 상태를 선언적으로 관리한다.
| 구분 | device plugin | GPU Operator |
|---|---|---|
| 범위 | GPU 리소스 등록만 | 드라이버부터 모니터링까지 전체 스택 |
| 드라이버 설치 | 수동 | 자동 |
| 구성 요소 | DaemonSet 1개 | 여러 컴포넌트 묶음(device plugin 포함) |
| 관리 부담 | 설치는 단순, 주변 세팅은 수동 | 초기 설정 후 자동화 |
| 적합 | 드라이버·런타임을 노드 이미지에 이미 구워 관리하는 팀 | 노드가 자주 늘고 버전 관리·모니터링까지 맡기고 싶을 때 |
관리형 쿠버네티스(EKS · GKE · AKS) 는 드라이버가 노드에 이미 있는 경우가 많으므로 GPU Operator 를 쓰더라도 드라이버 설치 부분을 비활성화하는 옵션을 검토한다.
# 노드별 GPU capacity / allocatable
kubectl get nodes -o custom-columns='NODE:.metadata.name,GPU_CAPACITY:.status.capacity.nvidia\.com/gpu,GPU_ALLOCATABLE:.status.allocatable.nvidia\.com/gpu'
kubectl describe node <NODE> | grep -A 10 'Capacity:'
# 플러그인 DaemonSet 동작 여부
kubectl get pods -n kube-system -l name=nvidia-device-plugin-ds -o wide
kubectl get pods -A | grep -i device-plugin
kubectl logs -n kube-system -l name=nvidia-device-plugin-ds --tail=50
# 클러스터 전체 집계
kubectl get nodes -o json | jq -r '.items[] | [.metadata.name, (.status.allocatable["nvidia.com/gpu"] // "0")] | @tsv'
kubectl get pods -A -o json | jq -r '.items[] | select(.spec.containers[].resources.requests["nvidia.com/gpu"] != null) | [.metadata.namespace, .metadata.name] | @tsv'
값이 <none> 이면 플러그인이 등록하지 못했거나 그 노드에 GPU 가 없는 것이다. 실물과 대조하려면 GPU 를 요청하는 테스트 파드를 띄운다(가용 GPU 가 없으면 스케줄링되지 않는다).
kubectl run gpu-check --rm -it --restart=Never \
--image=nvidia/cuda:12.4.0-base-ubuntu22.04 \
--overrides='{"spec":{"containers":[{"name":"gpu-check","image":"nvidia/cuda:12.4.0-base-ubuntu22.04","command":["nvidia-smi"],"resources":{"limits":{"nvidia.com/gpu":1}}}]}}'