콘텐츠로 이동

망분리(Disconnected) 또는 에어 갭(Air-gapped) 환경에서 RBLN NPU Operator 설치

개요

인터넷에 직접 접근할 수 없는 OpenShift 클러스터에 RBLN NPU Operator를 설치합니다. 필요한 카탈로그와 이미지를 내부 레지스트리에 미러링한 뒤 Operator를 설치합니다.

토폴로지 A — 통제된 egress를 통한 미러링

미러 호스트가 허용된 외부 연결로 이미지를 받아 내부 레지스트리에 저장합니다.

토폴로지 A — 통제된 egress를 통한 미러링 토폴로지 A — 통제된 egress를 통한 미러링

토폴로지 B — 에어 갭(이동식 미디어)

외부 네트워크에서 받은 이미지를 이동식 미디어로 옮겨 내부 레지스트리에 저장합니다.

토폴로지 B — 에어 갭(이동식 미디어) 토폴로지 B — 에어 갭(이동식 미디어)


사전 요구사항

  • 지원 버전에 포함된 OpenShift Container Platform 클러스터와 cluster-admin 권한
  • 모든 클러스터 노드에서 접근 가능한 내부 레지스트리(Docker v2-2)와 클러스터가 신뢰하는 TLS 인증서
  • oc, oc-mirror가 설치된 미러 호스트와 원본·내부 레지스트리 인증 정보
  • Red Hat pull secret과 RBLN Portal 계정
  • ATOM™ 또는 Rebel100™이 장착된 워커 노드(PCI vendor ID 1eff)

컨테이너 이미지 미러링

NPU Operator·NFD 카탈로그와 드라이버·RSMD 이미지를 미러링합니다. 카탈로그 태그(v4.21)는 클러스터의 OpenShift 버전에 맞춰야 합니다.

ImageSetConfiguration

구성에 맞는 예제를 imageset-config.yaml로 저장합니다. 드라이버 버전은 지원 버전, 커널·RHEL 버전은 노드 조회 결과에 맞게 지정하고 RBLN Portal에서 이미지 제공 여부를 확인합니다.

additionalImages의 드라이버 항목에는 atom 또는 rebel100을 포함한 경로를 지정합니다. RBLNDriver 인스턴스의 spec.image에는 rebellions/rbln-driver를 사용합니다. 경로 규칙은 드라이버 이미지 선택에서 확인할 수 있습니다.

imageset-config.yaml
apiVersion: mirror.openshift.io/v2alpha1
kind: ImageSetConfiguration
mirror:
  operators:
    - catalog: registry.redhat.io/redhat/certified-operator-index:v4.21
      packages:
        - name: rbln-npu-operator
    - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.21
      packages:
        - name: nfd
  additionalImages:
    - name: repo.rebellions.ai/rebellions/atom/rbln-driver:<ATOM_DRIVER_VERSION>-<ATOM_KERNEL_VERSION>-rhel<ATOM_RHEL_VERSION>
    - name: repo.rebellions.ai/rebellions/rbln-smd:<ATOM_DRIVER_VERSION>
imageset-config.yaml
apiVersion: mirror.openshift.io/v2alpha1
kind: ImageSetConfiguration
mirror:
  operators:
    - catalog: registry.redhat.io/redhat/certified-operator-index:v4.21
      packages:
        - name: rbln-npu-operator
    - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.21
      packages:
        - name: nfd
  additionalImages:
    - name: repo.rebellions.ai/rebellions/rebel100/rbln-driver:<REBEL100_DRIVER_VERSION>-<REBEL100_KERNEL_VERSION>-rhel<REBEL100_RHEL_VERSION>
    - name: repo.rebellions.ai/rebellions/rbln-smd:<REBEL100_DRIVER_VERSION>
imageset-config.yaml
apiVersion: mirror.openshift.io/v2alpha1
kind: ImageSetConfiguration
mirror:
  operators:
    - catalog: registry.redhat.io/redhat/certified-operator-index:v4.21
      packages:
        - name: rbln-npu-operator
    - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.21
      packages:
        - name: nfd
  additionalImages:
    - name: repo.rebellions.ai/rebellions/atom/rbln-driver:<ATOM_DRIVER_VERSION>-<ATOM_KERNEL_VERSION>-rhel<ATOM_RHEL_VERSION>
    - name: repo.rebellions.ai/rebellions/rbln-smd:<ATOM_DRIVER_VERSION>
    - name: repo.rebellions.ai/rebellions/rebel100/rbln-driver:<REBEL100_DRIVER_VERSION>-<REBEL100_KERNEL_VERSION>-rhel<REBEL100_RHEL_VERSION>
    - name: repo.rebellions.ai/rebellions/rbln-smd:<REBEL100_DRIVER_VERSION>

RSMD 이미지 태그는 각 드라이버 버전과 맞춥니다. 같은 태그는 한 번만 지정합니다. 제품군·버전·OS·커널 조합에 필요한 드라이버 이미지를 모두 포함합니다.

노드 커널 버전 일치

드라이버 이미지는 노드 커널 버전과 일치해야 합니다. 커널을 변경하면 해당 커널용 이미지도 미러링해야 합니다.

커널·RHEL 버전 확인

NPU 워커 노드의 커널 버전을 확인합니다.

$ oc get nodes -o custom-columns='NAME:.metadata.name,KERNEL-VERSION:.status.nodeInfo.kernelVersion'
NAME            KERNEL-VERSION
node-rebel100   5.14.0-570.107.1.el9_6.x86_64
$ oc get nodes -o custom-columns='NAME:.metadata.name,KERNEL-VERSION:.status.nodeInfo.kernelVersion'
NAME        KERNEL-VERSION
node-atom   5.14.0-570.107.1.el9_6.x86_64

위 예시의 el9_6은 RHEL 9.6을 뜻합니다. 조회한 값을 제품군별 이미지 태그에 반영합니다.

클러스터에 접근할 수 없는 경우

사용 중인 OpenShift 릴리스의 driver-toolkit 이미지에서 커널·RHEL 버전을 확인할 수 있습니다.

1
2
3
4
export OCP_VERSION='<OCP_VERSION>'
DTK=$(oc adm release info --image-for=driver-toolkit \
  "quay.io/openshift-release-dev/ocp-release:${OCP_VERSION}-x86_64")
podman run --rm "$DTK" cat /etc/driver-toolkit-release.json

oc-mirror 실행

외부 미러 호스트에서는 원본 레지스트리에, 내부 미러 호스트에서는 내부 레지스트리에 로그인합니다. 직접 미러링하는 토폴로지 A에서는 같은 호스트에서 모두 로그인합니다.

1
2
3
docker login registry.redhat.io
docker login repo.rebellions.ai        # RBLN Portal 계정
docker login registry.internal:8443    # 내부 레지스트리

토폴로지 A — 내부 레지스트리로 직접 미러링

oc-mirror --v2 --config imageset-config.yaml --remove-signatures \
    --workspace file://./workspace docker://registry.internal:8443

토폴로지 B — 디스크 경유(에어 갭)

  1. 외부 미러 호스트에서 이미지를 아카이브로 저장합니다.

    oc-mirror --v2 --config imageset-config.yaml --remove-signatures \
        file://./archive
    
  2. ./archive 디렉터리와 imageset-config.yaml을 이동식 미디어로 내부 미러 호스트에 옮깁니다.

  3. 내부 레지스트리로 이미지를 가져옵니다.

    oc-mirror --v2 --config imageset-config.yaml --from file://./archive \
        docker://registry.internal:8443
    

미러 레지스트리 구성

클러스터의 인증 정보, CA 인증서, 이미지 미러 경로를 설정합니다.

  1. global pull secret 갱신

    내부 레지스트리 자격증명을 클러스터 global pull secret에 추가합니다.

    1
    2
    3
    4
    5
    6
    oc get secret/pull-secret -n openshift-config \
        --template='{{index .data ".dockerconfigjson" | base64decode}}' > pull-secret.json
    oc registry login --registry="registry.internal:8443" \
        --auth-basic="<username>:<password>" --to=pull-secret.json
    oc set data secret/pull-secret -n openshift-config \
        --from-file=.dockerconfigjson=pull-secret.json
    
  2. 레지스트리 CA 신뢰 구성

    내부 레지스트리 CA를 클러스터 신뢰 번들에 추가합니다.

    1
    2
    3
    4
    oc create configmap registry-ca -n openshift-config \
        --from-file=registry.internal..8443=rootCA.pem
    oc patch image.config.openshift.io/cluster --type=merge \
        -p '{"spec":{"additionalTrustedCA":{"name":"registry-ca"}}}'
    
  3. 생성된 클러스터 리소스 적용

    생성된 ImageDigestMirrorSet, ImageTagMirrorSet, CatalogSource를 적용합니다. <WORKSPACE_DIR>는 토폴로지 A에서는 ./workspace, 토폴로지 B에서는 ./archive입니다.

    oc apply -f <WORKSPACE_DIR>/working-dir/cluster-resources/
    
  4. 기본 OperatorHub 소스 비활성화

    외부 카탈로그 대신 미러 카탈로그를 사용하도록 기본 소스를 비활성화합니다.

    oc patch OperatorHub cluster --type json \
        -p '[{"op":"add","path":"/spec/disableAllDefaultSources","value":true}]'
    

미러된 카탈로그 검증

Operator를 설치하기 전에 미러된 CatalogSource가 정상 동작하는지 확인합니다.

1
2
3
oc get catalogsource -n openshift-marketplace
oc get pods -n openshift-marketplace
oc get packagemanifests -n openshift-marketplace | grep -e rbln-npu-operator -e nfd

카탈로그 Pod가 Running이고 rbln-npu-operator·nfd의 PackageManifest가 조회되는지 확인합니다.


설치 단계

미러링과 레지스트리 구성을 마친 뒤 OpenShift용 RBLN NPU Operator 설치 가이드를 따릅니다. NFD Operator와 RBLN NPU Operator의 Subscription에서 spec.source를 미러 카탈로그의 CatalogSource 이름으로 지정해야 합니다. 이름은 미러된 카탈로그 검증에서 확인합니다.

spec:
  source: cs-certified-operator-index-v4-21

NFD Operator는 NFD 카탈로그의 이름을 사용합니다(예: cs-redhat-operator-index-v4-21).

Rebel100™이 장착된 RHEL 10.2 기반 RHCOS 노드는 드라이버를 배포하기 전에 pciehp 분리 설정을 적용해야 합니다.

제품군별 드라이버 인스턴스

단일 제품군에서는 설치 가이드의 driver.json에 미러링한 드라이버 버전을 spec.version으로 지정합니다.

혼합 구성에서는 설치 가이드에서 준비한 driver.json으로 두 인스턴스를 만듭니다. oc apply -f driver.json 대신 다음 명령을 실행하고, 버전은 미러링한 값으로 지정합니다.

export ATOM_DRIVER_VERSION='<ATOM_DRIVER_VERSION>'
export REBEL100_DRIVER_VERSION='<REBEL100_DRIVER_VERSION>'
jq --arg version "$ATOM_DRIVER_VERSION" '
  .metadata.name = "rbln-driver-atom"
  | .spec.version = $version
  | .spec.nodeSelector = {"rebellions.ai/npu.family": "atom"}' \
  driver.json > driver-atom.json
jq --arg version "$REBEL100_DRIVER_VERSION" '
  .metadata.name = "rbln-driver-rebel100"
  | .spec.version = $version
  | .spec.nodeSelector = {"rebellions.ai/npu.family": "rebel100"}' \
  driver.json > driver-rebel100.json
oc apply -f driver-atom.json -f driver-rebel100.json

노드 선택과 버전 지정 규칙은 여러 드라이버 버전 운영에서 확인할 수 있습니다.


설치 확인

RBLNClusterPolicy 인스턴스와 각 제품군의 RBLNDriver 인스턴스가 ready인지 확인합니다. 아래는 앞에서 만든 혼합 구성의 출력 예시로, ATOM™ 3.4.1과 Rebel100™ 3.5.1을 사용하고 제품군마다 노드가 한 대입니다.

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

$ oc get rblndriver \
  -o 'custom-columns=NAME:.metadata.name,VERSION:.spec.version,STATE:.status.state,READY:.status.readyNodes,DESIRED:.status.desiredNodes'
NAME                   VERSION   STATE   READY   DESIRED
rbln-driver-atom       3.4.1     ready   1       1
rbln-driver-rebel100   3.5.1     ready   1       1
oc get pods -n rbln-system -o wide

각 인스턴스의 VERSION이 미러링한 버전과 일치하고 드라이버·RSMD Pod가 Ready인지 확인합니다.