콘텐츠로 이동

RBLN NPU Operator 제거

설치한 방식에 맞게 Helm 또는 OLM 리소스를 제거합니다. 예제의 리소스 이름과 rbln-system은 사용 중인 리소스 이름과 네임스페이스로 바꿉니다.

1. 워크로드 종료와 리소스 확인

사용 중인 할당 방식에 따라 NPU 워크로드를 확인합니다.

1
2
3
4
5
6
7
8
kubectl get pods -A \
  --field-selector='status.phase!=Succeeded,status.phase!=Failed' -o json | \
  jq -r '.items[]
    | select(any((.spec.containers + (.spec.initContainers // []))[];
        ((.resources.limits["rebellions.ai/npu"]
          // .resources.requests["rebellions.ai/npu"] // "0") | tonumber) > 0))
    | [.metadata.namespace, .metadata.name, (.spec.nodeName // "-")]
    | @tsv'

NPU Claim을 참조하는 Pod를 확인합니다.

kubectl get pods,resourceclaims,resourceclaimtemplates -A -o json | \
  jq -r '
    def npu_claim:
      any(.status.allocation.devices.results[]?; .driver == "npu.rebellions.ai")
      or any((.spec.spec // .spec).devices.requests[]?;
        any((.firstAvailable // [.exactly // .])[];
          .deviceClassName == "npu.rebellions.ai"
          or .deviceClassName == "vfio-npu.rebellions.ai"));
    [.items[]
      | select(.kind == "ResourceClaim" or .kind == "ResourceClaimTemplate")
      | select(npu_claim)
      | [.metadata.namespace, .kind, .metadata.name]] as $claims
    | .items[] | select(.kind == "Pod")
    | select(.status.phase != "Succeeded" and .status.phase != "Failed")
    | .metadata.namespace as $ns
    | select(
        any(.spec.resourceClaims[]?;
          [$ns, "ResourceClaim", .resourceClaimName] as $claim
          | [$ns, "ResourceClaimTemplate", .resourceClaimTemplateName] as $template
          | ($claims | index([$claim]) != null or index([$template]) != null))
        or any(.status.resourceClaimStatuses[]?;
          [$ns, "ResourceClaim", .resourceClaimName] as $claim
          | ($claims | index([$claim]) != null)))
    | [.metadata.namespace, .metadata.name, (.spec.nodeName // "-")]
    | @tsv'

호스트 장치를 요청하는 VM과 VMI를 확인합니다. rebellions.ai/ 리소스나 NPU Claim을 사용하는 항목을 확인합니다. Claim 참조는 claim: 접두사로 표시합니다.

1
2
3
4
5
6
7
8
kubectl get vm,vmi -A -o json | \
  jq -r '.items[]
    | (.spec.template.spec // .spec) as $spec
    | select(($spec.domain.devices.hostDevices // [] | length) > 0)
    | [.kind, .metadata.namespace, .metadata.name,
        ([$spec.domain.devices.hostDevices[]
          | .deviceName // ("claim:" + .claimName)] | join(","))]
    | @tsv'

DRA를 사용한다면 VM의 resourceClaims에 연결된 NPU Claim도 확인합니다.

kubectl get resourceclaims -A \
  -o 'custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,CLASS:.spec.devices.requests[*].exactly.deviceClassName,DRIVER:.status.allocation.devices.results[*].driver'

NPU를 사용하는 Pod와 VM을 종료합니다. Deployment나 Job 등이 관리하는 Pod라면 먼저 해당 워크로드를 중지해 Pod가 다시 생성되지 않도록 합니다.

워크로드를 종료한 뒤 제거할 RBLNClusterPolicy 인스턴스와 RBLNDriver 인스턴스를 확인합니다.

$ kubectl get rblnclusterpolicy \
  -o 'custom-columns=NAME:.metadata.name,STATE:.status.state'
NAME                  STATE
rbln-cluster-policy   ready

$ kubectl get rblndriver \
  -o 'custom-columns=NAME:.metadata.name,STATE:.status.state,READY:.status.readyNodes,DESIRED:.status.desiredNodes'
NAME                   STATE   READY   DESIRED
rbln-driver-rebel100   ready   1       1
$ kubectl get rblnclusterpolicy \
  -o 'custom-columns=NAME:.metadata.name,STATE:.status.state'
NAME                  STATE
rbln-cluster-policy   ready

$ kubectl get rblndriver \
  -o 'custom-columns=NAME:.metadata.name,STATE:.status.state,READY:.status.readyNodes,DESIRED:.status.desiredNodes'
NAME               STATE   READY   DESIRED
rbln-driver-atom   ready   1       1

2. 설치 제거

설치 방식에 맞는 명령을 실행합니다.

Helm 릴리스를 제거합니다. 차트가 생성한 RBLNDriver 인스턴스와 RBLNClusterPolicy 인스턴스도 함께 삭제됩니다.

helm list -n rbln-system
helm uninstall rbln-npu-operator -n rbln-system --wait --timeout 5m

앞에서 확인한 RBLNDriver 인스턴스를 삭제합니다.

호스트 드라이버 사용 시

호스트에 설치한 드라이버를 사용하고 RBLNDriver 인스턴스가 없다면 이 명령을 생략합니다.

1
2
3
export DRIVER_NAME='<RBLNDRIVER_NAME>'
oc delete rblndriver "$DRIVER_NAME" \
  --cascade=foreground --wait=true --timeout=180s

삭제할 Subscription과 이 Operator 전용 OperatorGroup의 이름을 지정합니다. Subscription과 연결된 CSV를 함께 삭제합니다.

1
2
3
4
5
6
7
8
oc get subscriptions,operatorgroups -n rbln-system
export SUBSCRIPTION=rbln-npu-operator
export OPERATOR_GROUP=rbln-npu-operator-group
CSV=$(oc get subscription "$SUBSCRIPTION" -n rbln-system \
  -o jsonpath='{.status.installedCSV}')
oc delete subscription "$SUBSCRIPTION" -n rbln-system
oc delete csv "$CSV" -n rbln-system
oc delete operatorgroup "$OPERATOR_GROUP" -n rbln-system

Operator를 제거한 뒤 RBLNClusterPolicy 인스턴스를 삭제합니다.

oc delete rblnclusterpolicy rbln-cluster-policy \
  --ignore-not-found --cascade=foreground --wait=true --timeout=180s

3. 리소스 제거 확인

Operator가 관리하던 리소스가 남아 있는지 확인합니다.

$ kubectl get pods,daemonsets,deployments -n rbln-system
No resources found in rbln-system namespace.

$ kubectl get rblnclusterpolicies,rblndrivers
No resources found

$ kubectl get clusterroles,clusterrolebindings \
  -l app.kubernetes.io/instance=rbln-npu-operator
No resources found

Operator가 관리하던 컴포넌트와 CR이 삭제되었는지 확인합니다. Helm 설치에서는 릴리스 레이블이 붙은 RBAC 리소스도 남아 있지 않아야 합니다. 노드 레이블과 feature 파일의 정리 방법은 NPU Feature Discovery의 제거 후 정리에 정리되어 있습니다.

추가 정리(선택)

전용 리소스만 삭제

다른 설치에서 사용하는 CRD나 네임스페이스는 삭제해서는 안 됩니다. 네임스페이스를 삭제하면 그 안의 PVC와 Secret도 삭제됩니다.

CRD 제거

남은 인스턴스를 조회합니다.

kubectl get rblnclusterpolicies,rblndrivers

남은 인스턴스가 없고 CRD가 더 이상 필요하지 않을 때 삭제합니다.

kubectl delete crd rblnclusterpolicies.rebellions.ai rblndrivers.rebellions.ai
kubectl get crd rblnclusterpolicies.rebellions.ai rblndrivers.rebellions.ai --ignore-not-found

네임스페이스 제거

Operator 전용 네임스페이스의 리소스를 확인한 뒤 더 이상 필요하지 않으면 삭제합니다. 튜토리얼에서 생성한 Pod와 Claim은 각 튜토리얼의 정리 절차에 따라 삭제합니다.

kubectl get all,pvc,configmaps,secrets -n rbln-system
kubectl delete namespace rbln-system