콘텐츠로 이동

RBLN Container Toolkit

RBLN Container Toolkit은 Container Device Interface(CDI) 스펙을 사용하여 컨테이너 런타임이 Rebellions NPU 장치에 액세스할 수 있도록 합니다. 호스트의 RBLN 라이브러리와 도구를 자동으로 검색하고, CDI 스펙을 생성하며, 컨테이너 런타임을 구성하여 애플리케이션 변경 없이 컨테이너가 NPU 하드웨어를 사용할 수 있도록 합니다.

범위

Container Toolkit은 현재 CDI 스펙 생성과 런타임 구성을 담당합니다. RBLN 라이브러리와 도구(rbln-smi 등)를 CDI 를 통해 컨테이너에 노출합니다. RSD 그룹을 사용한 NPU 장치 할당은 NPU 할당 가이드에서 확인할 수 있습니다. 향후 릴리스에서 이러한 기능들이 통합된 툴킷으로 제공될 예정입니다.

동작 방식

                          ┌──────────────────────────────────────────┐
  Host System             │           RBLN Container Toolkit         │
 ─────────────            │                                          │
                          │  1. Discover    RBLN libs & tools        │
  /usr/lib64/             │       ↓         on the host              │
    librbln-*.so ────────►│  2. Generate    CDI spec (rbln.yaml)     │
  /usr/bin/               │       ↓                                  │
    rbln-smi ────────────►│  3. Configure   container runtime        │
                          │       ↓         (containerd/crio/docker) │
                          │  4. Run Hook    to update ldcache        │
                          │                 inside containers        │
                          └─────────────────────┬────────────────────┘
                                                │
                                                ▼
                          ┌──────────────────────────────────────────┐
  Container               │  $ docker run --device rebellions.ai/    │
                          │      npu=all my-app                      │
                          │                                          │
                          │  ✓ RBLN libraries mounted                │
                          │  ✓ Tools available (rbln-smi)            │
                          │  ✓ ldcache updated automatically         │
                          └──────────────────────────────────────────┘

툴킷은 세 가지 바이너리를 제공합니다:

바이너리 역할
rbln-ctk 메인 CLI — CDI 스펙 생성, 런타임 구성, 시스템 검사
rbln-ctk-daemon Kubernetes 데몬 — 헬스 엔드포인트 및 정상 종료(graceful shutdown)를 통한 자동 설정
rbln-cdi-hook OCI 훅 — 컨테이너 내부에서 실행되어 ldcache 업데이트 및 심볼릭 링크 생성

툴킷은 런타임 프로파일이 서로 다른 두 가지 배포 형태로 제공되며, 각 형태는 서로 다른 배포 시나리오를 위해 설계되었습니다:

배포 형태 대상 디바이스 주입 새로 고침 경로
DEB / RPM 패키지 독립 실행형 Docker 호스트 rbln-ctk 가 CDI 를 통해 /dev/rbln* 와 대응되는 /dev/rsd* 그룹 노드를 주입합니다. NPU↔RSD 매핑은 librbln-ml 로 해석되며, 패키지가 이를 런타임 의존성으로 함께 설치합니다. 호스트의 rbln-cdi-refresh.path systemd 유닛(postinstall 에서 자동 활성화). Systemd 통합 참조
컨테이너 이미지 Kubernetes DaemonSet rbln-ctk-daemon 은 NPU 디바이스 노드를 생성하지 않습니다. Pod 별 /dev/rbln* 할당은 디바이스 플러그인(또는 DRA)이 담당합니다. 이 모드에서는 NPU↔RSD 리졸버가 호출되지 않으므로 이미지에 librbln-ml 의존성이 포함되지 않습니다. RDS 클래스는 이 게이트와 무관하게 생성됩니다 — RDS 장치 주입 참조 rbln-ctk-daemon 내부 루프. 자동 CDI 새로 고침 참조

사전 요구사항

OS 아키텍처 컨테이너 런타임
Ubuntu 22.04/24.04 x86_64 containerd, CRI-O, Docker
RHEL 9.6/9.8 x86_64 containerd, CRI-O, Docker

런타임별 최소 버전과 CDI 활성화 방식은 다음과 같습니다:

런타임 최소 버전 CDI 활성화
containerd 1.7 2.0 이상은 기본 활성. 그 이전 버전은 rbln-ctk runtime configure 가 enable_cdi 와 cdi_spec_dirs 를 설정합니다.
CRI-O 1.23.2 항상 활성. enable_cdi 토글이 없고 cdi_spec_dirs 로만 제어하며, 기본값이 이미 /var/run/cdi 를 포함합니다.
Docker 25.0.0 28.2.0 이상은 기본 활성. 25.0.0~28.1.x 는 daemon.json 의 features.cdi 키가 필요하며 rbln-ctk runtime configure 가 이를 설정합니다.

위 최소 버전은 CDI 주입이 가능해지는 버전이며, 검증 버전이 아닙니다. RCNS 릴리스별로 검증된 containerd·CRI-O 버전은 Support Matrix 의 RBLN Cloud Native Stack(RCNS) 표에서 확인할 수 있습니다.

  • RBLN 드라이버 — 컨테이너 툴킷보다 먼저 호스트에 설치해야 합니다. 툴킷의 DEB·RPM 패키지는 드라이버의 UMD 라이브러리(Debian/Ubuntu 에서는 librbln-ml3, RHEL 계열에서는 librbln-ml)를 하드 런타임 의존성으로 선언하므로, 드라이버 없이 툴킷을 설치하면 apt-get 또는 dnf 에서 의존성 미해결 오류로 실패합니다.

설치

Ubuntu / Debian

  1. Rebellions 공식 GPG 키 추가(이미 구성된 경우 건너뛰기):

    1
    2
    3
    4
    5
    $ sudo apt-get update
    $ sudo apt-get install ca-certificates curl
    $ sudo install -m 0755 -d /etc/apt/keyrings
    $ sudo curl -fsSL https://nexus.rebellions.ai/repository/raw-public/rebellions.asc -o /etc/apt/keyrings/rebellions.asc
    $ sudo chmod a+r /etc/apt/keyrings/rebellions.asc
    
  2. APT 소스에 저장소 추가(이미 구성된 경우 건너뛰기):

    1
    2
    3
    $ echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/rebellions.asc] https://nexus.rebellions.ai/repository/apt-public/ stable main" | \
      sudo tee /etc/apt/sources.list.d/rebellions-apt-public.list > /dev/null
    
  3. APT 업데이트 및 설치:

    $ sudo apt-get update
    $ sudo apt-get install rbln-container-toolkit
    

RHEL

  1. Rebellions yum 저장소 등록(이미 구성된 경우 건너뛰기):

    1
    2
    3
    4
    5
    6
    7
    $ sudo tee /etc/yum.repos.d/rebellions.repo > /dev/null <<EOF
    [rebellions-stable]
    name=Rebellions Stable
    baseurl=https://nexus.rebellions.ai/repository/yum-public/stable/x86_64/Packages/
    enabled=1
    gpgcheck=0
    EOF
    
  2. 캐시 갱신 후 설치:

    $ sudo dnf clean all
    $ sudo dnf install -y rbln-container-toolkit
    

Unsigned RPM packages

현재 배포 중인 RPM 패키지에는 아직 서명이 적용되지 않아 설치를 위해 gpgcheck=0 으로 설정합니다. 서명된 패키지가 제공되면 항목을 gpgcheck=1 로 되돌리는 것을 권장합니다.

빠른 시작

컨테이너에서 NPU에 액세스하는 가장 빠른 방법:

# 1. CDI 스펙 생성 (호스트에서 RBLN 라이브러리 검색)
$ sudo rbln-ctk cdi generate

# 2. CDI 지원을 위한 컨테이너 런타임 구성
$ sudo rbln-ctk runtime configure -r docker -y

# 3. 새 구성이 적용되도록 런타임 재시작
$ sudo systemctl restart docker

# 4. NPU 에 액세스할 수 있는 컨테이너 실행 (모든 NPU)
$ docker run --device rebellions.ai/npu=all -it ubuntu:22.04

rbln-ctk runtime configure 는 구성 파일을 수정하기 전에 확인을 묻습니다. -y 가 그 확인에 답하며, 위 블록을 통째로 붙여넣어도 3단계가 프롬프트에 먹히지 않는 이유입니다. 이 명령은 런타임 구성 파일만 수정하고 런타임을 재시작하지 않으므로, 첫 docker run 전에 3단계가 필요합니다. Docker 28.2.0 이상은 CDI 가 기본 활성이라 2·3단계를 건너뛸 수 있습니다. 호스트 NPU 중 일부만 컨테이너에 노출하는 방법은 장치 선택에서 확인할 수 있습니다.

런타임이 여러 개인 호스트에서는 -r 로 지정

rbln-ctk runtime configure 는 런타임 소켓을 검사해 대상을 정하며, 두 개 이상이 감지되면 임의로 고르지 않고 다음 오류로 중단합니다:

Error: detect runtime: multiple runtimes detected: [containerd, docker]. Use --runtime flag to specify which one to use (specify --runtime manually)

Docker 호스트는 Docker 에 내장된 containerd 도 소켓을 노출하므로 대부분 이 경우에 해당합니다. sudo rbln-ctk runtime configure -r docker 처럼 대상을 명시해야 합니다.

설정 확인

1
2
3
4
5
6
7
8
# 검색된 항목 확인
$ rbln-ctk cdi list

# 시스템 정보 보기
$ rbln-ctk info

# 컨테이너 내부에서 NPU 도구 사용
$ docker run --device rebellions.ai/npu=all -it ubuntu:22.04 rbln-smi

적용 전 미리보기

쓰기를 수행하는 두 서브커맨드 cdi generate 와 runtime configure 는 --dry-run 을 지원하여 실제로 수정하지 않고 변경될 내용을 확인할 수 있습니다. runtime configure 는 미리보기 전에 대상 런타임을 먼저 확정하므로, 런타임이 여러 개인 호스트에서는 여기서도 -r 이 필요합니다:

$ rbln-ctk cdi generate --dry-run
$ sudo rbln-ctk runtime configure -r docker --dry-run

장치 선택

CDI 사양은 세 가지 형태의 장치 핸들을 제공합니다. 워크로드 범위에 맞는 것을 선택합니다:

핸들 노출 범위
rebellions.ai/npu=all 호스트의 모든 NPU 및 모든 RSD 그룹(권장). 각 노드는 호스트 경로 그대로 노출됩니다.
rebellions.ai/npu=N 인덱스로 지정한 단일 NPU(0, 1, ...). 해당 NPU가 속한 RSD 그룹은 자동으로 함께 첨부되며, 호스트 인덱스와 무관하게 컨테이너 안에서는 /dev/rsd0 으로 보입니다.
rebellions.ai/npu=rsdN 인덱스로 지정한 단일 RSD 그룹(rsd0, rsd1, ...). 컨테이너 안에서는 /dev/rsd0 으로 노출됩니다. 자동 NPU↔RSD 매핑을 우회해 그룹을 직접 선택합니다(디버깅 및 사용자 정의 그룹 워크플로).

=N 핸들에 인덱스를 지정해 단일 NPU를 선택합니다:

1
2
3
$ docker run \
  --device rebellions.ai/npu=N \
  -it IMAGE_NAME:TAG

--device 를 반복해 여러 NPU를 부착합니다. 선택한 NPU들이 같은 RSD 그룹에 속하면, 컨테이너에서 텐서 병렬 워크로드를 실행할 수 있습니다:

1
2
3
4
$ docker run \
  --device rebellions.ai/npu=0 \
  --device rebellions.ai/npu=1 \
  -it IMAGE_NAME:TAG

RSD 그룹 0 밖의 NPU 도 추가 플래그가 필요 없습니다. rbln-smi group -c 1 -a 4,5,6,7 이후 이 그룹의 호스트 노드 /dev/rsd1 은 컨테이너 안에서 UMD 가 여는 유일한 경로인 /dev/rsd0 으로 노출됩니다:

1
2
3
4
5
6
$ docker run \
  --device rebellions.ai/npu=4 \
  --device rebellions.ai/npu=5 \
  --device rebellions.ai/npu=6 \
  --device rebellions.ai/npu=7 \
  -it IMAGE_NAME:TAG

컨테이너 하나에 RSD 그룹 하나

모든 =N 과 =rsdN 핸들이 그룹 장치를 /dev/rsd0 으로 바꿔 노출하므로, 한 컨테이너에는 하나의 RSD 그룹에 속한 NPU 만 담을 수 있습니다. 두 그룹의 NPU 를 함께 선택하면(예: 위 재구성 뒤 npu=0 과 npu=4) 두 핸들이 모두 /dev/rsd0 을 요구하므로 컨테이너는 두 그룹을 함께 볼 수 없으며, 어느 노드가 남는지는 툴킷이 정하지 않고 OCI 런타임 구현에 달려 있습니다. 그룹당 컨테이너를 하나씩 실행하거나, 모든 노드를 호스트 경로 그대로 유지하는 =all 을 사용해야 합니다.

v0.2.4 이하에서 업그레이드하는 경우

v0.2.5 이전 툴킷은 =N 에서도 호스트 경로를 유지했기 때문에 그룹 0 밖의 NPU 에는 --device /dev/rsdM:/dev/rsd0 을 직접 지정해야 했습니다. 이 우회 방법은 더 이상 필요하지 않으며 제거해도 됩니다.

Kubernetes 런타임(containerd / CRI-O)에서는 =all 핸들만 공개되며, 이 핸들은 라이브러리 마운트와 rbln-smi 도구 바인드만 포함하고 디바이스 노드는 첨부하지 않습니다. Pod 별 /dev/rbln* 할당은 디바이스 플러그인 또는 DRA 드라이버가 담당합니다. NPU 별 핸들은 독립 실행형 Docker 호스트에서 사용합니다.

Regenerate the CDI spec after RSD topology changes

rbln-ctk cdi generate 는 실행 시점에 호스트에 존재하는 /dev/rsd* 노드를 바탕으로 =N 핸들을 CDI 사양에 기록합니다. 자동 새로 고침 경로 (Systemd 통합, 자동 CDI 새로 고침) 는 드라이버 또는 툴킷 라이브러리 변경 시에만 동작합니다. rbln-smi group -c, -a, -d 로 RSD 그룹을 재구성한 뒤에는 sudo rbln-ctk cdi generate 를 다시 실행하거나 다음 드라이버 새로 고침을 기다려야 컨테이너 런타임이 새 =N 핸들을 정상적으로 해석합니다. =all 핸들은 RSD 그룹 변경과 무관하게 동작합니다.

npu=runtime 호환성

v0.1.x 의 rebellions.ai/npu=runtime 은 =all 의 alias 로 유지되며 내용이 동일합니다. v0.2 로 업그레이드해도 기존 매니페스트와 디바이스 플러그인 빌드를 재작성할 필요가 없습니다. 새 매니페스트에는 =all 또는 장치 단위 셀렉터 사용을 권장하며, 이 alias 는 향후 릴리스에서 제거될 수 있습니다.

RDS 장치 주입

Rebel100™ 전용

RDS는 Rebel100™에서만 지원합니다. RDS 장치는 Rebel100™ 드라이버 v3.5 이상이 설치된 호스트에만 존재합니다.

RDS(Rebellions Direct Storage)는 RBLN NPU 가 NVMe SSD 에 직접 읽고 쓰는 데이터 경로입니다. RDS 장치 /dev/rblnfs* 는 NPU 클래스와 별개인 rebellions.ai/rds 클래스로 주입됩니다. RSD 그룹과는 무관한 기능입니다.

이 클래스는 자체 스펙 파일 /var/run/cdi/rbln-rds.yaml 에 기록되고 rebellions.ai/npu=all 선택에는 포함되지 않습니다. RDS 장치를 명시적으로 참조한 컨테이너에만 주입되므로, 디바이스 플러그인의 NPU 할당과 충돌하지 않습니다.

핸들 노출 범위
rebellions.ai/rds=all 호스트의 모든 /dev/rblnfs* 장치
rebellions.ai/rds=rblnfsN 이름으로 지정한 단일 RDS 장치(rblnfs0, rblnfs1, ...)

Docker 에서는 NPU 핸들과 함께 --device 로 지정합니다:

1
2
3
4
$ docker run \
  --device rebellions.ai/npu=all \
  --device rebellions.ai/rds=all \
  -it IMAGE_NAME:TAG

CDI 가 활성화된 Kubernetes 런타임(containerd 1.7 이상, CRI-O)에서는 Pod 어노테이션으로 지정합니다:

1
2
3
metadata:
  annotations:
    cdi.k8s.io/rblnfs: rebellions.ai/rds=rblnfs0

RDS 스펙은 Kubernetes 디바이스 노드 게이트와 무관하게 생성되므로 DaemonSet 배포에서도 동일하게 동작합니다. /dev/rblnfs* 가 없는 호스트에서는 이전 실행이 남긴 스펙 파일을 제거하므로, RDS 장치가 없는 노드에는 빈 클래스를 광고하지 않습니다.

스펙 경로는 rbln-ctk cdi generate --rds-output 으로 바꿀 수 있습니다. 어느 경로를 지정하든 컨테이너 런타임이 스캔하는 CDI 스펙 디렉터리 안에 있어야 합니다.

CLI 레퍼런스

전역 옵션

모든 rbln-ctk 하위 명령에 공통으로 적용됩니다.

플래그 설명 기본값
-c, --config 구성 파일 경로 (RBLN_CTK_CONFIG → /etc/rbln/container-toolkit.yaml → .yml 순으로 탐색)
-d, --debug 디버그 로깅 활성화 false
-q, --quiet 오류 외 출력 억제 false

rbln-ctk cdi generate

RBLN 라이브러리와 도구를 검색한 다음 CDI 스펙을 작성합니다.

$ sudo rbln-ctk cdi generate
플래그 설명 기본값
-o, --output NPU 스펙 출력 경로(- 지정 시 stdout) /var/run/cdi/rbln.yaml
--rds-output RDS 스펙 출력 경로. -o - 또는 --dry-run 과 함께 쓰면 무시되며 RDS 스펙은 NPU 스펙 뒤에 stdout 으로 출력됩니다 /var/run/cdi/rbln-rds.yaml
-f, --format 출력 형식(yaml 또는 json) yaml
--driver-root 드라이버 파일의 루트 경로(CoreOS: /host) /
--container-library-path 컨테이너 내 격리된 라이브러리 경로 (호스트와 동일)
--dry-run 작성하지 않고 미리보기 false

rbln-ctk runtime configure

컨테이너 런타임 구성에서 CDI 지원을 활성화합니다. 런타임 소켓이 하나만 있을 때는 런타임을 자동으로 선택하며, 그 외에는 -r 지정이 필요합니다.

$ sudo rbln-ctk runtime configure
플래그 설명 기본값
-r, --runtime 특정 런타임 강제 지정(containerd, crio, docker) (자동 감지)
--config-path 사용자 정의 런타임 구성 경로 (런타임 기본값)
--cdi CDI 지원 활성화 true
-y, --yes 확인 프롬프트 건너뛰기 false
--dry-run 변경 사항 미리보기 false

containerd 구성 파일은 재작성됩니다

containerd 를 대상으로 실행하면 config.toml 을 TOML 파서로 읽고 다시 씁니다. 모든 값은 보존되지만 주석과 키 순서는 유지되지 않습니다. config.toml 이 유효한 TOML 이 아니면 파일을 수정하지 않고 오류로 중단합니다. CRI-O(드롭인 파일)와 Docker(daemon.json)는 해당되지 않습니다.

rbln-ctk cdi list

검색된 RBLN 라이브러리와 도구를 나열합니다.

$ rbln-ctk cdi list
플래그 설명 기본값
-f, --format 출력 형식(table, json, yaml) table
--driver-root 드라이버 파일의 루트 경로 /

rbln-ctk info

감지된 런타임 및 구성을 포함한 시스템 정보를 표시합니다.

$ rbln-ctk info
플래그 설명 기본값
-f, --format 출력 형식(table, json, yaml) table

rbln-ctk version

툴킷 버전과 빌드 정보를 출력합니다.

$ rbln-ctk version

rbln-ctk-daemon runtime

DaemonSet 이 남긴 런타임 구성과 CDI 스펙 파일을 수동으로 적용하거나 되돌리는 일회성 명령입니다. 런타임별 하위 명령(docker, containerd, crio) 아래에 setup 과 cleanup 이 있습니다.

setup 은 세 단계를 순서대로 수행합니다. 런타임 구성에서 CDI 를 활성화하고(containerd 의 config.toml 과 Docker 의 daemon.json 은 먼저 .backup 파일로 복사, CRI-O 는 99-rbln.conf 드롭인 생성), CDI 스펙 디렉터리에 rbln.yaml 을 기록한 뒤(RDS 장치가 있는 호스트에서는 rbln-rds.yaml 도 함께), 런타임을 재시작합니다. 재시작은 기본적으로 containerd 와 Docker 에 SIGHUP 을 보내고, CRI-O 는 systemctl restart 로 수행합니다. DaemonSet 과 달리 CDI 가 이미 활성화되어 있는지 먼저 확인하지 않으므로, 실행할 때마다 구성을 다시 쓰고 런타임을 재시작합니다.

# 런타임 구성에 CDI 활성화, CDI 스펙 생성, 런타임 재시작
$ sudo rbln-ctk-daemon runtime containerd setup

cleanup 은 세 단계를 순서대로 수행합니다. CDI 스펙 디렉터리에서 rbln.yaml 과 rbln-rds.yaml 을 제거하고, 런타임 구성을 되돌린 뒤(containerd 와 Docker 는 .backup 파일에서 복원, CRI-O 는 99-rbln.conf 드롭인 삭제), 런타임을 재시작합니다.

# CDI 스펙 제거, 런타임 구성 원복, 런타임 재시작
$ sudo rbln-ctk-daemon runtime containerd cleanup

cleanup 실행 전 DaemonSet 삭제

cleanup 은 실행 중인 데몬이 /run/rbln 호스트 마운트를 통해 잡고 있는 것과 같은 PID 파일에 잠금을 걸기 때문에, DaemonSet 이 해당 노드에 아직 스케줄되어 있으면 another instance is already running 으로 실패합니다. rbln-ctk-daemon 바이너리는 DEB·RPM 패키지로만 호스트에 설치됩니다. 컨테이너 이미지로만 툴킷을 받은 노드에서는 호스트 루트를 마운트한 상태로 해당 이미지에서 같은 하위 명령을 실행하고 --host-root-mount /host 를 지정해야 합니다. 메인 데몬과 달리 runtime 하위 명령은 /host 를 자동 감지하지 않습니다.

플래그 설명 기본값
--restart-mode 런타임 재시작 방식(signal, systemd, none) (런타임 기본값)
--host-root-mount 컨테이너 배포 시 호스트 루트 마운트 경로 (비어 있음)
--socket 런타임 소켓 경로 (런타임 기본값)
--cdi-spec-dir CDI 스펙 출력 디렉터리 /var/run/cdi
--config-path 런타임 구성 경로 재정의 (런타임 기본값)
--pid-file 잠금에 사용할 PID 파일 경로 /run/rbln/toolkit.pid
--dry-run 변경 사항 미리보기 false

Kubernetes 배포

Kubernetes 클러스터의 경우 툴킷을 DaemonSet으로 배포합니다. 데몬(rbln-ctk-daemon)은 다음을 수행합니다:

  1. 시작 시 CDI 스펙 생성 — 런타임은 컨테이너 생성 시점에 스펙 디렉터리를 다시 읽으므로 재시작이 필요 없습니다
  2. CDI 가 아직 활성화되지 않은 노드에서만 런타임 구성 및 재시작
  3. 헬스 체크 엔드포인트 제공
  4. SIGTERM 시 자신이 작성한 CDI 스펙 파일 제거(Pod 종료)

종료 시 런타임 구성은 복원되지 않습니다

데몬은 SIGTERM 을 받아도 런타임 구성을 백업본으로 되돌리지 않습니다 — 되돌리는 작업 자체가 런타임 재시작을 유발하기 때문입니다. 따라서 DaemonSet 을 제거해도 런타임 구성은 배포 이전 상태로 돌아가지 않습니다. 명시적으로 복원하려면 DaemonSet 을 먼저 삭제한 뒤 rbln-ctk-daemon runtime 의 cleanup 을 실행해야 합니다.

컨테이너 이미지

공식 컨테이너 이미지는 Docker Hub에서 제공됩니다:

$ docker pull rebellions/rbln-container-toolkit:latest

배포

$ kubectl apply -f deployments/kubernetes/daemonset.yaml

헬스 엔드포인트

엔드포인트 프로브 유형 200 반환 조건
/live Liveness 데몬 프로세스가 실행 중일 때
/ready Readiness 설정이 완료되었을 때
/startup Startup 초기화가 완료되었을 때

환경 변수

변수 설명 기본값
RBLN_CTK_DAEMON_RUNTIME 컨테이너 런타임 (자동 감지)
RBLN_CTK_DAEMON_HOST_ROOT 호스트 루트 마운트 경로 /(호스트), /host(컨테이너)
RBLN_CTK_DAEMON_DRIVER_ROOT CDI 스펙을 위한 드라이버 루트 경로 /
RBLN_CTK_DAEMON_CDI_SPEC_DIR CDI 스펙 디렉토리 /var/run/cdi
RBLN_CTK_DAEMON_CONFIG_PATH 런타임 구성 파일 경로 재정의 (런타임 기본값)
RBLN_CTK_DAEMON_CONTAINER_LIBRARY_PATH 격리를 위한 컨테이너 라이브러리 경로 (비어 있음)
RBLN_CTK_DAEMON_SOCKET 런타임 소켓 경로 (자동 감지)
RBLN_CTK_DAEMON_HEALTH_PORT 헬스 체크 포트 8080
RBLN_CTK_DAEMON_SHUTDOWN_TIMEOUT 정상 종료(graceful shutdown) 타임아웃 30s
RBLN_CTK_DAEMON_PID_FILE PID 파일 경로 /run/rbln/toolkit.pid
RBLN_CTK_DAEMON_NO_CLEANUP_ON_EXIT 종료 시 정리 건너뛰기 false
RBLN_CTK_DAEMON_REFRESH_INTERVAL rbln-ctk-daemon 내부 CDI 사양 새로 고침 주기(0 으로 설정 시 비활성화). DaemonSet 전용이며, DEB/RPM CLI 경로에서는 systemd 유닛이 동일 역할을 수행합니다. 자동 CDI 새로 고침 참조 60s
RBLN_CTK_DAEMON_DEBUG 디버그 로깅 활성화 false
RBLN_CTK_DAEMON_FORCE 시작 전 기존 인스턴스 종료 false

RBLN_CTK_DAEMON_CONFIG_PATH 는 절대 경로여야 하며, 그렇지 않으면 데몬이 시작을 거부합니다. 데몬 파일시스템 기준의 최종 경로로 해석되며 RBLN_CTK_DAEMON_HOST_ROOT 가 자동으로 붙지 않습니다. rke2·k3s 처럼 호스트 기준 경로를 넘길 때는 호출자가 접두사를 직접 포함해야 합니다(예: /var/lib/rancher/rke2/... → /host/var/lib/rancher/rke2/...).

자동 CDI 새로 고침

rbln-ctk-daemon(Kubernetes DaemonSet 바이너리)이 이 새로 고침 루프를 수행합니다. DEB/RPM 설치 환경에서는 Systemd 통합에 설명한 systemd 유닛이 동일한 역할을 합니다.

데몬은 호스트 RBLN UMD 라이브러리(librbln-ccl, librbln-thunk)의 GNU build-id 를 주기적으로 확인하여, 지문 변경을 감지하면 /var/run/cdi/rbln.yaml 을 다시 생성합니다. build-id 를 읽을 수 없는 라이브러리는 크기와 수정 시각으로 대체 지문을 계산합니다. 데몬이 라이브러리 변경을 자동으로 반영하므로 운영자는 DaemonSet 을 그대로 둔 채 드라이버 재설치나 업그레이드를 적용할 수 있습니다. 컨테이너 런타임은 새로 시작하는 컨테이너에 현재 라이브러리를 즉시 마운트합니다.

새로 고침 주기는 RBLN_CTK_DAEMON_REFRESH_INTERVAL 환경 변수 또는 --refresh-interval 플래그로 제어합니다. 기본값은 60s 이며 0 으로 설정하면 새로 고침이 비활성화됩니다. 데몬은 임시 파일에 사양을 작성한 뒤 fsync + rename 순서로 교체하므로 컨테이너 런타임은 항상 완전한 사양을 읽습니다.

데몬은 /ready 엔드포인트의 cdi-refresh 블록으로 마지막 실행 시각, 검색된 라이브러리 수, 직전 새로 고침 오류를 보고합니다.

Kubernetes Pod 예제

apiVersion: v1
kind: Pod
metadata:
  name: rbln-workload
spec:
  containers:
  - name: app
    image: ubuntu:22.04
    resources:
      limits:
        rebellions.ai/npu: "1"

CoreOS / OpenShift

호스트 파일시스템이 /host에 마운트된 Red Hat CoreOS 환경의 경우:

1
2
3
env:
  - name: RBLN_CTK_DAEMON_HOST_ROOT
    value: "/host"

고급 설정

라이브러리 격리

기본적으로 RBLN 라이브러리는 컨테이너 내부의 호스트 경로에 바인드 마운트됩니다. 이로 인해 충돌이 발생하는 경우(예: 다른 glibc 버전), 라이브러리 격리를 사용합니다:

$ sudo rbln-ctk cdi generate --container-library-path /rbln/lib64

이 모드는:

  • 호스트 경로 대신 격리된 경로(/rbln/lib64)에 라이브러리를 마운트합니다
  • CDI 훅을 사용하여 시작 시 컨테이너 내부에서 ldconfig 를 실행합니다
  • LD_LIBRARY_PATH 를 사용하지 않습니다 — ldcache 가 라이브러리 검색을 기본적으로 처리합니다
  • LD_LIBRARY_PATH 를 무시하는 setuid 바이너리도 지원합니다

Systemd 통합

DEB·RPM 패키지는 두 개의 systemd 유닛을 /usr/lib/systemd/system/ 아래에 설치하며, postinstall 스크립트가 자동으로 활성화합니다:

  • rbln-cdi-refresh.path — 표준 라이브러리 경로의 librbln-ml.so 와 rbln-ctk 바이너리 변경을 감시합니다
  • rbln-cdi-refresh.service — rbln-ctk cdi generate --output /var/run/cdi/rbln.yaml 을 실행하는 oneshot 유닛입니다

드라이버 재설치 또는 툴킷 업그레이드가 path 유닛을 트리거하고, 이로 인해 service 유닛이 실행되어 호스트의 CDI 사양을 다시 작성합니다. 운영자의 추가 조치 없이 새로 시작되는 컨테이너는 현재 라이브러리에 바인딩됩니다.

path 워처가 활성 상태인지 확인:

$ systemctl status rbln-cdi-refresh.path

자체 워크플로로 CDI 재생성을 관리하는 등 새로 고침이 필요 없는 경우 비활성화할 수 있습니다:

$ sudo systemctl disable --now rbln-cdi-refresh.path

이 systemd 경로는 DEB/RPM 설치에만 해당합니다. Kubernetes 에서는 동일한 역할이 rbln-ctk-daemon 내부에서 수행됩니다 — 자동 CDI 새로 고침 참조.

구성 파일

툴킷은 /etc/rbln/container-toolkit.yaml에서 구성을 읽습니다.

모든 CLI 플래그는 RBLN_CTK_ 접두사를 사용하는 환경 변수를 통해서도 설정할 수 있습니다(예: --driver-root는 RBLN_CTK_DRIVER_ROOT가 됨).

주요 구성 섹션:

섹션 제어 항목
cdi 출력 경로, 형식, 벤더/클래스 이름
rds RDS 클래스 이름, 스펙 출력 경로, /dev/rblnfs* 검색 패턴
libraries 검색 패턴, 플러그인 경로, 컨테이너 격리 경로
tools 포함할 CLI 도구(예: rbln-smi)
devices NPU/RSD 디바이스 노드 검색 패턴과 disabled 스위치. rbln-ctk-daemon 은 containerd 와 CRI-O 에서 disabled 를 스스로 켜므로 Kubernetes 에서는 별도 수정이 필요 없습니다
search-paths 라이브러리 및 바이너리를 찾을 위치
glibc-exclude CDI 스펙에서 제외할 시스템 라이브러리
selinux 바인드 마운트에 적용할 SELinux 레이블(RHEL·CoreOS 에서 활성화)
hooks CDI 훅 바이너리 및 ldconfig 경로

문제 해결

CDI 스펙이 생성되지 않음

1
2
3
4
5
6
7
8
# RBLN 드라이버가 설치되었는지 확인
$ ls /usr/lib64/librbln-*.so*

# 디버그 출력과 함께 실행
$ rbln-ctk cdi generate --debug

# 검색된 항목 확인
$ rbln-ctk cdi list

컨테이너가 RBLN 라이브러리를 찾을 수 없음

1
2
3
4
5
# 훅이 설치되었는지 확인
$ ls -la /usr/local/bin/rbln-cdi-hook

# CDI 스펙 재생성
$ sudo rbln-ctk cdi generate

런타임이 변경 사항을 인식하지 못함

구성 후 런타임이 CDI 장치를 인식하지 못하는 경우 수동으로 재시작합니다:

$ sudo systemctl restart containerd  # 또는 crio, docker

권한 오류

대부분의 작업에는 루트 액세스가 필요합니다:

$ sudo rbln-ctk cdi generate
$ sudo rbln-ctk runtime configure

다음 단계

  • NPU 할당 — RSD 그룹을 사용하여 컨테이너에 특정 NPU를 할당하는 방법 알아보기