콘텐츠로 이동

오퍼레이터 관찰가능성

RBLN NPU Operator의 상태는 메트릭, Kubernetes 이벤트와 리소스의 Ready 조건, 로그로 확인합니다. NPU 사용률·온도·전력은 Metrics Exporter에서 확인할 수 있습니다.

오퍼레이터 메트릭

오퍼레이터는 RBLNClusterPolicy 인스턴스와 RBLNDriver 인스턴스의 조정(reconcile) 결과, NPU 노드 수, 드라이버 업그레이드 진행 상황 같은 자체 상태 메트릭을 Prometheus 형식으로 노출합니다. Helm에서 operator.metrics.enabled 값을 사용하여 활성화 여부를 설정할 수 있습니다(기본값 true).

메트릭 정보

메트릭 타입 레이블 설명
rbln_operator_clusterpolicy_reconcile_status Gauge N/A 마지막 RBLNClusterPolicy 조정 결과(0=성공, 1=notReady, 2=unavailable)
rbln_operator_driver_reconcile_status Gauge name RBLNDriver CR별 마지막 조정 결과
rbln_operator_reconcile_total Counter controller 실행된 조정 횟수
rbln_operator_reconcile_failed_total Counter controller ready에 도달하지 못한 조정 횟수
rbln_operator_npu_nodes Gauge workload 워크로드 타입별 NPU 대상 노드 수
rbln_operator_workload_coverage_state Gauge workload 워크로드 커버리지 집계 상태(0=empty ~ 3=uncovered)
rbln_operator_driver_pool_ready_ratio Gauge driver, pool 드라이버 풀별 ready/desired 비율
rbln_operator_driver_owned_nodes Gauge driver 각 RBLNDriver에 라우팅된 노드 수. 0으로 초기화되므로 매칭되는 노드가 없어도 시리즈가 사라지지 않고 0으로 표시됩니다
rbln_operator_driver_uncovered_nodes Gauge N/A 드라이버 대상이지만 소유 RBLNDriver가 없는 NPU 노드 수
rbln_operator_driver_selector_conflict_nodes Gauge driver 이 드라이버의 셀렉터가 다른 RBLNDriver와 충돌하는 노드 수
rbln_operator_driver_upgrade_nodes Gauge state 드라이버 업그레이드 상태별 노드 수

오퍼레이터는 controller-runtime 표준 메트릭(controller_runtime_*, workqueue_*, rest_client_*, go_*)도 동일한 엔드포인트에서 함께 노출합니다.

Prometheus Operator로 수집하기

Prometheus Operator를 사용한다면 Helm에서 ServiceMonitor를 다음과 같이 활성화합니다.

1
2
3
4
operator:
  metrics:
    serviceMonitor:
      enabled: true

엔드포인트가 승인을 요구하므로, 스크랩 대상을 UP 상태로 만들려면 차트가 생성하는 metrics-reader ClusterRole을 Prometheus의 ServiceAccount에 바인딩해야 합니다.

1
2
3
kubectl create clusterrolebinding rbln-operator-metrics-scraper \
  --clusterrole=rbln-npu-operator-metrics-reader \
  --serviceaccount=<MONITORING_NAMESPACE>:<PROMETHEUS_SERVICE_ACCOUNT>

ClusterRole 이름은 <fullname>-metrics-reader입니다. 설치 가이드처럼 릴리스 이름에 rbln-npu-operator가 포함되어 있으면 Helm은 릴리스 이름을 그대로 <fullname>으로 쓰고, 그렇지 않으면 <release>-rbln-npu-operator를 씁니다. 바인딩을 확인합니다.

kubectl get clusterrolebinding rbln-operator-metrics-scraper

403 응답

ServiceMonitor를 활성화했는데도 스크랩 대상이 403 Forbidden으로 남아 있다면 위 metrics-reader 바인딩 누락 여부를 확인합니다.

오퍼레이터 이벤트

오퍼레이터는 상태 변경과 오류를 Kubernetes 이벤트로 기록합니다. kubectl describe로 발생 시점과 내용을 확인할 수 있습니다. 커스텀 리소스의 오류는 다음 표와 같이 Ready 조건에도 표시됩니다. 이벤트 보존 기간이 지난 뒤에는 Ready 조건에서 현재 상태를 확인할 수 있습니다.

사유(reason) 타입 대상 발생 시점 대응 Ready 조건
DriverUpgradeStarted Normal Node 노드가 업그레이드 대상으로 선정되어 cordon 단계로 진입 N/A
DriverUpgradeSkipped Warning Node eviction 문제로 시도를 건너뛰고 이전 드라이버 유지. 업그레이드가 건 cordon만 해제하며 관리자가 cordon한 노드와 requestor mode의 노드는 cordon 유지 N/A
DriverUpgradePodStuck Warning Node 교체된 드라이버 Pod가 진행되지 않음(이미지 풀 또는 컨테이너 시작 실패). Pod 교체 단계에서 대기하는 동안 반복 N/A
DriverUpgradeCompleted Normal Node 노드 업그레이드 완료 N/A
DriverUpgradeFailed Warning Node 드라이버 Pod 교체 또는 검증 실패. 노드는 cordon 상태를 유지하고 메시지에 실패 사유가 포함됨 N/A
DriverOwnerChanged Normal Node 노드를 소유하는 RBLNDriver가 지정되거나 변경됨 N/A
DriverNodeUncovered Warning Node 매칭되는 셀렉터가 없거나 셀렉터 충돌이 해소되지 않아 노드가 소유 RBLNDriver를 잃음 N/A
ComponentApplyFailed Warning RBLNClusterPolicy RBLNClusterPolicy 인스턴스가 관리하는 컴포넌트(Device Plugin, NPU Feature Discovery 등)의 매니페스트 적용 실패 False / ComponentApplyFailed
DriverInstallFailed Warning RBLNDriver 드라이버 설치용 컴포넌트(노드 풀별 드라이버 DaemonSet 등)의 매니페스트 적용 실패 False / Error
InvalidSpec Warning RBLNDriver nodeSelector에 예약 키를 사용했거나 리소스 이름이 63자를 초과함 False / InvalidSpec
ConflictingNodeSelector Warning RBLNDriver 특정 노드에서 nodeSelector가 다른 RBLNDriver와 충돌함 False / ConflictingNodeSelector
DriverImageNotFound Warning RBLNDriver 해당 풀에 대해 조합된 드라이버 이미지가 레지스트리에 없음. 약 5분마다 재확인하며 이미지를 게시하면 자동으로 해소됨 False / DriverImageNotFound
DriverFamilyLabelMissing Warning RBLNDriver 소유한 노드에 사용 가능한 rebellions.ai/npu.family 레이블이 없음 False / DriverFamilyLabelMissing
AllActiveWorkloadsReady Normal RBLNClusterPolicy 관리하는 모든 컴포넌트가 준비되어 RBLNClusterPolicy 인스턴스의 상태가 ready로 바뀜 True / AllActiveWorkloadsReady
DriverReady Normal RBLNDriver 모든 노드 풀에서 드라이버가 준비되어 RBLNDriver 인스턴스의 상태가 ready로 바뀜 True / AllDriverPoolsReady
PolicyIgnored Normal RBLNClusterPolicy 활성 RBLNClusterPolicy 인스턴스가 이미 있어 나중에 생성한 인스턴스를 무시함(클러스터당 RBLNClusterPolicy 인스턴스 1개만 유효) False / PolicyIgnored

오퍼레이터는 상태가 바뀔 때 이벤트를 한 번만 기록합니다. 상태가 그대로면 조정(reconcile) 루프를 반복해도 이벤트를 다시 기록하지 않습니다. DriverUpgradePodStuck은 예외로, 드라이버 Pod 교체 단계에서 대기하는 동안 반복해서 기록합니다. 네 가지 드라이버 검증 경고(InvalidSpec, ConflictingNodeSelector, DriverImageNotFound, DriverFamilyLabelMissing)는 이벤트 사유와 리소스 세대(metadata.generation)의 조합마다 한 번씩만 기록합니다. 따라서 리소스 설정이 바뀌지 않은 상태에서 문제가 해결되었다가 다시 발생하면 Ready 조건만 갱신하고 이벤트는 다시 기록하지 않습니다. 노드 라우팅 이벤트 두 가지는 조정 과정에서 노드 소유자가 바뀔 때만 기록합니다.

두 CRD 모두 클러스터 범위이므로, 이벤트는 오퍼레이터 네임스페이스가 아니라 default 네임스페이스에 기록됩니다.

드라이버 자동 업그레이드 중에는 오퍼레이터가 각 노드에 DriverUpgradeStarted → DriverUpgradeCompleted 순서로 이벤트를 기록하며, 단계가 실패하면 DriverUpgradeSkipped 또는 DriverUpgradeFailed를 기록합니다. 각 이벤트가 표시하는 상태는 이벤트에서 확인할 수 있습니다.

이벤트 조회

조회할 대상에 맞는 명령을 선택합니다.

특정 노드의 업그레이드 이벤트를 시간순으로 조회합니다.

1
2
3
kubectl get events -A \
  --field-selector involvedObject.kind=Node,involvedObject.name=<NODE_NAME> \
  --sort-by=.lastTimestamp
kubectl describe rblnclusterpolicy <name>
kubectl describe rblndriver <name>

이벤트 보존 기간

Kubernetes는 이벤트를 기본 1시간 동안만 보존합니다. 현재 상태는 .status.conditions에서 확인하고, 장기 추세와 알림에는 rbln_operator_* 메트릭을 사용하는 것을 권합니다.

kubectl logs -n <NAMESPACE> deployment/rbln-npu-operator-controller-manager
kubectl get rblnclusterpolicy <name> -o jsonpath='{.status.conditions}'

이벤트가 보이지 않을 때

같은 오브젝트에서 서로 다른 오류가 짧은 시간에 여러 번 발생하면 Kubernetes 클라이언트의 스팸 필터가 일부 이벤트를 걸러낼 수 있습니다. 이 경우에도 Ready 조건과 메트릭에서 현재 상태를 확인할 수 있습니다.

드라이버와 RSMD 준비 상태

RBLNDriver의 .status.nodePools는 드라이버 Pod의 준비 상태를, .status.smd는 RSMD의 준비 상태를 표시합니다. 드라이버 Pod가 준비되어도 RSMD가 준비되지 않으면 SmdNotReady 사유와 함께 Ready=False로 표시됩니다.

1
2
3
kubectl get rblndriver
kubectl get rblndriver <DRIVER_NAME> -o jsonpath='{.status.nodePools}{"\n"}'
kubectl get rblndriver <DRIVER_NAME> -o jsonpath='{.status.smd}{"\n"}'

로깅

오퍼레이터는 Kubernetes 클라이언트 라이브러리가 생성하는 레코드를 포함한 구조화된 로그를 stdout에 출력합니다. 다음 차트 값으로 로그를 설정합니다.

1
2
3
4
5
6
operator:
  logging:
    level: info              # error | info | debug | panic 또는 logr V(N)을 뜻하는 정수 N
    encoder: json            # json | console
    timeEncoding: rfc3339nano
    develMode: false

잘못된 로깅 값으로 인한 오퍼레이터 시작 실패

level이나 encoder에 잘못된 값을 지정하면 기본값으로 되돌아가지 않고 오퍼레이터가 시작 시점에 중단됩니다. 적용 전에 값을 확인해야 합니다.