--- title: "NVIDIA GPU Operator 활용" slug: "k8s-k8suse-gpu-operator" updated: 2026-09-17T09:07:38Z published: 2026-09-17T09:07:38Z canonical: "guide.ncloud-docs.com/k8s-k8suse-gpu-operator" stale: true --- > ## Documentation Index > Fetch the complete documentation index at: https://guide.ncloud-docs.com/llms.txt > Use this file to discover all available pages before exploring further. # NVIDIA GPU Operator 활용 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](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/platform-support.html)에서 설치할 GPU Operator 버전이 기본값으로 사용하는 드라이버 버전을 확인해 주십시오. 특정 버전을 사용해야 하는 이유가 없으면 이 값을 그대로 사용해 주십시오. 다른 버전을 지정하려면 [NVIDIA GPU Driver 컨테이너 이미지 태그](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/driver/tags)에서 노드의 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 서버 이미지의 드라이버 포함 여부로 판단하고, 설치 후에는 [드라이버 설치 방식 확인](/docs/k8s-k8suse-gpu-operator#%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%84%A4%EC%B9%98%EB%B0%A9%EC%8B%9D%ED%99%95%EC%9D%B8)을 참조하여 노드별 상태를 확인해 주십시오. GPU Operator가 관리하도록 전환하려면 [사전 설치된 드라이버 제거](/docs/k8s-k8suse-gpu-operator#%EC%82%AC%EC%A0%84%EC%84%A4%EC%B9%98%EB%90%9C%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%A0%9C%EA%B1%B0)를 참조해 주십시오. ## 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>` 형태의 레이블로 추가합니다. 이 레이블은 노드를 교체하거나 노드 수를 늘려도 유지되므로 드라이버 구성을 노드풀 단위로 지정할 때 사용할 수 있습니다. 노드 레이블에 관한 자세한 내용은 [클러스터 노드풀 관리](/docs/k8s-k8suse-nodepool)를 참조해 주십시오. 다음 명령을 실행하여 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 ``` 다음 조건에 해당하면 명령을 실행하기 전에 해당 섹션을 먼저 확인해 주십시오. 둘 다 해당하지 않으면 그대로 진행해 주십시오. - [Ubuntu 20.04(XEN) 노드를 사용하는 경우](/docs/k8s-k8suse-gpu-operator#Ubuntu2004XEN%EB%85%B8%EB%93%9C%EB%A5%BC%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B2%BD%EC%9A%B0): 아래 명령 대신 해당 섹션의 명령 사용 - [내부 레지스트리를 사용하는 경우](/docs/k8s-k8suse-gpu-operator#%EB%82%B4%EB%B6%80%EB%A0%88%EC%A7%80%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%A5%BC%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B2%BD%EC%9A%B0): 아래 명령에 해당 섹션의 values를 함께 지정 다음 명령을 실행하여 GPU Operator를 설치해 주십시오. `driver.nvidiaDriverCRD.enabled`를 `true`로 설정하면 드라이버를 `NVIDIADriver` 사용자 정의 리소스로 분리해 관리합니다. ``` helm install gpu-operator nvidia/gpu-operator \ --namespace gpu-operator --create-namespace \ --version "" \ --set driver.nvidiaDriverCRD.enabled=true \ --set driver.nvidiaDriverCRD.deployDefaultCR=false \ --wait ``` `deployDefaultCR`은 차트가 `default` 리소스를 대신 생성할지 결정하며 기본값은 `true`입니다. 이 문서는 기본 리소스와 노드풀별 리소스를 모두 직접 정의하므로 `false`로 설정합니다. 설정값에 따라 수행할 작업 범위가 달라지며, 차이는 [노드풀별 드라이버 구성](/docs/k8s-k8suse-gpu-operator#%EB%85%B8%EB%93%9C%ED%92%80%EB%B3%84%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EA%B5%AC%EC%84%B1)의 표에 정리되어 있습니다. 참고 설치 시 다음 사항을 참조해 주십시오. - 드라이버 관리 방식을 `NVIDIADriver` 리소스로 바꾸면 `ClusterPolicy`는 드라이버를 제외한 나머지 컴포넌트를 계속 관리합니다. - 이미 `ClusterPolicy`로 드라이버를 관리하는 클러스터에 이 문서의 구성을 적용하는 경우에는 [드라이버 관리 방식 전환](/docs/k8s-k8suse-gpu-operator#%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EA%B4%80%EB%A6%AC%EB%B0%A9%EC%8B%9D%EC%A0%84%ED%99%98)을 참조해 주십시오. 다음 명령을 실행하여 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` 리소스를 적용하면 해소됩니다. 적용한 뒤에도 해소되지 않으면 [구성 적용 및 확인](/docs/k8s-k8suse-gpu-operator#%EA%B5%AC%EC%84%B1%EC%A0%81%EC%9A%A9%EB%B0%8F%ED%99%95%EC%9D%B8)의 주의 사항을 참조해 주십시오. 드라이버가 사전 설치된 노드만 사용하는 경우에는 리소스를 적용하지 않아도 나머지 컴포넌트가 동작합니다. ### 내부 레지스트리를 사용하는 경우 노드에서 `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: /nvidia validator: repository: /nvidia driver: repository: /nvidia manager: repository: /nvidia/cloud-native toolkit: repository: /nvidia/k8s devicePlugin: repository: /nvidia gfd: repository: /nvidia dcgm: repository: /nvidia/cloud-native dcgmExporter: repository: /nvidia/k8s migManager: repository: /nvidia/cloud-native node-feature-discovery: image: repository: /nfd/node-feature-discovery ``` 앞의 `helm install` 명령에 `--values registry-values.yaml`을 추가하여 설치해 주십시오. 주의 `NVIDIADriver` 리소스를 직접 정의하는 경우 드라이버 이미지는 리소스의 `spec.repository` 값을 사용하므로 `driver.repository`만 변경해서는 적용되지 않습니다. [노드풀별 구성 생성](/docs/k8s-k8suse-gpu-operator#%EB%85%B8%EB%93%9C%ED%92%80%EB%B3%84%EA%B5%AC%EC%84%B1%EC%83%9D%EC%84%B1)에서 만드는 리소스의 `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`로 지정해 주십시오. [기본 구성 생성](/docs/k8s-k8suse-gpu-operator#%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%84%B1%EC%83%9D%EC%84%B1)을 건너뛰고 [노드풀별 구성 생성](/docs/k8s-k8suse-gpu-operator#%EB%85%B8%EB%93%9C%ED%92%80%EB%B3%84%EA%B5%AC%EC%84%B1%EC%83%9D%EC%84%B1)의 리소스만 만들되, 각 리소스에서 `upgradePolicy` 항목을 삭제해 주십시오. `version` 항목에는 575.57.08 이하를 지정해 주십시오. ## 노드풀별 드라이버 구성 GPU Operator가 드라이버를 관리하는 경우를 설명합니다. 서버 이미지의 드라이버를 그대로 사용하는 경우에는 이 섹션을 건너뛰고 [드라이버 설치 방식 확인](/docs/k8s-k8suse-gpu-operator#%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%84%A4%EC%B9%98%EB%B0%A9%EC%8B%9D%ED%99%95%EC%9D%B8)으로 진행해 주십시오. GPU Operator는 드라이버를 `ClusterPolicy` 또는 `NVIDIADriver` 리소스로 관리하며, 두 방식의 차이는 다음과 같습니다. | 관리 방식 | 드라이버 버전 | 적용 범위 | | --- | --- | --- | | `ClusterPolicy` | 클러스터에 한 가지 버전 | 모든 GPU 노드에 동일하게 적용 | | `NVIDIADriver` | 리소스마다 다른 버전 | 리소스의 노드 선택 조건과 일치하는 노드에만 적용 | `NVIDIADriver` 리소스는 노드 선택 조건과 드라이버 버전을 함께 정의하고, GPU Operator는 리소스마다 별도의 드라이버 DaemonSet을 생성합니다. GPU 모델이 서로 다른 노드풀을 함께 운영하는 환경에서는 노드풀마다 리소스를 나누어 드라이버 버전과 커널 모듈 유형을 분리하는 것을 권장합니다. 설치할 때 선택한 값에 따라 수행할 작업 범위가 달라집니다. | 설치 경로 | `default` 리소스 | 수행 작업 | | --- | --- | --- | | `deployDefaultCR=false`로 설치 | 사용자가 직접 생성 | 노드풀별 구성 생성. 기본 구성 생성은 선택 | | `deployDefaultCR`을 생략하고 설치 | 차트가 생성 | 노드풀별 구성 생성 | | [Ubuntu 20.04(XEN) 노드를 사용하는 경우](/docs/k8s-k8suse-gpu-operator#Ubuntu2004XEN%EB%85%B8%EB%93%9C%EB%A5%BC%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B2%BD%EC%9A%B0)에서 안내하는 명령으로 설치 | 사용하지 않음 | 노드풀별 구성 생성. `upgradePolicy`를 삭제하고 `version`은 575.57.08 이하 | 주의 차트가 생성한 `default` 리소스를 사용하는 경우에는 [기본 구성 생성](/docs/k8s-k8suse-gpu-operator#%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%84%B1%EC%83%9D%EC%84%B1)을 수행하지 마십시오. 같은 이름의 리소스를 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: "" 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: "" spec: driverType: gpu repository: nvcr.io/nvidia image: driver version: "" kernelModuleType: auto usePrecompiled: false nodeSelector: ncloud.com/nks-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 개수, 노드 사양, 이미지 다운로드 속도에 따라 다릅니다. 상태가 계속 바뀌지 않으면 [드라이버 설치 방식 확인](/docs/k8s-k8suse-gpu-operator#%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%84%A4%EC%B9%98%EB%B0%A9%EC%8B%9D%ED%99%95%EC%9D%B8)으로 원인을 확인해 주십시오. 모든 리소스의 `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` 항목에 표시되면 구성이 적용된 것입니다. 지정한 버전과 다른 값이 표시되면 [드라이버 설치 방식 확인](/docs/k8s-k8suse-gpu-operator#%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%84%A4%EC%B9%98%EB%B0%A9%EC%8B%9D%ED%99%95%EC%9D%B8)으로 원인을 확인해 주십시오. ## 드라이버 설치 방식 확인 다음 명령을 실행하여 각 노드의 드라이버를 관리하는 주체를 확인해 주십시오. ``` 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가 관리하도록 전환하려면 [사전 설치된 드라이버 제거](/docs/k8s-k8suse-gpu-operator#%EC%82%AC%EC%A0%84%EC%84%A4%EC%B9%98%EB%90%9C%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%A0%9C%EA%B1%B0)를 참조해 주십시오. 참고 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 "" 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 "" \ --reset-then-reuse-values \ --set driver.nvidiaDriverCRD.enabled=true \ --wait ``` 차트 버전도 함께 올리는 경우에는 [드라이버 관리 방식 전환](/docs/k8s-k8suse-gpu-operator#%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EA%B4%80%EB%A6%AC%EB%B0%A9%EC%8B%9D%EC%A0%84%ED%99%98)에서 안내하는 명령을 사용해 주십시오. ## 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: "" 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 "" kubectl drain "" --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 "" nvidia.com/gpu.deploy.driver=true --overwrite ``` 값이 `true`로 유지되면 드라이버 DaemonSet의 배치 대상에 해당 노드가 포함되고 드라이버 컨테이너가 시작됩니다. 설치가 끝나면 `CUDA.DRIVER-VERSION.FULL` 항목에 지정한 버전이 표시됩니다. 6. 드라이버가 설치되고 [GPU 사용 확인](/docs/k8s-k8suse-gpu-operator#GPU%EC%82%AC%EC%9A%A9%ED%99%95%EC%9D%B8)을 통과하면 다음 명령을 실행하여 파드 배치를 다시 허용해 주십시오. ``` kubectl uncordon "" ``` ## 드라이버 버전 변경 노드풀의 드라이버 버전을 변경하려면 해당 `NVIDIADriver` 리소스의 `spec.version` 값을 수정해 주십시오. GPU Operator는 해당 리소스가 담당하는 노드에만 `upgradePolicy`를 적용하여 순차적으로 드라이버를 교체합니다. `upgradePolicy.autoUpgrade`가 `false`인 리소스는 버전을 수정해도 드라이버가 교체되지 않으므로 `true`로 변경한 후 진행해 주십시오. [Ubuntu 20.04(XEN) 노드를 사용하는 경우](/docs/k8s-k8suse-gpu-operator#Ubuntu2004XEN%EB%85%B8%EB%93%9C%EB%A5%BC%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B2%BD%EC%9A%B0), 리소스에 `upgradePolicy` 항목이 없으므로 `ClusterPolicy`의 `driver.upgradePolicy` 값을 따릅니다. 주의 드라이버를 교체할 때 해당 노드에서 실행 중인 GPU 파드가 삭제됩니다. 서비스 중단을 피하려면 `maxParallelUpgrades`와 `maxUnavailable` 값을 조정하고 워크로드가 다른 노드로 이동할 수 있는지 확인한 후 진행해 주십시오. 교체에서 제외할 노드가 있으면 버전을 변경하기 전에 다음 명령을 실행하여 레이블을 추가해 주십시오. `<NODE_NAME>`은 제외할 노드의 이름으로 변경해 주십시오. 레이블을 추가한 노드는 레이블을 제거할 때까지 드라이버가 교체되지 않습니다. ``` kubectl label node "" nvidia.com/gpu-driver-upgrade.skip=true --overwrite ``` 다음 명령을 실행하여 드라이버 버전을 변경해 주십시오. 매니페스트 파일을 보관하는 경우, 파일의 `version` 값도 같이 수정해 주십시오. 수정하지 않고 파일을 다시 적용하면 이전 버전으로 되돌아갑니다. ``` kubectl patch nvidiadriver "" \ --type merge -p '{"spec":{"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 "" \ --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부터 사용할 수 있습니다. 전환이 완료되면 [노드풀별 구성 생성](/docs/k8s-k8suse-gpu-operator#%EB%85%B8%EB%93%9C%ED%92%80%EB%B3%84%EA%B5%AC%EC%84%B1%EC%83%9D%EC%84%B1)에서 만든 `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 "" ``` 다음 명령을 실행하여 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 "" -o jsonpath='{.metadata.labels}' \ | grep -o '"nvidia.com/[^"]*"' | tr -d '"' ``` 확인한 키는 다음 명령으로 제거해 주십시오. `<LABEL_KEY>`는 제거할 레이블 키로 변경해 주십시오. ``` kubectl label node "" - ``` 같은 노드에 GPU Operator를 다시 설치할 계획이면 삭제한 후 노드를 재시작해 주십시오. Helm 릴리스를 제거해도 노드의 `/run/cdi`에는 이전에 설치한 드라이버 버전을 참조하는 CDI 구성이 남습니다. `/run`은 노드를 재시작할 때 비워지므로 재시작만으로 정리됩니다. 주의 남아 있는 CDI 구성을 정리하지 않고 이전과 다른 드라이버 버전으로 다시 설치하면 컴포넌트가 `Init` 상태에서 멈추고 Container Toolkit 파드의 로그에 다음 오류가 표시됩니다. ``` Failed to initialize NVML: Driver/library version mismatch ``` 노드에는 새 버전의 커널 모듈이 적재되어 있지만 컨테이너에는 이전 버전의 라이브러리가 주입되어 발생합니다. Container Toolkit 파드가 기동해야 CDI 구성이 새로 만들어지는데 그 파드의 검증이 먼저 실패하므로 스스로 해소되지 않습니다. 노드를 재시작한 후 [구성 적용 및 확인](/docs/k8s-k8suse-gpu-operator#%EA%B5%AC%EC%84%B1%EC%A0%81%EC%9A%A9%EB%B0%8F%ED%99%95%EC%9D%B8)에서 안내하는 명령으로 파드를 재생성해 주십시오. ## 제약 사항 GPU Operator를 사용할 때 다음 제약 사항을 확인해 주십시오. - GPU Operator는 NKS Add-on으로 제공하지 않으므로 설치, 업그레이드, 제거를 사용자가 직접 관리합니다. - GPU Operator가 사용하는 컨테이너 이미지는 NVIDIA의 이용 약관을 따릅니다. 이미지를 내부 레지스트리로 복사하거나 재배포하기 전에 약관을 확인해 주십시오. - `NVIDIADriver` 리소스의 `default` 항목과 `upgradePolicy` 항목은 v26.7.0부터 제공합니다. 이전 버전에서는 두 항목을 사용할 수 없으며 업그레이드 정책은 `ClusterPolicy`에서 클러스터 단위로 설정합니다. - 서버 이미지의 드라이버를 사용하는 노드에서는 드라이버 컨테이너가 실행되지 않으며 `NVIDIADriver` 리소스의 `version` 값이 적용되지 않습니다. 노드풀마다 다른 드라이버 버전을 사용하려면 사전 설치된 드라이버를 제거해야 하며, 노드를 추가하거나 교체할 때마다 같은 작업이 필요합니다. - MIG 기능의 지원 여부는 GPU 서버의 하이퍼바이저 유형에 따라 다릅니다. 사용 중인 상품의 지원 여부는 [일반](/docs/server-gpuserver-vpc)과 [KVM GPU](/docs/server-gpuserver-vpc-kvm)를 참조해 주십시오.