RBLN NPU Operator 설치¶
이 문서는 Helm 차트를 사용해 RBLN NPU Operator를 새로 설치하는 방법과 설치 검증, NPU 워크로드 빠른 시작, 제품별 스케줄링, 차트 사용자 옵션을 다룹니다.
오퍼레이터의 아키텍처 개요는 RBLN NPU Operator를 참고하세요. 업그레이드 및 제거는 NPU Operator 업그레이드와 NPU Operator 제거를 참고하세요.
사전 요구사항¶
kubectl과helm을 사용할 수 있는 Kubernetes 1.19 이상 클러스터- Helm 3.8 이상(OCI 레지스트리 지원 필요)
- Node Feature Discovery가 클러스터에 설치되어 있어야 합니다. 오퍼레이터와 라이프사이클을 분리하려면 업스트림 Helm 차트를 사용해 별도의
node-feature-discovery네임스페이스에 NFD를 설치하는 것을 권장합니다. 차트에 포함된nfd.enabled=true옵션은 빠른 테스트에는 편리하지만 NFD의 라이프사이클이 이 Helm 릴리스에 종속됩니다. - 오퍼레이터 전용 네임스페이스(예:
rbln-system) - NPU가 장착된 워커 노드
Helm이 설치되어 있지 않거나 버전이 3.8 미만이면 먼저 설치합니다.
이미지 풀 시크릿 생성¶
드라이버 컨테이너 이미지와 rbln-smd 컨테이너 이미지는 repo.rebellions.ai에 호스팅되며, 접근하려면 RBLN Portal 계정 인증이 필요합니다. 설치하기 전에 오퍼레이터 네임스페이스에 docker-registry 시크릿을 생성하세요.
이 시크릿 이름을 그대로 사용하면 차트 기본값인 driver.imagePullSecrets와 일치하므로 별도로 Helm 값을 재정의할 필요가 없습니다.
드라이버 설치¶
오퍼레이터 차트를 배포하기 전에 오퍼레이터가 컨테이너로 커널 드라이버를 설치할지, 각 호스트에 직접 설치된 드라이버를 감지하도록 할지 결정해야 합니다. 두 모드와 driver.enabled 차트 값으로 설정하는 방법은 NPU 드라이버 설치를 참고하세요.
OCI 레지스트리에서 NPU Operator 설치¶
차트는 OCI 아티팩트로 Docker Hub의 oci://docker.io/rebellions/rbln-npu-operator-chart에 게시됩니다. 재현 가능한 설치를 위해 버전을 명시적으로 고정하세요. 사용 가능한 버전은 Docker Hub의 차트 페이지에서 확인할 수 있습니다.
개별 값은 --set으로 재정의할 수 있습니다.
또는 사용자 정의 values 파일을 전달할 수 있습니다.
설치 검증¶
Helm 설치가 성공적으로 완료되면 RBLNClusterPolicy가 존재하고 오퍼레이터에 의해 반영되었는지 확인합니다. 두 CRD 모두 클러스터 범위 리소스이므로 -n 플래그가 필요하지 않습니다.
CONTAINER가 ready이면 컨테이너 워크로드를 담당하는 컴포넌트가 모두 정상이라는 뜻이고, VM-PASSTHROUGH가 empty이면 vm-passthrough 워크로드를 선언한 NPU 노드가 없다는 뜻입니다. 노드를 VM 패스스루 워크로드에 포함하려면 노드별 워크로드 레이블링을 참고하면 됩니다.
드라이버 관리가 활성화되어 있다면 RBLNDriver 커스텀 리소스가 생성되었는지 확인합니다.
READY 와 DESIRED 는 노드 풀별 DaemonSet의 합계입니다. 모든 NPU 노드에서 드라이버 설치가 끝나면 두 값이 같아져야 합니다.
스크립트에서 두 리소스의 준비 상태를 확인할 때는 .status.state를 직접 조회합니다.
워크로드 타입(container, vm-passthrough)별 준비 상태를 점검하려면 다음과 같이 조회합니다.
다음으로 컨트롤러와 컴포넌트 Pod가 오퍼레이터 네임스페이스에서 실행 중인지 확인합니다.
모든 Pod가 Running이면 오퍼레이터가 정상 상태입니다. Pod 이름은 rbln-<component>-* 패턴을 따릅니다. 각 컴포넌트의 역할은 핵심 컴포넌트를 참고하세요. 드라이버 Pod의 접미사(<family>-<os>-<kernel>)는 해당 Pod가 속한 노드 풀을 나타냅니다. 규칙은 드라이버 이미지 선택을 참고하세요. rbln-driver-smd Pod에서는 각 RBLNDriver와 함께 배포되는 RSMD가 실행됩니다.
특정 Pod가 멈춰 있거나 CrashLoopBackOff 상태라면 kubectl logs <pod> -n rbln-system으로 로그를 확인하고, 누락된 사전 요구사항이 없는지 Helm 값을 점검하세요.
오퍼레이터가 드라이버 컨테이너로 드라이버를 설치하는 경우(차트의 driver.enabled=true)에는 커널 모듈이 로드되었는지, 요청한 드라이버 버전과 일치하는지 확인할 수 있습니다. 동작 중인 드라이버 확인을 참고하세요.
NPU 상태 확인¶
각 노드에 대해 Kubernetes가 보고하는 NPU 용량을 확인하면 Device Plugin이 예상한 리소스를 노출했는지 확인할 수 있습니다. 차트 기본값인 devicePlugin.useGenericResourceName: true를 사용하면 오퍼레이터는 일반 리소스 이름인 rebellions.ai/npu를 노출합니다.
클러스터에 여러 NPU 제품이 있고 워크로드를 특정 제품에 스케줄링해야 한다면, 일반 rebellions.ai/npu 리소스를 NPU Feature Discovery가 부여하는 제품별 노드 레이블과 함께 사용하세요. 아래 특정 NPU 제품 지정하기를 참고하세요.
NPU를 사용하는 Pod 생성¶
-
매니페스트를 작성합니다(예:
npu-demo-pod.yaml). 이 예시는 4개의rebellions.ai/npu디바이스를 요청합니다. -
Pod를 생성합니다.
-
Pod 상태와 리소스 할당을 확인합니다.
kubectl describe pod npu-pod로 요청한 NPU 리소스가 바인딩되었는지, Pod가 NPU 장착 노드에 스케줄링되었는지 확인합니다.
특정 NPU 제품 지정하기¶
여러 NPU 제품(예: RBLN-CA25와 RBLN-CR03 카드)이 혼재된 클러스터에서는 일반 rebellions.ai/npu 리소스를 요청한 Pod가 NPU가 장착된 어느 노드에든 스케줄링될 수 있습니다. NPU Feature Discovery가 부여하는 제품별 노드 레이블인 rebellions.ai/npu.product를 nodeSelector 또는 nodeAffinity와 함께 사용해 워크로드를 특정 제품에 고정하세요.
nodeSelector: 단일 제품¶
nodeAffinity: 여러 제품¶
rebellions.ai/npu.family 레이블은 NPU 제품군 단위로 제품을 묶으며 값은 소문자입니다. 셀렉터를 작성하기 전에 kubectl get nodes -L rebellions.ai/npu.family로 노드의 실제 값을 확인하세요.
설정 레퍼런스¶
아래 표는 values.yaml의 주요 설정 항목을 정리한 것입니다. 각 절은 핵심 컴포넌트 개요의 항목과 대응됩니다.
이 값들은 helm install 또는 helm upgrade를 실행할 때 --set <key>=<value>(또는 -f my-values.yaml)로 전달할 수 있습니다.
아래 표에 없는 키를 포함해 차트의 전체 values 목록과 템플릿 주석을 보려면 다음을 실행하세요.
image.* 블록은 표준 Helm 차트 규칙에 따라 4개의 하위 키를 사용합니다.
아래 기본값 열에서는 이 정보를 <registry>/<repository>:<tag> 형태와 둘째 줄의 pullPolicy:로 압축해 표시합니다.
차트 전반¶
| 키 | 설명 | 기본값 |
|---|---|---|
nameOverride |
모든 하위 리소스 이름에 적용되는 접두어. 여러 오퍼레이터 인스턴스를 동시에 운영해 충돌이 발생하면 이 값을 변경합니다. | rbln-npu-operator |
workloadType |
클러스터의 워크로드 모드. KubeVirt 배포에는 vm-passthrough로 설정합니다. 이 모드에서는 CRD가 vfioManager.enabled와 sandboxDevicePlugin.enabled도 true인지 검증합니다. |
container |
nfd.enabled |
차트가 Node Feature Discovery를 하위 차트로 함께 배포할지 여부. NFD의 라이프사이클을 오퍼레이터와 분리하려면 false로 두고 업스트림 Helm 차트로 별도 설치하세요. 빠른 테스트에만 true로 설정합니다. |
false |
podDefaults.labels |
오퍼레이터가 관리하는 모든 DaemonSet Pod에 적용되는 레이블. | {} |
podDefaults.annotations |
오퍼레이터가 관리하는 모든 DaemonSet Pod에 적용되는 어노테이션. | {} |
podDefaults.tolerations |
오퍼레이터가 관리하는 모든 DaemonSet Pod에 적용되는 톨러레이션. | [] |
podDefaults.priorityClassName |
오퍼레이터가 관리하는 모든 DaemonSet Pod에 적용되는 PriorityClass. | "" |
CRD 업그레이드 훅¶
| 키 | 설명 | 기본값 |
|---|---|---|
crds.upgrade.enabled |
helm install/helm upgrade 시 pre-install/pre-upgrade 훅 Job을 사용해 오퍼레이터 CRD를 동기화할지 여부. GitOps 도구가 CRD를 원하는 상태로 유지하는 경우 비활성화합니다. NPU Operator 업그레이드를 참고하세요. |
true |
crds.upgrade.imagePullSecrets |
오퍼레이터 이미지를 실행하는 훅 Job의 이미지 풀 시크릿. | [] |
crds.upgrade.tolerations |
훅 Job Pod의 톨러레이션. | [] |
crds.upgrade.resources |
훅 Job Pod의 CPU/메모리 requests/limits. | {} |
crds.upgrade.logging.level |
훅 Job의 로그 레벨: error, warning, info, debug. 훅은 오퍼레이터보다 먼저 실행되므로 operator.logging.*를 상속받을 수 없습니다. |
info |
crds.upgrade.logging.format |
훅 Job의 로그 형식: json 또는 text. |
json |
Operator¶
| 키 | 설명 | 기본값 |
|---|---|---|
operator.image.* |
controller-manager Pod의 이미지. 특정 오퍼레이터 버전으로 고정하려면 tag를 덮어씁니다. |
docker.io/rebellions/rbln-npu-operator:<chart default>pullPolicy: IfNotPresent |
operator.replicas |
오퍼레이터 Pod 개수. 고가용성을 위해 2 이상으로 늘리세요. |
1 |
operator.resources.requests |
오퍼레이터 Pod에 보장되는 최소 리소스. | cpu: 50m, memory: 128Mi |
operator.resources.limits |
오퍼레이터 Pod의 최대 리소스. | cpu: 500m, memory: 256Mi |
operator.metrics.enabled |
인증으로 보호되는 오퍼레이터 자체 메트릭 엔드포인트와 Service 활성화 여부. | true |
operator.metrics.port |
메트릭 HTTPS 포트. | 8443 |
operator.metrics.serviceMonitor.* |
Prometheus Operator용 ServiceMonitor 생성 여부와 수집 옵션(interval, scrapeTimeout 등). 오퍼레이터 관찰가능성을 참고하세요. |
enabled: false |
operator.logging.level |
오퍼레이터 자체 로그의 상세도: error, info, debug, panic 또는 logr 레벨을 V(N)까지 출력하게 하는 정수 N. 잘못된 값을 지정하면 오퍼레이터가 시작 시점에 중단됩니다. |
info |
operator.logging.encoder |
로그 인코딩: json 또는 console. |
json |
operator.logging.timeEncoding |
타임스탬프 형식: epoch, millis, nanos, iso8601, rfc3339, rfc3339nano. |
rfc3339nano |
operator.logging.develMode |
개발용 동작 활성화 여부. DPanic에서 패닉을 일으키고 Kubernetes 오브젝트 전체를 로그 값에 덤프합니다. 디버깅 외에는 false로 두세요. |
false |
operator.driverImageCheck |
풀을 롤아웃하기 전에 조합된 드라이버 이미지가 레지스트리에 있는지 확인할지 여부. 롤아웃 전 레지스트리 확인을 참고하세요. | true |
operator.securityContext.runAsNonRoot |
Pod 수준 securityContext. 클러스터 보안 정책에 맞춰 조정합니다. | true |
operator.affinity |
오퍼레이터 Pod의 affinity(예: control-plane 노드 고정). | {} |
operator.tolerations |
오퍼레이터 Pod의 톨러레이션(예: taint가 설정된 노드에 스케줄링 허용). | [] |
Driver Manager¶
| 키 | 설명 | 기본값 |
|---|---|---|
driver.enabled |
오퍼레이터가 NPU 드라이버를 설치·관리할지 여부. 호스트에 드라이버가 미리 설치되어 있다면 false로 둡니다. |
false |
driver.image.* |
드라이버 컨테이너 이미지. 사설 미러나 특정 드라이버 릴리스로 고정하려면 값을 재정의합니다. repository에는 NPU 제품군을 넣지 마세요. 오퍼레이터가 노드 풀마다 직접 삽입합니다. |
repo.rebellions.ai/rebellions/rbln-driver:<chart default>pullPolicy: IfNotPresent |
driver.imagePullSecrets |
드라이버 이미지의 이미지 풀 시크릿. 앞에서 만든 drivercred 이름을 사용하지 않는다면 실제 시크릿 이름에 맞게 변경하세요. |
[drivercred] |
driver.nodeSelector |
드라이버 Pod를 특정 노드로 제한합니다. 오퍼레이터가 관리하는 rebellions.ai/npu.driver.owner와 rebellions.ai/npu.deploy.driver 키는 사용할 수 없습니다. |
{} |
driver.tolerations |
드라이버 Pod의 톨러레이션. | [] |
driver.annotations |
드라이버 Pod의 어노테이션. | {} |
driver.priorityClassName |
Pod PriorityClass. 비워두면 CRD가 system-node-critical로 기본 설정합니다. |
"" |
driver.resources |
드라이버 Pod의 CPU/메모리 requests/limits. CRD 필드는 필수이며, 비워두면 차트가 기본값을 채웁니다. | {} |
driver.env |
드라이버 컨테이너에 전달되는 환경 변수(예: 로그 레벨). | [] |
driver.manager.image.* |
노드 단위 조정(reconciliation)을 수행하는 driver-manager initContainer 이미지. 이 오퍼레이터는 v0.2.2 이상을 요구하므로 차트 기본값을 유지하세요. |
docker.io/rebellions/rbln-k8s-driver-manager:<chart default>pullPolicy: IfNotPresent |
driver.smd.image.registrydriver.smd.image.repository |
드라이버와 함께 배포되는 RSMD 노드 데몬의 레지스트리와 리포지토리. 태그 키는 없으며, 태그는 항상 드라이버 버전을 따릅니다. | repo.rebellions.airebellions/rbln-smd |
driver.deployDefault |
어떤 인스턴스도 맡지 않은 모든 노드를 담당하는 기본 RBLNDriver 배포 여부. false로 설정하면 해당 노드에서 기본 드라이버가 제거됩니다. |
true |
driver.instances |
노드 그룹별로 다른 드라이버 버전을 운영하기 위한 추가 RBLNDriver 리소스. 여러 드라이버 버전 운영을 참고하세요. |
{} |
driver.upgradePolicy.* 키(autoUpgrade, drain, reboot 등)는 NPU 드라이버 업그레이드 워크플로우에서 다룹니다.
Device Plugin¶
| 키 | 설명 | 기본값 |
|---|---|---|
devicePlugin.enabled |
표준 컨테이너 Device Plugin 배포 여부. DRA 전용(draKubeletPlugin)이나 VM 전용 워크로드만 사용한다면 비활성화합니다. |
true |
devicePlugin.image.* |
Device Plugin 이미지. | docker.io/rebellions/k8s-device-plugin:<chart default>pullPolicy: IfNotPresent |
devicePlugin.useGenericResourceName |
일반 rebellions.ai/npu 리소스를 노출할지 여부. true로 유지하세요. false로 설정하면 권장하지 않는 카드별 명명 모드로 동작합니다. |
true |
devicePlugin.otlpEndpoint |
Device Plugin이 NPU 할당 트레이스를 내보낼 OTLP gRPC 엔드포인트(host:port 또는 스킴을 포함한 URL). 설정하면 트레이스가 활성화됩니다. |
"" |
DRA Driver¶
| 키 | 설명 | 기본값 |
|---|---|---|
draKubeletPlugin.enabled |
Kubernetes 1.34 이상에서 Dynamic Resource Allocation을 사용할 때 활성화합니다. devicePlugin.enabled와 동시에 사용할 수 없습니다. |
false |
draKubeletPlugin.image.* |
DRA kubelet 플러그인 이미지. | docker.io/rebellions/k8s-dra-driver-npu:<chart default>pullPolicy: IfNotPresent |
draKubeletPlugin.driverName |
드라이버 이름. DeviceClass.spec.config.driver에서 참조하는 값과 일치해야 합니다. |
npu.rebellions.ai |
draKubeletPlugin.kubeletRegistrarDirectoryPath |
플러그인이 kubelet에 등록되는 호스트 경로. | /var/lib/kubelet/plugins_registry |
draKubeletPlugin.kubeletPluginsDirectoryPath |
플러그인 소켓이 위치하는 호스트 경로. | /var/lib/kubelet/plugins |
draKubeletPlugin.healthcheckPort |
플러그인 헬스체크 엔드포인트의 TCP 포트. | 51515 |
전체 DRA 사용법은 NPU DRA Driver를 참고하세요.
Sandbox Device Plugin¶
| 키 | 설명 | 기본값 |
|---|---|---|
sandboxDevicePlugin.enabled |
VFIO 기반 Sandbox Device Plugin 배포 여부. KubeVirt 등 VM 환경에서 활성화합니다. | false |
sandboxDevicePlugin.image.* |
Sandbox Device Plugin 이미지. | docker.io/rebellions/k8s-device-plugin:<chart default>pullPolicy: IfNotPresent |
플러그인이 NPU 제품별 리소스 이름을 자동으로 도출하므로 별도로 구성할 리소스 목록이 없습니다. 리소스 이름 규칙을 참고하세요.
VFIO Manager¶
| 키 | 설명 | 기본값 |
|---|---|---|
vfioManager.enabled |
VFIO bind/unbind 헬퍼 배포 여부. VM 패스스루를 사용하려면 Sandbox Device Plugin과 함께 활성화합니다. | false |
vfioManager.image.* |
VFIO Manager 이미지. | docker.io/rebellions/rbln-vfio-manager:<chart default>pullPolicy: IfNotPresent |
vfioManager.driverManager.image.* |
VFIO Manager initContainer가 사용하는 driver-manager 이미지. | docker.io/rebellions/rbln-k8s-driver-manager:<chart default>pullPolicy: IfNotPresent |
vfioManager.driverManager.env |
해당 initContainer의 환경 변수. | [] |
Container Toolkit¶
| 키 | 설명 | 기본값 |
|---|---|---|
containerToolkit.enabled |
Container Toolkit DaemonSet 배포 여부. CDI 스펙과 런타임 설정을 외부에서 관리한다면 비활성화합니다. | true |
containerToolkit.image.* |
Container Toolkit 이미지. | docker.io/rebellions/rbln-container-toolkit:<chart default>pullPolicy: IfNotPresent |
containerToolkit.imagePullSecrets |
이미지 풀 시크릿. 사설 레지스트리에서 이미지를 받을 때 필요합니다. | [] |
containerToolkit.resources |
툴킷 Pod의 CPU/메모리 requests/limits. | {} |
containerToolkit.env |
툴킷에 전달되는 환경 변수(RBLN_CTK_DAEMON_SOCKET, RBLN_CTK_DAEMON_CONFIG_PATH 등). |
[] |
containerToolkit.refreshInterval |
각 노드에서 rbln-ctk-daemon이 CDI 스펙과 컨테이너 런타임 설정을 다시 적용하는 주기. 주기적 갱신을 비활성화하려면 0s로 설정합니다. Pod에는 RBLN_CTK_DAEMON_REFRESH_INTERVAL 환경 변수로 전달됩니다. |
5s |
NPU Feature Discovery¶
| 키 | 설명 | 기본값 |
|---|---|---|
npuFeatureDiscovery.enabled |
오퍼레이터가 NPU Feature Discovery를 배포할지 여부. NPU 노드 레이블을 다른 방식으로 관리한다면 비활성화합니다. | true |
npuFeatureDiscovery.image.* |
NPU Feature Discovery 이미지. | docker.io/rebellions/rbln-npu-feature-discovery:<chart default>pullPolicy: IfNotPresent |
Metrics Exporter¶
| 키 | 설명 | 기본값 |
|---|---|---|
metricsExporter.enabled |
Prometheus 메트릭 익스포터 배포 여부. 다른 텔레메트리 파이프라인이 NPU를 이미 수집한다면 비활성화합니다. | true |
metricsExporter.image.* |
메트릭 익스포터 이미지. | docker.io/rebellions/rbln-metrics-exporter:<chart default>pullPolicy: IfNotPresent |
Operator Validator¶
| 키 | 설명 | 기본값 |
|---|---|---|
validator.image.* |
Validator DaemonSet 이미지. | docker.io/rebellions/rbln-npu-operator-validator:<chart default>pullPolicy: IfNotPresent |
validator.imagePullSecrets |
이미지 풀 시크릿. 사설 레지스트리에서 이미지를 받을 때 필요합니다. | [] |
validator.resources |
Validator Pod의 CPU/메모리 requests/limits. | {} |
validator.env |
최상위 Validator 프로세스의 환경 변수. | [] |
validator.toolkit.env |
Container Toolkit 준비 상태 하위 검사용 환경 변수. | [] |
validator.driver.env |
드라이버 준비 상태 하위 검사용 환경 변수. | [] |
RSMD 노드 데몬¶
각 RBLNDriver는 RSMD(rbln-smd) DaemonSet을 하나씩 배포합니다. 이미지는 위 Driver Manager 표의 driver.smd.image.*로 설정합니다. RSMD는 호스트 포트 50051에서 수신 대기합니다. 배포와 갱신 규칙은 Driver Manager가 설치하는 항목을 참고하세요.
컴포넌트 로깅¶
각 컴포넌트는 구조화된 로그를 stdout에 출력합니다. 기본 로그 레벨은 info이고 기본 형식은 JSON입니다. 컴포넌트의 logging 블록에서 이 기본값을 변경할 수 있습니다. 오퍼레이터는 설정한 각 키를 환경 변수로 변환하며, 블록을 생략하면 이미지 자체의 기본값이 적용됩니다.
이 블록은 devicePlugin, draKubeletPlugin, metricsExporter, npuFeatureDiscovery, sandboxDevicePlugin에서 사용할 수 있습니다. 각 값은 해당 컴포넌트의 환경 변수로 전달되며, 오퍼레이터 없이 컴포넌트를 단독으로 실행할 때는 이 환경 변수를 직접 설정할 수도 있습니다.
| 컴포넌트 | 환경 변수 |
|---|---|
devicePlugin |
RBLN_DEVICE_PLUGIN_LOG_LEVEL, RBLN_DEVICE_PLUGIN_LOG_FORMAT |
draKubeletPlugin |
RBLN_DRA_DRIVER_LOG_LEVEL, RBLN_DRA_DRIVER_LOG_FORMAT |
metricsExporter |
RBLN_METRICS_EXPORTER_LOG_LEVEL, RBLN_METRICS_EXPORTER_LOG_FORMAT |
npuFeatureDiscovery |
RBLN_NPU_FEATURE_DISCOVERY_LOG_LEVEL, RBLN_NPU_FEATURE_DISCOVERY_LOG_FORMAT |
sandboxDevicePlugin |
RBLN_SANDBOX_DEVICE_PLUGIN_LOG_LEVEL, RBLN_SANDBOX_DEVICE_PLUGIN_LOG_FORMAT |
운영 환경에서 trace 사용 금지
메트릭 익스포터와 DRA 드라이버는 요청 페이로드까지 남기는 trace 레벨을 지원합니다.
잘못된 값을 지정해도 중단되지 않고 기본값으로 되돌아가면서 경고를 남깁니다.
오퍼레이터 자체 로깅은 이와 별개이며 operator.logging.*로 설정합니다. 오퍼레이터 관찰가능성을 참고하세요.