Skip to content

Installing the RBLN NPU Operator on OpenShift

Install the NPU Operator through OLM and create RBLNClusterPolicy and RBLNDriver resources. This example uses Device Plugin. For workloads, follow the NPU Pod tutorial.

Prerequisites

Verify RBLN NPU detection

Rebellions NPUs use PCI vendor ID 1eff. Query both label formats because NFD configuration determines whether the PCI class is included.

oc get nodes -l feature.node.kubernetes.io/pci-1eff.present=true
oc get nodes -l feature.node.kubernetes.io/pci-1200_1eff.present=true

Detection is working if either command lists a worker node equipped with an NPU. If no nodes are listed, check that NFD is working correctly and that the host detects the NPU.

Configuring kernel boot parameters

Apply the kernel parameters for the target hardware through MachineConfig.

Creating an image pull secret

Create the rbln-system namespace and store your RBLN Portal account credentials in the drivercred image pull secret. The driver and RSMD use this secret.

1
2
3
4
5
6
7
8
9
oc create namespace rbln-system --dry-run=client -o yaml | oc apply -f -
export REGISTRY_USER='<RBLN_PORTAL_USERNAME>'
export REGISTRY_PASSWORD='<RBLN_PORTAL_PASSWORD>'
oc create secret docker-registry drivercred \
  --docker-server=repo.rebellions.ai \
  --docker-username="$REGISTRY_USER" \
  --docker-password="$REGISTRY_PASSWORD" \
  -n rbln-system
unset REGISTRY_PASSWORD

Installing the RBLN NPU Operator

Use either the web console or CLI to install through OLM. Follow one installation method.

Installing via the web console

  1. Navigate to Operators > OperatorHub in the OpenShift web console.
  2. Select All Projects.
  3. Search for RBLN Operator > RBLN NPU Operator.
  4. On the Install Operator page, configure the following options:
    • Update channel: stable
    • Version: The release to install. Check the catalog and support matrix.
    • Installed Namespace: rbln-system (recommended)
  5. Click Install.

RBLN NPU Operator Install Page

After installing through the web console, continue with the Operator readiness checks.

Installing via the CLI

Look up the channel and CSV in the cluster catalog. The Automatic setting also approves future OLM updates in that channel.

1
2
3
4
5
CHANNEL=$(oc get packagemanifest rbln-npu-operator -n openshift-marketplace \
  -o jsonpath='{.status.defaultChannel}')
STARTING_CSV=$(oc get packagemanifest rbln-npu-operator -n openshift-marketplace -o json | \
  jq -r --arg channel "$CHANNEL" '.status.channels[] | select(.name == $channel) | .currentCSV')
printf 'Channel: %s\nCSV: %s\n' "$CHANNEL" "$STARTING_CSV"

Both values must be present before you apply the Subscription. If either is missing, check the package manifest and catalog.

oc apply -f - <<EOF
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: rbln-npu-operator-group
  namespace: rbln-system
spec:
  targetNamespaces:
  - rbln-system
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: rbln-npu-operator
  namespace: rbln-system
spec:
  channel: $CHANNEL
  name: rbln-npu-operator
  installPlanApproval: Automatic
  source: certified-operators
  sourceNamespace: openshift-marketplace
  startingCSV: $STARTING_CSV
EOF

Check Operator readiness

After installation, list the Subscriptions. The CLI example uses rbln-npu-operator. If the web console created a different name, set SUBSCRIPTION to that name.

1
2
3
4
5
6
7
8
9
oc get subscriptions -n rbln-system
export SUBSCRIPTION=rbln-npu-operator
oc get installplan -n rbln-system
oc wait -n rbln-system --for=jsonpath='{.status.installedCSV}' \
  "subscription/$SUBSCRIPTION" --timeout=600s
CSV=$(oc get subscription "$SUBSCRIPTION" -n rbln-system \
  -o jsonpath='{.status.installedCSV}')
oc wait -n rbln-system --for=jsonpath='{.status.phase}'=Succeeded \
  "csv/$CSV" --timeout=600s
$ oc get csv "$CSV" -n rbln-system -o jsonpath='{.status.phase}{"\n"}'
Succeeded

Continue only when the CSV reaches Succeeded. If installation fails, run oc describe subscription "$SUBSCRIPTION" -n rbln-system and inspect the InstallPlan.

The following steps read API fields and images for the current Operator version from its CSV. Follow the same steps after a web console installation.

Create the RBLNClusterPolicy Instance

RBLNClusterPolicy defines the node components and their images. Read the example RBLNClusterPolicy instance from the CSV and configure it to use the Device Plugin. Keep the API version and component images from that CSV.

1
2
3
4
5
6
7
8
oc get csv "$CSV" -n rbln-system \
  -o jsonpath='{.metadata.annotations.alm-examples}' > alm-examples.json
jq -e 'map(select(.kind == "RBLNClusterPolicy"))[0] // error("No policy example")' \
  alm-examples.json > clusterpolicy.json
jq '.spec.workloadType = "container"
    | .spec.devicePlugin.enabled = true
    | .spec.draKubeletPlugin.enabled = false' \
  clusterpolicy.json > clusterpolicy-configured.json

Create the RBLNClusterPolicy instance.

oc apply -f clusterpolicy-configured.json

Create the RBLNDriver Instance

RBLNDriver deploys the driver on eligible nodes. Extract its example and inspect the image and credential fields.

1
2
3
jq -e 'map(select(.kind == "RBLNDriver"))[0] // error("No driver example")' \
  alm-examples.json > driver.json
jq '.spec | {registry, image, version, imagePullSecrets, smd}' driver.json

Check the driver fields before applying:

Field in driver.json Check
spec.registry, spec.image, spec.version The image specified by these fields must exist and support the worker's NPU family, OS and kernel. See driver image selection.
spec.imagePullSecrets Includes drivercred, created during preparation.
spec.smd.registry, spec.smd.image The RSMD repository must be accessible. The image uses the same version tag as the driver.

Create the RBLNDriver instance.

oc apply -f driver.json

Verify Installation

After OLM installation completes, wait for the RBLNDriver and RBLNClusterPolicy instances to become ready. The examples show healthy states; names and node counts vary by environment.

1
2
3
4
5
6
POLICY=$(jq -r '.metadata.name' clusterpolicy-configured.json)
DRIVER=$(jq -r '.metadata.name' driver.json)
oc wait --for=jsonpath='{.status.state}'=ready "rblndriver/$DRIVER" --timeout=600s
oc wait --for=jsonpath='{.status.state}'=ready "rblnclusterpolicy/$POLICY" --timeout=600s
oc get rblnclusterpolicies,rblndrivers
oc get pods -n rbln-system
$ oc get rblnclusterpolicy "$POLICY" \
  -o 'custom-columns=NAME:.metadata.name,STATE:.status.state'
NAME                  STATE
rbln-cluster-policy   ready

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

Confirm both conditions:

  • The RBLNClusterPolicy instance reports ready.
  • The RBLNDriver instance reports ready.
$ oc get nodes -l rebellions.ai/npu.present=true \
  -o 'custom-columns=NAME:.metadata.name,FAMILY:.metadata.labels.rebellions\.ai/npu\.family,PRODUCT:.metadata.labels.rebellions\.ai/npu\.product,ALLOCATABLE:.status.allocatable.rebellions\.ai/npu'
NAME            FAMILY     PRODUCT     ALLOCATABLE
node-rebel100   rebel100   RBLN-CR13   1
$ oc get nodes -l rebellions.ai/npu.present=true \
  -o 'custom-columns=NAME:.metadata.name,FAMILY:.metadata.labels.rebellions\.ai/npu\.family,PRODUCT:.metadata.labels.rebellions\.ai/npu\.product,ALLOCATABLE:.status.allocatable.rebellions\.ai/npu'
NAME        FAMILY   PRODUCT     ALLOCATABLE
node-atom   atom     RBLN-CA25   4

At least one schedulable worker must provide an NPU.

Run an NPU Pod

Follow Run an NPU Pod with the same OpenShift context.

For removal, follow the OLM steps in Uninstalling the RBLN NPU Operator. For restricted networks, see air-gapped installation.