노드별 워크로드 설정¶
노드 레이블을 사용해 NPU Operator의 배포 대상과 노드별 워크로드 모드를 설정하는 방법을 설명합니다.
- 컴포넌트 배포에서 제외: 특정 노드에서 Operator가 관리하는 컴포넌트를 제거하고 배포 대상에서 제외합니다.
- 워크로드 모드 설정: 노드를 컨테이너용(
container) 또는 VM 패스스루용(vm-passthrough)으로 설정합니다.
관련 튜토리얼은 컨테이너·VM용 NPU 노드 분리하기입니다.
컴포넌트 배포에서 제외¶
유지보수나 별도 관리가 필요한 노드에 설정합니다. 컴포넌트가 제거되므로 해당 노드의 NPU 워크로드를 먼저 종료하거나 옮겨야 합니다.
Operator는 컴포넌트 배포 레이블을 제거하고 자동 드라이버 업그레이드 대상에서도 제외합니다. 하드웨어 탐지 레이블은 유지됩니다. 이 설정은 Operator가 관리하는 DaemonSet에 적용되며, 별도로 설치한 컴포넌트나 일반 Pod의 스케줄링을 차단하지 않습니다.
배포를 재개하려면 레이블을 제거합니다.
드라이버 업그레이드만 보류하려면 업그레이드 제외 레이블을 사용합니다.
워크로드 모드 설정¶
| 모드 | 노드 구성 |
|---|---|
container | 호스트 NPU 드라이버와 활성화된 컨테이너 컴포넌트 사용 |
vm-passthrough | NPU를 vfio-pci에 바인딩하고 VM 할당 컴포넌트 사용. 호스트 NPU 드라이버와 컨테이너용 데몬은 배포하지 않음 |
컨테이너·VM 혼용을 위한 Helm 설정에서 할당 방식에 맞는 설정을 선택해 기존 values에 병합합니다.
노드의 모드는 다음 레이블로 선택합니다.
클러스터 기본값과 관계없이 컨테이너 모드로 지정하려면 container를 설정합니다. 기본값을 다시 따르게 하려면 레이블을 제거합니다.
컨테이너 모드에서 VM 패스스루 모드로 전환하기¶
컨테이너용 NPU 노드를 VM 패스스루용으로 변경하려면 먼저 노드를 drain합니다. 전환 후 컴포넌트와 리소스가 준비되면 스케줄링을 재개합니다. 구성과 확인 방법은 컨테이너·VM용 NPU 노드 분리하기에서 다룹니다.
드라이버에 바인딩된 NPU를 vfio-pci로 전환하기 전에 Driver Manager가 남은 rebellions.ai/npu 또는 컨테이너 모드 DRA claim 사용 Pod를 evict합니다. 이때 NPU Pod eviction 정책을 따릅니다. 패스스루 claim은 대상이 아니며, 이미 vfio-pci에 바인딩된 노드는 eviction을 건너뜁니다.
eviction이 막히면 노드는 cordon을 유지하고 재시도합니다. 원인은 노드의 rebellions.ai/npu-pod-eviction-blocked 어노테이션에서 확인할 수 있습니다.
전환할 노드를 지정하고 drain합니다. 앞서 선택한 할당 방식의 Helm 설정과 VM 노드 사전 준비를 완료한 상태에서 진행해야 합니다.
drain이 성공하면 VM 패스스루 모드를 지정합니다.
할당 방식에 따라 컴포넌트와 NPU 리소스를 확인합니다.
VFIO Manager와 Sandbox Device Plugin Pod가 모두 Ready이고, 제품별 리소스(rebellions.ai/RBLN-CR13_PF 또는 rebellions.ai/RBLN-CA25_PF)가 1개 이상이어야 합니다. 컨테이너용 rebellions.ai/npu는 0 또는 미표시 상태여야 합니다.
VFIO Manager와 DRA Kubelet Plugin Pod가 모두 Ready여야 합니다. ResourceSlice 출력은 노드 이름, npu 수, vfio 수 순서이며, npu는 0개, vfio는 1개 이상이어야 합니다.
위 조건을 확인한 뒤 Operator가 준비될 때까지 기다립니다.
준비가 완료되면 스케줄링을 재개합니다.
VM 패스스루 모드에서 컨테이너 모드로 전환하기¶
VM 패스스루용 NPU 노드를 컨테이너용으로 변경하려면 먼저 해당 노드의 VM을 종료하고 NPU를 반환합니다. 전환 시 드라이버 Pod의 Driver Manager가 vfio-pci 바인딩을 해제한 뒤 네이티브 드라이버를 설치합니다.
전환할 노드를 지정하고 drain합니다.
drain이 성공하면 사용 중인 할당 방식에 따라 전환합니다.
Sandbox Device Plugin에서 K8s Device Plugin으로 전환합니다. 현재 VM 패스스루용 NPU 리소스를 선택합니다.
컨테이너 모드를 지정하고 노드를 확인합니다.
$ kubectl label node "$VM_NODE" rebellions.ai/npu.workload.config=container --overwrite
node/node-rebel100 labeled
$ kubectl wait --for=jsonpath='{.status.allocatable.rebellions\.ai/npu}'="$NPU_COUNT" \
"node/$VM_NODE" --timeout=600s
node/node-rebel100 condition met
NAME READY STATUS RESTARTS AGE
rbln-container-toolkit-29xff 1/1 Running 0 58s
rbln-device-plugin-cr4l2 1/1 Running 0 58s
rbln-driver-rebel100-rebel100-ubuntu22.04-6.8.0-138-generic-f8fzt 1/1 Running 0 94s
rbln-driver-rebel100-smd-lgp4v 1/1 Running 0 58s
rbln-metrics-exporter-cfb56 1/1 Running 0 58s
rbln-npu-feature-discovery-qh7sp 1/1 Running 0 58s
rbln-operator-validator-qklt8 1/1 Running 0 58s
$ kubectl label node "$VM_NODE" rebellions.ai/npu.workload.config=container --overwrite
node/node-atom labeled
$ kubectl wait --for=jsonpath='{.status.allocatable.rebellions\.ai/npu}'="$NPU_COUNT" \
"node/$VM_NODE" --timeout=600s
node/node-atom condition met
NAME READY STATUS RESTARTS AGE
rbln-container-toolkit-29xff 1/1 Running 0 58s
rbln-device-plugin-cr4l2 1/1 Running 0 58s
rbln-driver-atom-atom-ubuntu22.04-6.8.0-138-generic-f8fzt 1/1 Running 0 94s
rbln-driver-atom-smd-lgp4v 1/1 Running 0 58s
rbln-metrics-exporter-cfb56 1/1 Running 0 58s
rbln-npu-feature-discovery-qh7sp 1/1 Running 0 58s
rbln-operator-validator-qklt8 1/1 Running 0 58s
드라이버와 K8s Device Plugin을 포함한 컨테이너용 컴포넌트가 모두 Ready이고, rebellions.ai/npu가 1개 이상이어야 합니다.
DRA를 유지하면서 워크로드 모드를 container로 변경합니다.
드라이버와 DRA Kubelet Plugin을 포함한 컨테이너용 컴포넌트가 모두 Ready여야 합니다. ResourceSlice 출력은 노드 이름, npu 수, vfio 수 순서이며, npu는 1개 이상, vfio는 0개여야 합니다.
컴포넌트와 리소스를 확인한 뒤 Operator가 준비될 때까지 기다립니다. 전환되지 않으면 Driver Manager의 initContainer 로그를 확인하고 노드는 cordon 상태로 유지합니다.
준비가 완료되면 스케줄링을 재개합니다.