NVIDIA GPU Operator 활용

Prev Next

VPC 환경에서 이용 가능합니다.

Ncloud Kubernetes Service(NKS)에서 NVIDIA GPU Operator를 사용하여 GPU 노드의 드라이버와 관련 컴포넌트를 클러스터에서 관리할 수 있습니다. 노드풀마다 GPU 모델이 다른 경우, 노드풀별로 서로 다른 드라이버 버전을 적용할 수 있습니다.

사용 전 확인

GPU Operator를 사용하기 전에 다음 지원 범위와 준비 사항을 확인해 주십시오.

항목 지원 범위
이용 환경 VPC
Kubernetes 1.33 이상
GPU Operator v26.7.0
설치 방식 Helm 수동 설치
노드 OS Ubuntu 22.04 또는 24.04
리전 KR

이 문서에서 다루는 GPU Operator의 주요 컴포넌트는 다음과 같습니다. 차트 버전과 설정에 따라 추가 컴포넌트가 함께 설치될 수 있습니다.

컴포넌트 역할
NVIDIA Driver GPU 노드에 드라이버 설치 및 커널 모듈 적재
NVIDIA Container Toolkit 컨테이너에서 GPU를 사용할 수 있도록 런타임 구성
NVIDIA Device Plugin nvidia.com/gpu 리소스를 kubelet에 등록
Node Feature Discovery 노드의 하드웨어와 OS 정보를 레이블로 등록
GPU Feature Discovery GPU 모델, 개수, 드라이버 버전을 레이블로 등록
DCGM Exporter GPU 메트릭을 Prometheus 형식으로 노출
Operator Validator 드라이버와 런타임 구성이 정상인지 검증
MIG Manager MIG를 지원하는 GPU에서 MIG 구성을 적용

GPU Operator는 이 컴포넌트들의 구성을 ClusterPolicy 리소스 하나로 관리합니다.

다음 항목을 미리 준비해 주십시오.

  • GPU 노드풀과 일반 노드풀로 구성된 Ncloud Kubernetes Service 클러스터
  • kubectl을 사용할 수 있는 kubeconfig
  • Helm 3
  • GPU 서버 상품의 Quota 신청 및 승인
  • 노드에서 nvcr.io와 registry.k8s.io로 이미지를 받을 수 있는 아웃바운드 경로, 또는 해당 이미지를 복사해 둔 컨테이너 레지스트리
  • 노드에서 OS 패키지 저장소에 접근할 수 있는 경로 또는 내부 미러 (드라이버 컨테이너가 커널 헤더 패키지를 내려받음)
  • 사전 설치된 드라이버를 제거하는 경우 대상 노드에 root 권한으로 접속할 수 있는 수단

이 문서의 명령은 현재 선택된 kubeconfig context를 대상으로 실행합니다. 다른 클러스터를 대상으로 하려면 kubectl config use-context로 context를 전환한 후 실행해 주십시오.

설치 과정에서 사용할 값은 다음과 같습니다.

입력값 설명 예시
<OPERATOR_VERSION> 설치할 GPU Operator Helm 차트 버전 v26.7.0
<GPU_NODEPOOL> 드라이버 구성을 적용할 GPU 노드풀 이름 gpu-h100-01
<DRIVER_VERSION> 해당 노드풀에 설치할 드라이버 버전 580.126.20
<DEFAULT_DRIVER_VERSION> 기본 구성에서 사용할 드라이버 버전 595.91.07

설치할 수 있는 드라이버 버전 목록은 클러스터에서 조회할 수 없습니다. GPU Operator Component Matrix에서 설치할 GPU Operator 버전이 기본값으로 사용하는 드라이버 버전을 확인해 주십시오. 특정 버전을 사용해야 하는 이유가 없으면 이 값을 그대로 사용해 주십시오.

다른 버전을 지정하려면 NVIDIA GPU Driver 컨테이너 이미지 태그에서 노드의 OS와 커널을 지원하는 태그가 있는지 확인해 주십시오.

드라이버와 Container Toolkit 이미지는 노드의 OS 버전별로 제공됩니다.

주의

Container Toolkit은 클러스터 단위로 하나만 지정할 수 있고 노드풀별로 다르게 지정할 수 없습니다. 차트 기본값은 OS 이름이 붙지 않은 이미지이므로 지원 범위의 OS를 사용하는 노드풀은 섞어서 구성할 수 있습니다. OS 이름이 붙은 이미지를 지정해야 하는 경우에는 해당 OS를 사용하지 않는 노드에서 GPU를 사용할 수 없으므로 GPU 노드풀의 OS 버전을 통일해 주십시오.

NVIDIA 드라이버의 사전 설치 여부는 노드풀에 선택한 GPU 서버 이미지에 따라 다릅니다. 드라이버를 관리하는 주체는 다음 두 가지 중에서 선택할 수 있습니다.

드라이버 관리 버전을 정하는 곳 버전 변경 방법 노드 추가 및 교체 시
서버 이미지 노드풀에 선택한 서버 이미지 서버 이미지 변경 추가 작업 없음
GPU Operator NVIDIADriver 리소스 리소스의 version 수정 드라이버가 사전 설치된 이미지는 제거 필요

Kubernetes에서 드라이버 버전을 직접 지정하거나 변경해야 하는 경우, GPU Operator가 관리하도록 구성해 주십시오.

참고

드라이버가 사전 설치된 노드에서는 GPU Operator가 드라이버 컨테이너를 실행하지 않으므로 NVIDIADriver 리소스에 지정한 버전이 적용되지 않습니다. 설치 전에는 노드풀에 선택한 GPU 서버 이미지의 드라이버 포함 여부로 판단하고, 설치 후에는 드라이버 설치 방식 확인을 참조하여 노드별 상태를 확인해 주십시오. GPU Operator가 관리하도록 전환하려면 사전 설치된 드라이버 제거를 참조해 주십시오.

GPU 노드풀 준비

GPU Operator를 설치하기 전에 GPU 노드풀의 구성과 레이블을 확인해 주십시오.

주의
  • GPU 노드는 KR 리전에서만 사용할 수 있습니다.
  • NKS의 기본 오브젝트에는 일반 노드가 필요하므로 일반 노드풀과 GPU 노드풀을 함께 구성해 주십시오.
  • 클러스터에 NVIDIA Device Plugin을 이미 설치한 경우, GPU Operator를 설치하기 전에 제거해 주십시오. GPU Operator가 Device Plugin을 함께 설치하므로 두 구성이 같은 GPU를 중복해서 등록합니다.

다음 명령을 실행하여 현재 선택된 context가 대상 클러스터인지 확인해 주십시오.

kubectl config get-contexts
kubectl config current-context

다음 명령을 실행하여 노드풀 이름과 GPU 노드의 레이블을 확인해 주십시오.

kubectl get node -L ncloud.com/nks-nodepool

NKS는 각 노드에 소속 노드풀 정보를 ncloud.com/nks-nodepool: <NODEPOOL_NAME> 형태의 레이블로 추가합니다. 이 레이블은 노드를 교체하거나 노드 수를 늘려도 유지되므로 드라이버 구성을 노드풀 단위로 지정할 때 사용할 수 있습니다. 노드 레이블에 관한 자세한 내용은 클러스터 노드풀 관리를 참조해 주십시오.

다음 명령을 실행하여 GPU 노드에 설정된 taint를 확인해 주십시오.

kubectl get node -o custom-columns='NAME:.metadata.name,TAINTS:.spec.taints'

GPU 노드풀에 taint를 설정한 경우 드라이버 파드가 해당 노드에 배치되도록 구성에 toleration을 추가해야 합니다. 이 문서의 예제는 taint 키로 nvidia.com/gpu를 사용하므로, 확인한 키가 다르면 tolerations 항목을 해당 키에 맞게 변경해 주십시오.

GPU Operator 설치

다음 명령을 실행하여 NVIDIA Helm 저장소를 추가해 주십시오.

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update

다음 조건에 해당하면 명령을 실행하기 전에 해당 섹션을 먼저 확인해 주십시오. 둘 다 해당하지 않으면 그대로 진행해 주십시오.

다음 명령을 실행하여 GPU Operator를 설치해 주십시오. driver.nvidiaDriverCRD.enabled를 true로 설정하면 드라이버를 NVIDIADriver 사용자 정의 리소스로 분리해 관리합니다.

helm install gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator --create-namespace \
  --version "<OPERATOR_VERSION>" \
  --set driver.nvidiaDriverCRD.enabled=true \
  --set driver.nvidiaDriverCRD.deployDefaultCR=false \
  --wait

deployDefaultCR은 차트가 default 리소스를 대신 생성할지 결정하며 기본값은 true입니다. 이 문서는 기본 리소스와 노드풀별 리소스를 모두 직접 정의하므로 false로 설정합니다. 설정값에 따라 수행할 작업 범위가 달라지며, 차이는 노드풀별 드라이버 구성의 표에 정리되어 있습니다.

참고

설치 시 다음 사항을 참조해 주십시오.

  • 드라이버 관리 방식을 NVIDIADriver 리소스로 바꾸면 ClusterPolicy는 드라이버를 제외한 나머지 컴포넌트를 계속 관리합니다.
  • 이미 ClusterPolicy로 드라이버를 관리하는 클러스터에 이 문서의 구성을 적용하는 경우에는 드라이버 관리 방식 전환을 참조해 주십시오.

다음 명령을 실행하여 GPU Operator가 실행 중인지 확인해 주십시오.

kubectl --namespace gpu-operator get pod -l app=gpu-operator
kubectl --namespace gpu-operator get pod -l app.kubernetes.io/name=node-feature-discovery

이 단계에서는 gpu-operator 파드와 Node Feature Discovery 파드가 Running 상태이면 됩니다.

주의

드라이버가 사전 설치되지 않은 노드에서는 설치 직후 다음 상태가 나타납니다.

  • nvidia-operator-validator: Init:Error로 재시작
  • Device Plugin과 DCGM Exporter: Init 상태에서 대기
  • ClusterPolicy: notReady

드라이버가 없어 나머지 컴포넌트가 아직 동작하지 못하는 것이며 장애가 아닙니다. 다음 단계에서 NVIDIADriver 리소스를 적용하면 해소됩니다. 적용한 뒤에도 해소되지 않으면 구성 적용 및 확인의 주의 사항을 참조해 주십시오. 드라이버가 사전 설치된 노드만 사용하는 경우에는 리소스를 적용하지 않아도 나머지 컴포넌트가 동작합니다.

내부 레지스트리를 사용하는 경우

노드에서 nvcr.io와 registry.k8s.io에 접근할 수 없는 경우를 설명합니다. 두 레지스트리에 접근할 수 있으면 이 섹션을 건너뛰어 주십시오.

이미지를 사용할 컨테이너 레지스트리로 복사한 후 다음 values를 변경해 주십시오. 컴포넌트마다 항목이 따로 있으므로 사용하는 컴포넌트를 모두 지정해야 합니다.

컴포넌트 values 항목 기본값
Operator operator.repository nvcr.io/nvidia
Operator Validator validator.repository nvcr.io/nvidia
NVIDIA Driver driver.repository nvcr.io/nvidia
Driver Manager driver.manager.repository nvcr.io/nvidia/cloud-native
NVIDIA Container Toolkit toolkit.repository nvcr.io/nvidia/k8s
NVIDIA Device Plugin devicePlugin.repository nvcr.io/nvidia
GPU Feature Discovery gfd.repository nvcr.io/nvidia
DCGM dcgm.repository nvcr.io/nvidia/cloud-native
DCGM Exporter dcgmExporter.repository nvcr.io/nvidia/k8s
MIG Manager migManager.repository nvcr.io/nvidia/cloud-native
Node Feature Discovery node-feature-discovery.image.repository registry.k8s.io/nfd/node-feature-discovery

repository 항목은 이미지 이름을 제외한 경로이며 이미지 이름은 각 컴포넌트의 image 항목에 있습니다. Node Feature Discovery는 별도 차트로 설치되므로 node-feature-discovery.image.repository에 이미지 이름까지 포함한 경로를 지정하고 태그는 node-feature-discovery.image.tag로 지정합니다.

다음 내용을 복사하여 registry-values.yaml 파일로 저장해 주십시오. <REGISTRY>는 사용할 레지스트리 주소로 변경해 주십시오.

operator:
  repository: <REGISTRY>/nvidia
validator:
  repository: <REGISTRY>/nvidia
driver:
  repository: <REGISTRY>/nvidia
  manager:
    repository: <REGISTRY>/nvidia/cloud-native
toolkit:
  repository: <REGISTRY>/nvidia/k8s
devicePlugin:
  repository: <REGISTRY>/nvidia
gfd:
  repository: <REGISTRY>/nvidia
dcgm:
  repository: <REGISTRY>/nvidia/cloud-native
dcgmExporter:
  repository: <REGISTRY>/nvidia/k8s
migManager:
  repository: <REGISTRY>/nvidia/cloud-native
node-feature-discovery:
  image:
    repository: <REGISTRY>/nfd/node-feature-discovery

앞의 helm install 명령에 --values registry-values.yaml을 추가하여 설치해 주십시오.

주의

NVIDIADriver 리소스를 직접 정의하는 경우 드라이버 이미지는 리소스의 spec.repository 값을 사용하므로 driver.repository만 변경해서는 적용되지 않습니다. 노드풀별 구성 생성에서 만드는 리소스의 repository 항목도 함께 변경해 주십시오.

인증이 필요한 레지스트리를 사용하는 경우 각 컴포넌트의 imagePullSecrets 항목에 시크릿 이름을 지정해 주십시오. NVIDIADriver 리소스는 spec.imagePullSecrets 항목을 사용합니다.

주의

usePrecompiled가 false인 드라이버는 노드에서 커널 헤더 패키지를 내려받아 모듈을 빌드합니다. 컨테이너 이미지를 내부 레지스트리로 복사하는 것만으로는 설치가 끝나지 않으므로 OS 패키지 저장소 접근 경로나 내부 미러도 함께 준비해 주십시오.

Ubuntu 20.04(XEN) 노드를 사용하는 경우

Ubuntu 20.04 노드를 사용하는 경우를 설명합니다. 다른 OS 버전을 사용하면 이 섹션을 건너뛰어 주십시오.

Ubuntu 20.04는 드라이버, Container Toolkit, Device Plugin 이미지의 제공이 중단된 버전이 있어 차트 기본값을 그대로 사용할 수 없습니다. 다음 버전 조합을 지정해 주십시오.

항목 지정할 버전 지정 이유
GPU Operator v26.3.3 v26.7.0의 검증 컴포넌트가 580 이상 드라이버를 요구
Container Toolkit v1.17.9-ubuntu20.04 상위 버전에 Ubuntu 20.04 빌드가 없음
Device Plugin v0.17.4 상위 버전이 생성하는 CDI 구성을 v1.17.9 Container Toolkit이 처리하지 못함
GPU Feature Discovery v0.17.4 Device Plugin과 같은 이미지를 사용
DCGM Exporter 3.2.6-3.1.9-ubuntu20.04 상위 버전에 Ubuntu 20.04 빌드가 없음
드라이버 575.57.08 이하 상위 버전에 Ubuntu 20.04 빌드가 없음

다음 명령을 실행하여 GPU Operator를 설치해 주십시오.

helm install gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator --create-namespace \
  --version v26.3.3 \
  --set driver.nvidiaDriverCRD.enabled=true \
  --set driver.nvidiaDriverCRD.deployDefaultCR=false \
  --set toolkit.version=v1.17.9-ubuntu20.04 \
  --set devicePlugin.version=v0.17.4 \
  --set gfd.version=v0.17.4 \
  --set dcgmExporter.version=3.2.6-3.1.9-ubuntu20.04 \
  --wait
주의

v26.3.3의 NVIDIADriver 리소스에는 default 항목과 upgradePolicy 항목이 없습니다. deployDefaultCR을 생략하면 차트가 노드 선택 조건 없는 default 리소스를 만들어 노드풀별 리소스와 충돌하므로 반드시 false로 지정해 주십시오. 기본 구성 생성을 건너뛰고 노드풀별 구성 생성의 리소스만 만들되, 각 리소스에서 upgradePolicy 항목을 삭제해 주십시오. version 항목에는 575.57.08 이하를 지정해 주십시오.

노드풀별 드라이버 구성

GPU Operator가 드라이버를 관리하는 경우를 설명합니다. 서버 이미지의 드라이버를 그대로 사용하는 경우에는 이 섹션을 건너뛰고 드라이버 설치 방식 확인으로 진행해 주십시오.

GPU Operator는 드라이버를 ClusterPolicy 또는 NVIDIADriver 리소스로 관리하며, 두 방식의 차이는 다음과 같습니다.

관리 방식 드라이버 버전 적용 범위
ClusterPolicy 클러스터에 한 가지 버전 모든 GPU 노드에 동일하게 적용
NVIDIADriver 리소스마다 다른 버전 리소스의 노드 선택 조건과 일치하는 노드에만 적용

NVIDIADriver 리소스는 노드 선택 조건과 드라이버 버전을 함께 정의하고, GPU Operator는 리소스마다 별도의 드라이버 DaemonSet을 생성합니다. GPU 모델이 서로 다른 노드풀을 함께 운영하는 환경에서는 노드풀마다 리소스를 나누어 드라이버 버전과 커널 모듈 유형을 분리하는 것을 권장합니다.

설치할 때 선택한 값에 따라 수행할 작업 범위가 달라집니다.

설치 경로 default 리소스 수행 작업
deployDefaultCR=false로 설치 사용자가 직접 생성 노드풀별 구성 생성. 기본 구성 생성은 선택
deployDefaultCR을 생략하고 설치 차트가 생성 노드풀별 구성 생성
Ubuntu 20.04(XEN) 노드를 사용하는 경우에서 안내하는 명령으로 설치 사용하지 않음 노드풀별 구성 생성. upgradePolicy를 삭제하고 version은 575.57.08 이하
주의

차트가 생성한 default 리소스를 사용하는 경우에는 기본 구성 생성을 수행하지 마십시오. 같은 이름의 리소스를 Helm과 사용자가 함께 관리하면 이후 업그레이드에서 구성이 어긋납니다.

기본 구성 생성

default: true로 설정한 리소스는 노드풀별 리소스의 노드 선택 조건과 일치하지 않는 GPU 노드를 담당합니다. 새 GPU 노드풀을 추가했을 때 드라이버가 설치되지 않는 상황을 방지할 수 있으므로, 노드풀을 추가할 계획이 있으면 기본 구성을 먼저 정의해 주십시오.

다음 내용을 복사하여 nvidiadriver-default.yaml 파일로 저장해 주십시오. <DEFAULT_DRIVER_VERSION>은 준비한 값으로 변경해 주십시오.

apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
  name: default
spec:
  default: true
  driverType: gpu
  repository: nvcr.io/nvidia
  image: driver
  version: "<DEFAULT_DRIVER_VERSION>"
  kernelModuleType: auto
  usePrecompiled: false
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule
  upgradePolicy:
    autoUpgrade: true
    maxParallelUpgrades: 1
    maxUnavailable: 1

모든 GPU 노드풀에 전용 리소스를 만든 경우 기본 리소스가 담당하는 노드는 없습니다. 이때 기본 리소스는 담당 노드가 0개인 상태로 ready로 표시되며, 드라이버 이미지를 받지 않습니다. 새 노드풀을 추가할 계획이 없으면 기본 리소스를 생성하지 않아도 됩니다.

주의
  • default: true인 리소스는 클러스터에 하나만 존재해야 하며 nodeSelector를 함께 지정할 수 없습니다.
  • 기본 리소스가 두 개 이상이면 해당 리소스가 notReady 상태가 되고 노드의 드라이버 소유권이 변경되지 않습니다.

노드풀별 구성 생성

다음 내용을 복사하여 nvidiadriver-nodepool.yaml 파일로 저장해 주십시오. 첫 번째 리소스는 값을 채워 사용하는 형식입니다. <GPU_NODEPOOL>과 <DRIVER_VERSION>을 준비한 값으로 변경해 주십시오. 두 번째 리소스는 GPU 모델이 다른 노드풀에 다른 드라이버 버전, 커널 모듈 유형, 업그레이드 정책을 지정한 예시이며, 노드풀이 하나인 경우 지워 주십시오. 리소스 이름은 이후 명령에서 대상을 지정할 때 사용하므로 노드풀 이름과 같게 지정해 주십시오.

apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
  name: "<GPU_NODEPOOL>"
spec:
  driverType: gpu
  repository: nvcr.io/nvidia
  image: driver
  version: "<DRIVER_VERSION>"
  kernelModuleType: auto
  usePrecompiled: false
  nodeSelector:
    ncloud.com/nks-nodepool: "<GPU_NODEPOOL>"
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule
  upgradePolicy:
    autoUpgrade: true
    maxParallelUpgrades: 1
    maxUnavailable: 1
---
apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
  name: gpu-l40s-01
spec:
  driverType: gpu
  repository: nvcr.io/nvidia
  image: driver
  version: "595.91.07"
  kernelModuleType: open
  usePrecompiled: false
  nodeSelector:
    ncloud.com/nks-nodepool: gpu-l40s-01
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule
  upgradePolicy:
    autoUpgrade: false

주요 설정 항목은 다음과 같습니다.

설정 기본값 설명
default false 노드 선택 조건과 일치하지 않는 GPU 노드에 적용할 기본 구성 여부
driverType gpu 드라이버 종류. gpu, vgpu, vgpu-host-manager 중 선택
version 차트 기본값 설치할 드라이버 버전
kernelModuleType auto 커널 모듈 유형. auto, open, proprietary 중 선택
usePrecompiled false 사전 컴파일된 드라이버 컨테이너 사용 여부
nodeSelector 없음 드라이버를 설치할 노드의 레이블 조건
tolerations 없음 드라이버 파드에 적용할 toleration
upgradePolicy.autoUpgrade true 드라이버 버전 변경 시 자동 업그레이드 수행 여부
upgradePolicy.maxParallelUpgrades 1 동시에 업그레이드할 노드 수
upgradePolicy.maxUnavailable 25% 업그레이드 중 사용할 수 없는 노드의 최대 수 또는 비율. 노드 수는 정수로, 비율은 "25%" 형식의 문자열로 지정

특정 값을 사용해야 하는 이유가 없으면 kernelModuleType은 auto를 사용해 주십시오.

참고

구성 시 다음 사항을 참조해 주십시오.

  • upgradePolicy는 리소스마다 개별 적용되므로 노드풀별로 업그레이드 범위를 다르게 지정할 수 있습니다.
  • driverType과 usePrecompiled는 변경할 수 없는 항목입니다. 값을 바꾸려면 리소스를 삭제한 후 다시 생성해 주십시오.
  • default 항목이 없거나 false인 리소스에 nodeSelector를 지정하지 않으면 모든 GPU 노드를 선택하므로 다른 리소스와 충돌합니다. 노드풀별 리소스에는 nodeSelector를 반드시 지정해 주십시오.
  • 사전 컴파일된 드라이버는 지원하는 OS와 커널 조합이 제한되므로 사용 전에 이미지 태그의 제공 여부를 확인해 주십시오.
주의

노드풀별 리소스 여러 개가 같은 노드를 선택하면 해당 리소스가 notReady 상태가 되고 ConflictingNodeSelector 조건이 표시됩니다. nodeSelector가 서로 겹치지 않도록 구성해 주십시오. default: true 리소스는 충돌 대상이 아닙니다.

구성 적용 및 확인

다음 명령을 실행하여 구성을 적용해 주십시오. 기본 구성을 만들지 않은 경우 첫 번째 명령은 생략해 주십시오.

kubectl apply -f nvidiadriver-default.yaml
kubectl apply -f nvidiadriver-nodepool.yaml

NVIDIADriver는 클러스터 범위 리소스이므로 네임스페이스를 지정하지 않습니다. 드라이버 파드는 GPU Operator를 설치한 네임스페이스에 생성됩니다.

다음 명령을 실행하여 리소스 상태를 확인해 주십시오.

kubectl get nvidiadriver

구성을 적용한 직후에는 리소스가 notReady로 표시됩니다. 드라이버 컨테이너가 노드의 커널에 맞는 모듈을 준비하고 적재한 뒤 나머지 컴포넌트가 순차적으로 재시작합니다. 소요 시간은 GPU 개수, 노드 사양, 이미지 다운로드 속도에 따라 다릅니다. 상태가 계속 바뀌지 않으면 드라이버 설치 방식 확인으로 원인을 확인해 주십시오.

모든 리소스의 STATUS 항목이 ready로 바뀌면 적용된 것입니다. 기본 구성을 만든 경우 DEFAULT 항목이 true인 리소스가 하나만 있는지 함께 확인해 주십시오.

다음 명령을 실행하여 전체 컴포넌트와 ClusterPolicy 상태를 확인해 주십시오.

kubectl --namespace gpu-operator get pod
kubectl get clusterpolicy cluster-policy

gpu-operator 네임스페이스의 파드가 모두 Running 또는 Completed 상태이고 ClusterPolicy의 STATUS 항목이 ready로 표시되면 구성이 완료된 것입니다.

주의

NVIDIADriver 리소스가 ready로 바뀐 뒤에도 nvidia-operator-validator, nvidia-device-plugin-daemonset, gpu-feature-discovery, nvidia-dcgm-exporter 파드가 Init 또는 RunContainerError 상태에서 벗어나지 않는 경우가 있습니다. 파드 이벤트에 prestart hook과 libnvidia-ml.so.1: cannot open shared object file이 함께 표시되는 경우가 이에 해당합니다.

GPU Operator가 노드의 컨테이너 런타임 설정을 변경하기 전에 생성된 파드가 이전 설정을 계속 사용하기 때문이며 드라이버 설치 실패가 아닙니다. 다음 명령을 실행하여 해당 파드를 삭제하면 DaemonSet이 변경된 설정으로 다시 생성합니다. 드라이버 파드와 Container Toolkit 파드는 삭제 대상에 포함되지 않습니다.

kubectl --namespace gpu-operator delete pod \
  -l 'app in (nvidia-operator-validator,nvidia-device-plugin-daemonset,gpu-feature-discovery,nvidia-dcgm-exporter)'

다음 명령을 실행하여 드라이버 DaemonSet과 노드 선택 조건을 확인해 주십시오.

kubectl --namespace gpu-operator \
  get daemonset -l app.kubernetes.io/component=nvidia-driver \
  -o custom-columns='NAME:.metadata.name,READY:.status.numberReady,SELECTOR:.spec.template.spec.nodeSelector'

GPU Operator는 NVIDIADriver 리소스와 노드의 OS 버전 조합마다 DaemonSet을 생성합니다. 노드풀 두 개에 서로 다른 드라이버 버전을 지정하면 DaemonSet도 두 개 생성됩니다.

다음 명령을 실행하여 각 노드에 적용된 드라이버 버전을 확인해 주십시오.

kubectl get node -l nvidia.com/gpu.present=true \
  -L ncloud.com/nks-nodepool \
  -L nvidia.com/cuda.driver-version.full \
  -L nvidia.com/gpu.product

노드풀별로 지정한 버전이 CUDA.DRIVER-VERSION.FULL 항목에 표시되면 구성이 적용된 것입니다. 지정한 버전과 다른 값이 표시되면 드라이버 설치 방식 확인으로 원인을 확인해 주십시오.

드라이버 설치 방식 확인

다음 명령을 실행하여 각 노드의 드라이버를 관리하는 주체를 확인해 주십시오.

kubectl get node -l nvidia.com/gpu.present=true \
  -L nvidia.com/gpu.deploy.driver \
  -L nvidia.com/cuda.driver-version.full

GPU.DEPLOY.DRIVER 항목의 값은 해당 노드의 드라이버를 무엇이 관리하는지 나타냅니다.

값 의미 NVIDIADriver 리소스의 version 적용 여부
true GPU Operator가 드라이버 컨테이너로 드라이버를 설치 적용됨
pre-installed 서버 이미지에 설치된 드라이버를 그대로 사용 적용되지 않음

pre-installed로 표시된 노드에서는 드라이버 DaemonSet의 배치 대상이 0개가 되고 드라이버 파드가 생성되지 않습니다. 이 상태에서도 NVIDIADriver 리소스는 ready로 표시되므로, 리소스 상태만으로는 버전이 적용되었는지 판단할 수 없습니다. 반드시 CUDA.DRIVER-VERSION.FULL 값을 함께 확인해 주십시오. 서버 이미지의 드라이버를 그대로 사용해도 되며, GPU Operator가 관리하도록 전환하려면 사전 설치된 드라이버 제거를 참조해 주십시오.

참고

GPU Operator v26.7.0부터는 nvidia.com/gpu-operator.driver.owner 레이블에 각 노드를 담당하는 리소스 이름이 표시됩니다. 다음 명령으로 확인할 수 있습니다.

kubectl get node -l nvidia.com/gpu.present=true -L nvidia.com/gpu-operator.driver.owner

리소스가 notReady이거나 지정한 버전이 적용되지 않는 경우, 다음 명령을 실행하여 원인을 확인해 주십시오.

kubectl describe nvidiadriver "<GPU_NODEPOOL>"
kubectl --namespace gpu-operator logs -l app.kubernetes.io/component=nvidia-driver --tail=100

출력에 ConflictingNodeSelector 조건이 있으면 nodeSelector가 서로 겹친 것이므로 수정해 주십시오.

kubectl get nvidiadriver 출력의 STATUS 항목이 disabled로 표시되면 드라이버 관리 방식이 NVIDIADriver로 전환되지 않은 상태입니다. 이 경우 리소스를 생성해도 드라이버 DaemonSet이 만들어지지 않으므로, 다음 명령을 실행하여 ClusterPolicy의 설정을 확인해 주십시오.

kubectl get clusterpolicy cluster-policy -o jsonpath='{.spec.driver.useNvidiaDriverCRD}'

값이 true가 아니면 관리 방식을 전환해 주십시오. 이미 설치를 마친 경우에는 다음 명령으로 설치된 차트 버전을 확인해 주십시오.

helm list --namespace gpu-operator

확인한 버전을 --version에 지정하여 설정만 변경해 주십시오. --version을 생략하면 저장소의 최신 차트로 업그레이드됩니다.

helm upgrade gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --version "<OPERATOR_VERSION>" \
  --reset-then-reuse-values \
  --set driver.nvidiaDriverCRD.enabled=true \
  --wait

차트 버전도 함께 올리는 경우에는 드라이버 관리 방식 전환에서 안내하는 명령을 사용해 주십시오.

GPU 사용 확인

다음 명령을 실행하여 노드에 GPU 리소스가 등록되었는지 확인해 주십시오.

kubectl get node -l nvidia.com/gpu.present=true \
  -o custom-columns='NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu'

GPU 항목에 GPU 개수가 표시되면 리소스가 등록된 것입니다. <none>으로 표시되면 다음 명령을 실행하여 Device Plugin 파드의 상태를 확인해 주십시오.

kubectl --namespace gpu-operator get pod -l app=nvidia-device-plugin-daemonset

다음 내용을 복사하여 cuda-vectoradd.yaml 파일로 저장해 주십시오. nvcr.io에 접근할 수 없는 경우, image 항목을 사용할 레지스트리로 복사한 이미지 주소로 변경해 주십시오.

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vectoradd
  namespace: default
spec:
  restartPolicy: OnFailure
  nodeSelector:
    ncloud.com/nks-nodepool: "<GPU_NODEPOOL>"
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule
  containers:
    - name: cuda-vectoradd
      image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0-ubuntu22.04
      resources:
        limits:
          nvidia.com/gpu: 1

다음 명령을 실행하여 파드를 생성하고 실행 결과를 확인해 주십시오.

kubectl apply -f cuda-vectoradd.yaml
kubectl --namespace default \
  wait --for=jsonpath='{.status.phase}'=Succeeded pod/cuda-vectoradd --timeout=5m
kubectl --namespace default logs pod/cuda-vectoradd

파드는 벡터 덧셈을 수행한 후 종료됩니다. 로그에 Test PASSED가 표시되면 GPU가 정상적으로 할당된 것입니다. 확인이 끝나면 다음 명령을 실행하여 파드를 삭제해 주십시오.

kubectl delete -f cuda-vectoradd.yaml

사전 설치된 드라이버 제거

서버 이미지에 드라이버가 포함된 노드는 그대로 사용할 수 있습니다. 이 경우 GPU Operator가 나머지 컴포넌트만 관리하며 추가 작업이 필요하지 않습니다.

노드풀마다 다른 드라이버 버전을 사용하거나 Kubernetes에서 버전을 지정하려는 경우에만 사전 설치된 드라이버를 제거하여 GPU Operator 관리로 전환해 주십시오. 제거 후에는 NVIDIADriver 리소스에 지정한 버전이 적용됩니다.

주의
  • 이 작업은 노드 단위로 수행하며 진행 중에 해당 노드의 GPU를 사용할 수 없습니다.
  • 노드를 교체하거나 노드 수를 늘리면 서버 이미지의 드라이버가 다시 설치되므로 새 노드마다 같은 작업이 필요합니다.
  • 드라이버 컨테이너가 노드의 OS와 커널에 맞는 이미지를 받지 못하면 해당 노드에서 GPU를 사용할 수 없습니다. 제거 전에 사용할 드라이버 버전의 이미지가 있는지 확인해 주십시오.

다음 순서로 진행해 주십시오.

  1. 다음 명령을 실행하여 대상 노드에 새 파드가 배치되지 않도록 하고 실행 중인 파드를 다른 노드로 옮겨 주십시오. <NODE_NAME>은 대상 노드의 이름으로 변경해 주십시오.

    kubectl cordon "<NODE_NAME>"
    kubectl drain "<NODE_NAME>" --ignore-daemonsets --delete-emptydir-data
    
  2. 대상 노드에 접속해 주십시오. 이 단계는 kubectl이 아니라 노드에서 직접 실행하며 root 권한이 필요합니다. 서버 이미지에 포함된 드라이버는 nvidia-uninstall로 제거합니다.

    nvidia-uninstall --silent
    
  3. 노드를 재시작해 주십시오. 드라이버 파일을 제거해도 커널 모듈은 메모리에 남아 있으며, 재시작해야 GPU Operator가 드라이버가 없는 상태로 인식합니다.

  4. 노드가 다시 준비되면 다음 명령을 실행하여 관리 주체가 바뀌었는지 확인해 주십시오.

    kubectl get node -l nvidia.com/gpu.present=true \
      -L nvidia.com/gpu.deploy.driver \
      -L nvidia.com/cuda.driver-version.full
    

    GPU.DEPLOY.DRIVER 항목이 true로 바뀌고 CUDA.DRIVER-VERSION.FULL 항목에 NVIDIADriver 리소스에 지정한 버전이 표시되면 전환이 완료된 것입니다.

  5. 재시작 후에도 GPU.DEPLOY.DRIVER 항목이 pre-installed로 표시되면 다음 명령을 실행하여 값을 갱신해 주십시오. <NODE_NAME>은 대상 노드의 이름으로 변경해 주십시오. 드라이버가 실제로 제거된 노드에서만 이 값이 유지되며, 드라이버가 남아 있으면 pre-installed로 되돌아갑니다.

    kubectl label node "<NODE_NAME>" nvidia.com/gpu.deploy.driver=true --overwrite
    

    값이 true로 유지되면 드라이버 DaemonSet의 배치 대상에 해당 노드가 포함되고 드라이버 컨테이너가 시작됩니다. 설치가 끝나면 CUDA.DRIVER-VERSION.FULL 항목에 지정한 버전이 표시됩니다.

  6. 드라이버가 설치되고 GPU 사용 확인을 통과하면 다음 명령을 실행하여 파드 배치를 다시 허용해 주십시오.

    kubectl uncordon "<NODE_NAME>"
    

드라이버 버전 변경

노드풀의 드라이버 버전을 변경하려면 해당 NVIDIADriver 리소스의 spec.version 값을 수정해 주십시오. GPU Operator는 해당 리소스가 담당하는 노드에만 upgradePolicy를 적용하여 순차적으로 드라이버를 교체합니다. upgradePolicy.autoUpgrade가 false인 리소스는 버전을 수정해도 드라이버가 교체되지 않으므로 true로 변경한 후 진행해 주십시오. Ubuntu 20.04(XEN) 노드를 사용하는 경우, 리소스에 upgradePolicy 항목이 없으므로 ClusterPolicy의 driver.upgradePolicy 값을 따릅니다.

주의

드라이버를 교체할 때 해당 노드에서 실행 중인 GPU 파드가 삭제됩니다. 서비스 중단을 피하려면 maxParallelUpgrades와 maxUnavailable 값을 조정하고 워크로드가 다른 노드로 이동할 수 있는지 확인한 후 진행해 주십시오.

교체에서 제외할 노드가 있으면 버전을 변경하기 전에 다음 명령을 실행하여 레이블을 추가해 주십시오. <NODE_NAME>은 제외할 노드의 이름으로 변경해 주십시오. 레이블을 추가한 노드는 레이블을 제거할 때까지 드라이버가 교체되지 않습니다.

kubectl label node "<NODE_NAME>" nvidia.com/gpu-driver-upgrade.skip=true --overwrite

다음 명령을 실행하여 드라이버 버전을 변경해 주십시오. 매니페스트 파일을 보관하는 경우, 파일의 version 값도 같이 수정해 주십시오. 수정하지 않고 파일을 다시 적용하면 이전 버전으로 되돌아갑니다.

kubectl patch nvidiadriver "<GPU_NODEPOOL>" \
  --type merge -p '{"spec":{"version":"<DRIVER_VERSION>"}}'

다음 명령을 실행하여 업그레이드 진행 상태를 확인해 주십시오.

kubectl get node -l nvidia.com/gpu.present=true -L nvidia.com/gpu-driver-upgrade-state

업그레이드 대상 노드가 모두 upgrade-done 상태가 되면 업그레이드가 완료됩니다.

주의

GPU-DRIVER-UPGRADE-STATE 항목이 비어 있고 드라이버 파드도 교체되지 않으면 maxUnavailable 값의 형식을 확인해 주십시오. 노드 수를 "1"처럼 문자열로 지정하면 업그레이드 컨트롤러가 값을 해석하지 못해 교체가 시작되지 않습니다. 이때 드라이버 DaemonSet의 이미지 태그만 새 버전으로 바뀌고 파드는 이전 버전으로 계속 실행되므로, 리소스와 노드의 버전이 서로 다르게 표시됩니다. 다음 명령으로 원인을 확인할 수 있습니다.

kubectl --namespace gpu-operator logs deploy/gpu-operator | grep maxUnavailable

출력에 invalid value for IntOrString이 있으면 maxUnavailable을 정수 또는 "25%" 형식으로 수정해 주십시오.

드라이버 관리 방식 전환

ClusterPolicy로 드라이버를 관리하고 있는 클러스터를 NVIDIADriver 리소스 관리로 전환하는 절차입니다. 차트 버전 업그레이드와 관리 방식 전환을 한 번의 명령으로 수행할 수 있습니다.

다음 명령을 실행하여 전환해 주십시오.

helm upgrade gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --version "<OPERATOR_VERSION>" \
  --reset-then-reuse-values \
  --disable-openapi-validation \
  --set operator.upgradeCRD=true \
  --set driver.nvidiaDriverCRD.enabled=true \
  --set driver.nvidiaDriverCRD.deployDefaultCR=true \
  --set driver.upgradePolicy.autoUpgrade=true \
  --wait
주의

차트 버전을 함께 올리는 경우, --reuse-values 대신 --reset-then-reuse-values를 사용해 주십시오. --reuse-values는 이전 릴리스의 값만 재사용하고 새 차트의 기본값을 병합하지 않으므로, 새 버전에서 추가된 설정 항목이 비어 업그레이드가 실패합니다. --reset-then-reuse-values는 Helm 3.14부터 사용할 수 있습니다.

전환이 완료되면 노드풀별 구성 생성에서 만든 nvidiadriver-nodepool.yaml을 적용하여 노드풀별 리소스를 추가해 주십시오. 차트가 생성한 default 리소스가 나머지 GPU 노드를 계속 담당합니다.

주의
  • 이 경로에서는 차트가 default 리소스를 생성하므로 nvidiadriver-default.yaml을 적용하지 마십시오. 같은 이름의 리소스를 Helm과 사용자가 함께 관리하면 이후 업그레이드에서 구성이 어긋납니다.
  • 전환 과정에서 각 노드의 드라이버 파드가 교체되므로 GPU 워크로드가 중단됩니다. 워크로드를 정리하거나 이동한 후 진행해 주십시오.

GPU Operator 및 리소스 삭제

GPU Operator를 더 이상 사용하지 않는 경우, 다음 순서로 제거해 주십시오.

주의

NVIDIADriver 리소스를 삭제하면 해당 리소스가 담당하는 노드에서 드라이버가 제거되어 GPU 워크로드가 중단됩니다. 실행 중인 GPU 워크로드를 정리한 후 진행해 주십시오.

다음 명령을 실행하여 NVIDIADriver 리소스를 삭제해 주십시오. 기본 구성을 직접 만들지 않은 경우, 두 번째 명령은 생략해 주십시오.

kubectl delete -f nvidiadriver-nodepool.yaml
kubectl delete -f nvidiadriver-default.yaml

매니페스트 파일이 없는 경우, 다음 명령을 실행하여 이름으로 삭제할 수 있습니다. <RESOURCE_NAME>은 조회한 리소스 이름으로 변경해 주십시오.

kubectl get nvidiadriver
kubectl delete nvidiadriver "<RESOURCE_NAME>"

다음 명령을 실행하여 Helm 릴리스를 제거해 주십시오.

helm uninstall gpu-operator --namespace gpu-operator

Helm 릴리스를 제거해도 CRD는 삭제되지 않습니다. CRD가 더 이상 필요하지 않은 경우 다음 명령을 실행하여 남아 있는 리소스가 없는지 먼저 확인해 주십시오.

kubectl get nvidiadriver
kubectl get clusterpolicy

조회 결과가 비어 있으면 다음 명령을 실행하여 CRD를 삭제해 주십시오. 두 번째와 세 번째 명령은 이 문서에서 다루지 않는 기능의 CRD이므로 해당 기능을 사용한 경우, 삭제 전에 남아 있는 리소스를 먼저 확인해 주십시오.

kubectl delete crd nvidiadrivers.nvidia.com clusterpolicies.nvidia.com
kubectl delete crd gpuclusters.nvidia.com
kubectl delete crd computedomains.resource.nvidia.com computedomaincliques.resource.nvidia.com

차트 버전과 설정에 따라 일부 CRD가 설치되지 않을 수 있습니다. NotFound 오류가 표시되면 해당 CRD는 없는 것이므로 넘어가 주십시오.

주의
  • CRD를 삭제하면 해당 CRD로 생성한 리소스가 함께 삭제되며 되돌릴 수 없습니다.
  • GPU Operator가 드라이버를 관리한 노드에서는 NVIDIADriver 리소스를 삭제할 때 드라이버 파드가 종료되면서 커널 모듈도 함께 내려갑니다. 서버 이미지에 포함된 드라이버를 사용한 노드에서는 GPU Operator를 제거해도 드라이버가 그대로 유지됩니다.
  • 노드에 추가된 nvidia.com/ 레이블은 Helm 릴리스를 제거해도 남습니다. GPU Operator를 다시 설치하면 다시 계산되므로 그대로 두어도 됩니다.

노드를 원래 상태로 되돌리려면 다음 명령으로 남은 레이블을 확인해 주십시오.

kubectl get node -l nvidia.com/gpu.present=true -o name

노드마다 다음 명령을 실행하여 남은 레이블 키를 확인해 주십시오. <NODE_NAME>은 앞에서 조회한 노드의 이름으로 변경해 주십시오.

kubectl get node "<NODE_NAME>" -o jsonpath='{.metadata.labels}' \
  | grep -o '"nvidia.com/[^"]*"' | tr -d '"'

확인한 키는 다음 명령으로 제거해 주십시오. <LABEL_KEY>는 제거할 레이블 키로 변경해 주십시오.

kubectl label node "<NODE_NAME>" <LABEL_KEY>-

같은 노드에 GPU Operator를 다시 설치할 계획이면 삭제한 후 노드를 재시작해 주십시오. Helm 릴리스를 제거해도 노드의 /run/cdi에는 이전에 설치한 드라이버 버전을 참조하는 CDI 구성이 남습니다. /run은 노드를 재시작할 때 비워지므로 재시작만으로 정리됩니다.

주의

남아 있는 CDI 구성을 정리하지 않고 이전과 다른 드라이버 버전으로 다시 설치하면 컴포넌트가 Init 상태에서 멈추고 Container Toolkit 파드의 로그에 다음 오류가 표시됩니다.

Failed to initialize NVML: Driver/library version mismatch

노드에는 새 버전의 커널 모듈이 적재되어 있지만 컨테이너에는 이전 버전의 라이브러리가 주입되어 발생합니다. Container Toolkit 파드가 기동해야 CDI 구성이 새로 만들어지는데 그 파드의 검증이 먼저 실패하므로 스스로 해소되지 않습니다.

노드를 재시작한 후 구성 적용 및 확인에서 안내하는 명령으로 파드를 재생성해 주십시오.

제약 사항

GPU Operator를 사용할 때 다음 제약 사항을 확인해 주십시오.

  • GPU Operator는 NKS Add-on으로 제공하지 않으므로 설치, 업그레이드, 제거를 사용자가 직접 관리합니다.
  • GPU Operator가 사용하는 컨테이너 이미지는 NVIDIA의 이용 약관을 따릅니다. 이미지를 내부 레지스트리로 복사하거나 재배포하기 전에 약관을 확인해 주십시오.
  • NVIDIADriver 리소스의 default 항목과 upgradePolicy 항목은 v26.7.0부터 제공합니다. 이전 버전에서는 두 항목을 사용할 수 없으며 업그레이드 정책은 ClusterPolicy에서 클러스터 단위로 설정합니다.
  • 서버 이미지의 드라이버를 사용하는 노드에서는 드라이버 컨테이너가 실행되지 않으며 NVIDIADriver 리소스의 version 값이 적용되지 않습니다. 노드풀마다 다른 드라이버 버전을 사용하려면 사전 설치된 드라이버를 제거해야 하며, 노드를 추가하거나 교체할 때마다 같은 작업이 필요합니다.
  • MIG 기능의 지원 여부는 GPU 서버의 하이퍼바이저 유형에 따라 다릅니다. 사용 중인 상품의 지원 여부는 일반과 KVM GPU를 참조해 주십시오.