콘텐츠로 이동

NPU 드라이버 자동 업그레이드

오퍼레이터가 업그레이드 정책에 따라 노드별 드라이버 교체와 검증을 진행합니다.

자동 업그레이드 설정

기존 Helm values에서 driver.upgradePolicy.autoUpgrade: true를 설정합니다.

driver:
  enabled: true
  upgradePolicy:
    autoUpgrade: true
    maxParallelUpgrades: 1
    podRestartTimeoutSeconds: 1800
    waitForCompletion:
      timeoutSeconds: 0
      podSelector: ""
    npuPodDeletion:
      force: false
      timeoutSeconds: 300
      deleteEmptyDirData: false

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·완료 노드는 점유하지 않습니다.

업그레이드 확인

롤아웃 상태

다음 명령으로 롤아웃 상태를 조회합니다.

kubectl get rblnclusterpolicy
kubectl get rblnclusterpolicy <POLICY_NAME> -o yaml

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를 실행하여 업그레이드된 드라이버 버전을 확인합니다.

kubectl get pods -n rbln-system -o wide -l app.kubernetes.io/component=rbln-driver
kubectl exec -n rbln-system <DRIVER_POD> -c rbln-driver-container -- rbln-smi

드라이버 설치 상태

드라이버를 교체하는 동안 RBLNClusterPolicy 인스턴스가 notReady로 표시될 수 있습니다. 계속 준비되지 않은 상태라면 다음 메시지에 나온 노드와 드라이버 initContainer 로그를 확인합니다.

kubectl get rblnclusterpolicy <POLICY_NAME> -o jsonpath='{.status.conditions[?(@.type=="Ready")].message}'

노드 상태와 어노테이션

kubectl get nodes -L rebellions.ai/npu-driver-upgrade-state
kubectl describe node <NODE_NAME>

아래 어노테이션 이름에는 모두 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 업그레이드 완료
1
2
3
kubectl get events -A \
  --field-selector involvedObject.kind=Node,involvedObject.name=<NODE_NAME> \
  --sort-by=.lastTimestamp

드라이버 업그레이드 건너뛰기

특정 노드를 드라이버 업그레이드 대상에서 제외하려면 다음 레이블을 설정합니다.

kubectl label node <NODE_NAME> rebellions.ai/npu-driver-upgrade.skip=true

업그레이드를 다시 활성화하려면 레이블을 제거합니다.

kubectl label node <NODE_NAME> rebellions.ai/npu-driver-upgrade.skip-

이 레이블은 새 자동 업그레이드 진입을 막습니다. 진행 중인 업그레이드를 멈추거나 수동 드라이버 Pod 삭제를 막지는 않습니다.

상태 확인

제외된 노드와 각 노드의 진행 상태를 확인합니다.

1
2
3
4
kubectl get nodes \
  -L rebellions.ai/npu.present \
  -L rebellions.ai/npu-driver-upgrade-state \
  -L rebellions.ai/npu-driver-upgrade.skip

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가 됩니다. 각 타임아웃 값은 타임아웃 설정에 정리되어 있습니다.

재시도 경로

원인을 해결한 뒤 재시도를 요청하고 상태를 확인합니다.

kubectl annotate node <NODE_NAME> rebellions.ai/npu-driver-upgrade-requested=true --overwrite
kubectl get node <NODE_NAME> -L rebellions.ai/npu-driver-upgrade-state

자동 업그레이드를 껐다면 다시 켠 뒤 재시도를 요청해야 합니다. 다시 켜는 것만으로 실패 노드의 재시도가 보장되지는 않습니다.

명시적인 재시도 요청 외에는 다음 조건에서 업그레이드가 다시 진행됩니다.

대상 조건 결과
Skip·실패 노드 실패 당시와 다른 드라이버 버전 또는 드라이버 컨테이너 설정 적용 업그레이드 대기로 전환
드라이버 Pod 교체 단계에서 실패한 노드 현재 설정과 일치하는 Pod가 Running이고 모든 컨테이너가 Ready uncordon 또는 완료 단계로 진행
드라이버 Pod 교체 단계에서 실패한 노드 Pod 템플릿이 변경되었으며, 기존 Pod가 삭제 중이 아님 업그레이드 대기로 전환해 Pod 교체 재시도

검증 단계에서 실패한 노드는 Pod가 Ready가 되는 것만으로 복구되지 않습니다. 명시적으로 재시도를 요청하거나 드라이버 버전·컨테이너 설정을 변경해야 합니다.