NPU 드라이버 자동 업그레이드¶
오퍼레이터가 업그레이드 정책에 따라 노드별 드라이버 교체와 검증을 진행합니다.
자동 업그레이드 설정¶
기존 Helm values에서 driver.upgradePolicy.autoUpgrade: true를 설정합니다.
npuPodDeletion으로 NPU Pod의 eviction 허용 범위를 지정합니다. RBLNClusterPolicy 매니페스트에서는 spec.driver.upgradePolicy.podDeletion에 지정합니다.
Rebel100™과 ATOM™ 노드를 차례로 업그레이드하고 로드된 버전까지 확인하는 전체 예시는 드라이버 자동 업그레이드하기에서 확인할 수 있습니다.
업그레이드 정책¶
| 설정 | 효과 | 기본값 |
|---|---|---|
maxParallelUpgrades | 동시 업그레이드 노드 수 | 1 |
podRestartTimeoutSeconds | 드라이버 Pod 교체 타임아웃. 만료 시 upgrade-failed | 1800 |
waitForCompletion.podSelector | cordon 후, eviction 전에 완료를 기다릴 Pod. 비어 있으면 대기 생략 | "" |
waitForCompletion.timeoutSeconds | 최대 대기 시간. 만료 시 업그레이드 계속 진행. 0은 무한 대기 | 0 |
npuPodDeletion.force | 컨트롤러 없는 NPU Pod의 eviction 허용 | false |
npuPodDeletion.timeoutSeconds | 오퍼레이터의 eviction 타임아웃 | 300 |
npuPodDeletion.deleteEmptyDirData | emptyDir를 사용하는 NPU Pod의 eviction 허용. 볼륨 내용 삭제 | false |
자동 진행과 중단¶
기존 Helm values의 driver.image.tag 또는 대상 인스턴스의 driver.instances.<key>.image.tag를 원하는 버전으로 변경해 적용하면 롤아웃이 시작됩니다. 직접 관리하는 RBLNDriver는 spec.version을 변경합니다.
자동 모드에서는 오퍼레이터가 드라이버 Pod를 교체하므로 관리자가 직접 삭제할 필요가 없습니다. waitForCompletion으로 지정한 작업의 완료를 기다릴 수 있으며, 드라이버 교체와 검증이 끝난 뒤 오퍼레이터가 자신이 건 cordon을 해제합니다. 관리자가 걸어 둔 cordon은 유지합니다.
autoUpgrade: false로 바꾸면 자동 롤아웃이 중단됩니다. 오퍼레이터가 건 cordon은 해제하지만, upgrade-failed 노드는 복구될 때까지 cordon을 유지합니다. 실패 노드는 원인을 해결한 뒤 재시도를 요청해야 합니다.
노드 상태¶
현재 상태는 노드의 rebellions.ai/npu-driver-upgrade-state 레이블로 확인합니다.
| 상태 | 의미 |
|---|---|
upgrade-required | 업그레이드 슬롯 대기 |
cordon-required | 노드에 새 워크로드 스케줄링 차단 |
wait-for-jobs-required | waitForCompletion.podSelector와 매칭되는 Running·Pending Pod 완료 대기. 타임아웃이면 다음 단계로 진행 |
pod-deletion-required | NPU Pod eviction. 막히면 upgrade-skipped |
pod-restart-required | 드라이버 Pod 교체 및 준비 완료 대기 |
validation-required | 오퍼레이터 validator가 Ready가 될 때까지 최대 600초 대기 |
uncordon-required | 업그레이드가 건 cordon 해제 |
upgrade-done | 업그레이드 완료 |
maxParallelUpgrades는 동시 업그레이드 수를 제한합니다. 실패 노드도 슬롯을 점유하며, Skip·완료 노드는 점유하지 않습니다.
업그레이드 확인¶
롤아웃 상태¶
다음 명령으로 롤아웃 상태를 조회합니다.
status.driverUpgrade에는 다음 필드가 표시됩니다.
| 필드 | 의미 |
|---|---|
total | 업그레이드 대상으로 추적 중인 전체 노드 수 |
done | 업그레이드가 완료된 노드 수 |
inProgress | 업그레이드가 진행 중인 노드 수. 대기·Skip·실패 노드 제외 |
pending | 업그레이드 시작을 기다리는 노드 수 |
skipped | 드라이버 교체 전에 업그레이드를 건너뛴 노드 수. done에 포함되지 않음 |
failed | 업그레이드가 실패한 노드 수 |
state | 아래 표의 롤아웃 상태 |
progress | 완료/전체 노드 수. Skip 노드가 있으면 (N skipped) 추가. 예: 12/40 (2 skipped) |
lastTransitionTime | 상태별 노드 수가 마지막으로 변경된 시각 |
| 롤아웃 상태 | 의미 |
|---|---|
Degraded | 실패 노드가 있으며 해당 노드는 업그레이드 슬롯을 계속 점유 |
InProgress | 실패 노드 없이 업그레이드 진행 또는 대기 중 |
PartiallyComplete | 진행·대기 노드는 없지만 Skip 노드가 남음 |
Complete | 추적 중인 모든 노드의 업그레이드 완료 |
업그레이드 조건¶
status.conditions에서 다음 Condition의 status와 reason을 확인할 수 있습니다.
| Condition | True인 조건 | True일 때 reason | False일 때 reason |
|---|---|---|---|
DriverUpgradeInProgress | 진행 중이거나 대기 중인 노드가 있음 | UpgradeInProgress | NoUpgradeInProgress |
UpgradeDegraded | 실패 노드가 있음 | FailedNodes | NoFailedNodes |
UpgradeIncomplete | 진행·대기 노드는 없지만 Skip 노드가 남음 | NodesSkipped | RolloutInProgress 또는 NoSkippedNodes |
UpgradeStalled | 진행 중인 노드가 있고, 상태별 노드 수가 30분 넘게 바뀌지 않음 | NoRecentTransition | Progressing |
UpgradeIncomplete=False일 때 Skip 노드가 있으면 RolloutInProgress, 없으면 NoSkippedNodes로 표시됩니다. 실패 노드가 모든 업그레이드 슬롯을 점유하고 진행 중인 노드가 없다면 UpgradeDegraded=True, UpgradeStalled=False로 표시됩니다.
동작 중인 드라이버 확인¶
대상 노드의 새 드라이버 Pod가 Ready인지 확인하고, rbln-smi를 실행하여 업그레이드된 드라이버 버전을 확인합니다.
드라이버 설치 상태¶
드라이버를 교체하는 동안 RBLNClusterPolicy 인스턴스가 notReady로 표시될 수 있습니다. 계속 준비되지 않은 상태라면 다음 메시지에 나온 노드와 드라이버 initContainer 로그를 확인합니다.
노드 상태와 어노테이션¶
아래 어노테이션 이름에는 모두 rebellions.ai/ 접두사가 붙습니다.
| 어노테이션 | 용도 |
|---|---|
npu-driver-upgrade-failure-reason | 실패 사유. 긴 메시지는 잘림 |
npu-driver-upgrade-failure-step | 실패한 단계 |
npu-driver-upgrade-skip-reason | eviction을 막은 원인. 긴 메시지는 잘림 |
npu-driver-upgrade-cordon | cordon을 수행한 주체. 자동 업그레이드가 설정한 값은 operator |
npu-driver-upgrade-requested | true로 설정해 재시도 요청 |
어노테이션 메시지가 잘린 경우 상세 원인은 오퍼레이터 로그에서 확인할 수 있습니다.
이벤트¶
| 이벤트 | 의미 |
|---|---|
DriverUpgradeStarted | 노드가 업그레이드에 진입 |
DriverUpgradeSkipped | eviction 문제로 시도를 Skip |
DriverUpgradeFailed | 드라이버 Pod 교체 또는 검증 실패 |
DriverUpgradePodStuck | 드라이버 Pod의 이미지 풀 또는 시작 오류. 교체 단계에서 대기하는 동안 반복 |
DriverUpgradeCompleted | 업그레이드 완료 |
드라이버 업그레이드 건너뛰기¶
특정 노드를 드라이버 업그레이드 대상에서 제외하려면 다음 레이블을 설정합니다.
업그레이드를 다시 활성화하려면 레이블을 제거합니다.
이 레이블은 새 자동 업그레이드 진입을 막습니다. 진행 중인 업그레이드를 멈추거나 수동 드라이버 Pod 삭제를 막지는 않습니다.
상태 확인¶
제외된 노드와 각 노드의 진행 상태를 확인합니다.
Skip 노드와 실패 노드¶
실패한 단계에 따라 노드의 업그레이드 슬롯과 cordon 유지 여부가 달라집니다.
| 상태 | 노드에 미치는 영향 | 다음 조치 |
|---|---|---|
upgrade-skipped | 이전 드라이버를 유지하고 업그레이드가 건 cordon을 해제. 관리자가 cordon한 노드와 requestor mode의 노드는 cordon 유지 | eviction을 막은 원인을 해결하고 재시도 |
upgrade-failed | 드라이버 Pod 또는 검증 실패 후 cordon과 업그레이드 슬롯 유지 | 드라이버 Pod나 노드 문제를 해결하고 재시도 |
Requestor mode는 노드의 자동 uncordon을 중지하는 모드입니다. rebellions.ai/npu-driver-upgrade-requestor-mode 어노테이션이 있으면 값과 무관하게 적용됩니다.
Skip 사유¶
rebellions.ai/* 리소스를 요청하거나 컨테이너 모드 NPU DRA claim을 사용하는 Pod가 eviction 대상입니다. 기본 컨테이너 DeviceClass는 npu.rebellions.ai이며, rebellions.ai/*와 연결된 사용자 정의 클래스도 포함됩니다.
| 원인 | 조치 |
|---|---|
emptyDir 볼륨 사용 | npuPodDeletion.deleteEmptyDirData: true로 설정하거나 워크로드 이동. eviction 시 볼륨 내용 삭제 |
| 컨트롤러 없음 | npuPodDeletion.force: true로 설정하거나 Pod 삭제 |
| DaemonSet이 관리하는 NPU Pod | 해당 DaemonSet에서 노드 제외 |
| PodDisruptionBudget | 예산을 조정하거나 워크로드를 스케일하여 중단 허용 |
노드의 rebellions.ai/npu-driver-upgrade-skip-reason 어노테이션에서 원인을 확인합니다. PodDisruptionBudget이 eviction을 막으면 원인이 eviction 타임아웃으로 표시될 수 있습니다.
드라이버 Pod 타임아웃¶
이미지 풀이나 컨테이너 시작 실패는 DriverUpgradePodStuck 경고로 표시됩니다. podRestartTimeoutSeconds가 지나거나(기본값 1800초), 준비되지 않은 컨테이너가 10회를 넘게 재시작하면 노드는 upgrade-failed가 됩니다. 각 타임아웃 값은 타임아웃 설정에 정리되어 있습니다.
재시도 경로¶
원인을 해결한 뒤 재시도를 요청하고 상태를 확인합니다.
자동 업그레이드를 껐다면 다시 켠 뒤 재시도를 요청해야 합니다. 다시 켜는 것만으로 실패 노드의 재시도가 보장되지는 않습니다.
명시적인 재시도 요청 외에는 다음 조건에서 업그레이드가 다시 진행됩니다.
| 대상 | 조건 | 결과 |
|---|---|---|
| Skip·실패 노드 | 실패 당시와 다른 드라이버 버전 또는 드라이버 컨테이너 설정 적용 | 업그레이드 대기로 전환 |
| 드라이버 Pod 교체 단계에서 실패한 노드 | 현재 설정과 일치하는 Pod가 Running이고 모든 컨테이너가 Ready | uncordon 또는 완료 단계로 진행 |
| 드라이버 Pod 교체 단계에서 실패한 노드 | Pod 템플릿이 변경되었으며, 기존 Pod가 삭제 중이 아님 | 업그레이드 대기로 전환해 Pod 교체 재시도 |
검증 단계에서 실패한 노드는 Pod가 Ready가 되는 것만으로 복구되지 않습니다. 명시적으로 재시도를 요청하거나 드라이버 버전·컨테이너 설정을 변경해야 합니다.