Install NPU Operator

Prerequisites

  • Cluster administrator access to the target workload cluster where Alauda Build of NPU Operator will be installed.
  • ACP v4.0-v4.3.
  • Ascend 910B or Ascend 310P worker nodes.
  • Alauda Build of Node Feature Discovery installed on the target workload cluster.
  • Driver mode selected before creating the NPUOperatorCtl instance.
  • Access to the Alauda Build of NPU Operator package from Customer Portal.

See Versions and Components and Compatibility for supported combinations.

Prepare NPU packages

Prepare the packages required for the Ascend NPU product line.

Package or artifactRequiredUse whenDocumentation owner
Alauda Build of Node Feature DiscoveryRequiredYou need shared node labels for OS, kernel, architecture, and hardware discovery in the target workload cluster.Shared cluster plugin
Alauda Build of NPU OperatorRequiredYou need the operator that manages the Ascend driver, device plugin, runtime integration, metrics, and optional NPU components.Ascend NPU documentation
Precompiled Ascend Driver imageRequired only for operator-managed containerized Driver modeThe Operator stages a package-external Driver tree on immutable OS nodes. The Host-mode installer image is delivered with the NPU Operator package.Ascend NPU documentation
Volcano cluster pluginOptionalYou plan to enable ClusterD.Volcano / scheduling documentation

Alauda Build of Node Feature Discovery is a shared cluster plugin. It publishes node facts that NPU components use during scheduling, component placement, and node profile matching. Install it once on the target workload cluster before creating the NPUOperatorCtl instance.

Alauda Build of NPU Operator is an umbrella operator. After the operator is installed, the NPUOperatorCtl instance controls which NPU components are reconciled on the selected nodes.

MindIO TFT and MindIO ACP are not separate cluster plugin packages. When enabled, Alauda Build of NPU Operator deploys the MindIO DaemonSets with the delivered npu-node-provision image. In offline or controlled network environments, prepare the matching MindIO SDK zip on each target node before enabling these components.

NPU Operator managed componentDefaultUse when
DriverEnabledThe Operator should install the Host Driver or stage a containerized Driver tree. The managed replacement and reboot workflow applies only to containerized mode.
Ascend Device PluginEnabledWorkloads request Ascend NPUs directly through Kubernetes resources.
Ascend runtime integrationEnabledConfigures the ascend RuntimeClass handler backed by ascend-docker-runtime.
NPU ExporterEnabledACP monitoring should collect Ascend NPU metrics.
NPU Feature DiscoveryEnabledMaintains NPU component placement labels and adds Ascend-specific labels as discovery data becomes available.
HCCN bootstrapDisabledKeep disabled unless the target Ascend 910 profile and dedicated HCCN subnet have been validated. The v26.6.0 validated profile is observe-only and does not rewrite device IPs.
NPU RebooterWorkflow-dependentApproved driver upgrade or chip recovery workflows require node reboot handling.
ClusterDDisabledClusterD is required and Volcano is installed.
MindIO TFT / MindIO ACPDisabledThe workload requires MindIO features. The operator deploys the component; pre-stage the SDK zip only when the target nodes cannot download it at install time.

Choose a driver lifecycle mode

Choose the driver lifecycle mode before creating the NPUOperatorCtl instance.

ModeNPUOperatorCtl driver settingsHost driver path used by NPU componentsUse when
Pre-installed driverSet driver.enabled=false./usr/local/Ascend/driverThe Ascend driver is installed and upgraded outside Alauda Build of NPU Operator.
Operator-managed ordinary OS installSet driver.enabled=true, driver.installMode=host, and driver.usePrecompiled=false./usr/local/Ascend/driverThe host OS can run the delivered driver installer flow.
Operator-managed immutable OS / Alauda OS precompiled installSet driver.enabled=true, driver.installMode=containerized, and driver.usePrecompiled=true.spec.driver.driverInstallDir, default /run/ascend/driverThe host OS is immutable or should use a precompiled Driver tree staged by the Driver DaemonSet.

In pre-installed driver mode, the operator does not create the driver DaemonSet. The host driver must already be installed and healthy on each selected NPU node before you enable device plugin, runtime integration, exporter, HCCN, or other components that need the driver.

Installation flow

1. Prepare the driver according to the selected mode

WARNING

When the operator manages the driver, the driver image is pulled by the driver DaemonSet at runtime. If the matching image tag is missing from the target workload cluster registry or blocked by ImageWhiteList, the Driver Pod stays in ImagePullBackOff and the Driver component does not become ready.

Skip driver image preparation if your NPU nodes already have a Huawei .run driver installed out of band and you plan to disable Driver management in the NPUOperatorCtl instance. In that mode, verify that /usr/local/Ascend/driver exists on every selected NPU node.

For operator-managed immutable OS / Alauda OS precompiled mode, import the ARM64 Driver image that matches each (HDK, chip, kernel, OS) node profile. NPU Operator derives the tag from the HDK version, detected chip, and complete kernel release after removing the architecture suffix:

<HDK>-<chip>-<kernel-release-without-architecture>

For published openEuler tags, the legacy tag contract rewrites the .oe separator in the kernel release to -oe. Other kernel releases remain unchanged. Do not append a separate OS stem that is not present in the detected kernel release.

The Driver image is package-external and is not imported with the NPU Operator package. The following published images are examples for the specified node profiles:

Operating systemHardwareExact host kernelExample Driver image
CTyunOS-based Alauda OSAscend 310P6.6.0-0008.ctl4.aarch64alaudadockerhub/ascend-driver:25.5.0-310p-6.6.0-0008.ctl4
openEuler 24.03 LTS SP3Ascend 910B6.6.0-145.0.4.135.oe2403sp3.aarch64alaudadockerhub/ascend-driver:25.5.0-910b-6.6.0-145.0.4.135-oe2403sp3

Pull the matching example from Docker Hub:

docker pull alaudadockerhub/ascend-driver:25.5.0-310p-6.6.0-0008.ctl4
docker pull alaudadockerhub/ascend-driver:25.5.0-910b-6.6.0-145.0.4.135-oe2403sp3

For other published Driver images, check the tags in the Alauda Ascend Driver repository on Docker Hub. A published tag is an image inventory entry, not by itself a product-support or validation statement. Before use, confirm that the chip, kernel, and operating system match the target node and that the combination is supported for your deployment.

Verify that the selected source image reports arm64, then mirror it to the target workload cluster registry. For example:

SOURCE_IMAGE=docker.io/alaudadockerhub/ascend-driver:25.5.0-310p-6.6.0-0008.ctl4
TARGET_IMAGE=<your-cluster-registry>/mlops/ascend-driver:25.5.0-310p-6.6.0-0008.ctl4

skopeo inspect --override-arch arm64 docker://$SOURCE_IMAGE
skopeo copy --override-arch arm64 \
  docker://$SOURCE_IMAGE \
  docker://$TARGET_IMAGE
skopeo inspect --override-arch arm64 docker://$TARGET_IMAGE

If no tag matches your node kernel, contact Alauda Customer Support with the output of uname -r and the chip model.

When the Driver tag is left empty, NPU Operator resolves it from the configured Driver version, the node chip label, and the complete kernel release label. Configure image mapping for the complete source reference, including its resolved tag. After the Driver Pod starts, verify both the admitted Pod image and the runtime imageID; a rewritten Pod image alone does not prove that the intended image was pulled.

For operator-managed ordinary OS install mode, use the delivered driver installer image and disable precompiled driver delivery. The installer flow installs the driver under /usr/local/Ascend/driver.

2. Allow driver images in ImageWhiteList

If ACP enforces image whitelist policies and the operator manages the driver, add every required driver image tag to an ImageWhiteList in the target workload cluster where Alauda Build of NPU Operator will be installed.

Skip this step in pre-installed driver mode unless another enabled component image is blocked by the cluster image policy.

WARNING

Create the ImageWhiteList in the cluster that runs the NPU driver DaemonSet and NPU nodes. Do not create it in the global cluster unless the global cluster is also the target cluster for this NPU Operator installation.

If you configure the whitelist from the ACP console, switch to the target workload cluster first. The example below is applied to the target workload cluster and uses the cpaas-system namespace in that cluster.

For the validated 310P profile, match the complete source reference rendered by NPU Operator and rewrite it to the image already imported into your cluster registry. The build-harbor.alauda.cn reference below is only the Operator-rendered match key; obtain the source image from Docker Hub as shown in the preceding step.

apiVersion: app.alauda.io/v1alpha1
kind: ImageWhiteList
metadata:
  name: npu-operator-precompiled-driver
  namespace: cpaas-system
spec:
  repoList:
  - build-harbor.alauda.cn/mlops/ascend-driver:25.5.0-310p-6.6.0-0008.ctl4
  rewriteRules:
  - regexp: ^build-harbor\.alauda\.cn/mlops/ascend-driver:25\.5\.0-310p-6\.6\.0-0008\.ctl4$
    replacement: <your-cluster-registry>/mlops/ascend-driver:25.5.0-310p-6.6.0-0008.ctl4

You may add the rule to a platform-generated ImageWhiteList or a self-managed object. If you update an existing object, preserve unrelated entries. Use one exact rule for each supported Driver tag; do not replace the tag with a broad wildcard. Apply the rule before creating or updating the NPUOperatorCtl instance, and recheck it after a product upgrade.

After the instance creates the managed policy, confirm that the rendered repository matches the rule:

kubectl get npuclusterpolicy cluster \
  -o jsonpath='{.spec.driver.imageSpec.repository}{"\n"}'

Then verify the admitted Pod reference and the image actually running:

kubectl -n npu-operator get pods \
  -l app.kubernetes.io/component=npu-driver \
  -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{range .spec.containers[*]}  {.name}{" image="}{.image}{"\n"}{end}{range .status.containerStatuses[*]}  {.name}{" imageID="}{.imageID}{"\n"}{end}{end}'

The admitted image must point to <your-cluster-registry>/mlops/ascend-driver:25.5.0-310p-6.6.0-0008.ctl4. Its imageID must resolve to the target digest recorded during import.

3. Upload packages

Download and upload these packages from Customer Portal:

  • Alauda Build of NPU Operator operator package.
  • Alauda Build of Node Feature Discovery cluster plugin package.
  • Volcano cluster plugin package, only if you plan to enable ClusterD.

For the package upload workflow, see Upload Packages.

4. Install Node Feature Discovery

Install Alauda Build of Node Feature Discovery from Administrator > Marketplace > Cluster Plugins.

NFD is the shared node discovery layer for the cluster. It provides OS, kernel, architecture, and PCI hardware labels that the NPU installation depends on. After you create the NPUOperatorCtl instance, NPU Feature Discovery uses these facts and the Kubernetes node role to maintain NPU-specific and component-placement labels.

5. Install Alauda Build of NPU Operator

  1. Go to Administrator > Marketplace > OperatorHub.
  2. Switch to the target workload cluster and open Alauda Build of NPU Operator.
  3. Click Install.
  4. Keep the default namespace npu-operator unless your deployment plan requires a different namespace. Commands in this guide use the default; if you select another namespace, replace npu-operator with it. The Driver, Runtime, HCCN Bootstrap, Rebooter, and NPU Feature Discovery resources that use the Operator namespace follow that selection.
  5. Select Manual upgrade strategy for production environments.
  6. Wait until the operator subscription succeeds and the controller pods are running.
WARNING

Installing the operator only starts the controller. It does not install the driver, device plugin, runtime integration, or exporter. Those components are deployed after you create an NPUOperatorCtl instance.

6. Create an NPUOperatorCtl instance

  1. Open Installed Operators > Alauda Build of NPU Operator.
  2. Open the NPUOperatorCtl tab.
  3. Click Create NPUOperatorCtl.
  4. Configure the components that should be managed by the operator.

Common component switches:

ComponentDefaultNotes
DriverEnabledDisable only when the host driver is installed and managed outside Alauda Build of NPU Operator.
Driver Version25.5.0Used only to derive an automatic precompiled Driver image tag in containerized mode. Host mode does not use this value to select the installer image.
Use Precompiled DriverEnvironment-dependentEnable for immutable OS / Alauda OS precompiled driver delivery. Disable for ordinary OS host installer mode and pre-installed driver mode.
Driver Install Dir/run/ascend/driver in containerized Driver modeMaps to spec.driver.driverInstallDir and controls the complete path where the containerized Driver tree is staged.
Auto Driver Upgrade RebootDisabledContainerized mode only. Keep disabled in production unless automatic node reboots are acceptable.
Auto Chip-Failure Recovery RebootDisabledContainerized mode only. Enable only after validating the behavior for your workloads.
Ascend Device PluginEnabledReports NPU resources to Kubernetes.
Ascend RuntimeEnabledUses npu-container-toolkit to configure the containerd ascend handler and ascend-docker-runtime to inject devices and Driver files.
NPU ExporterEnabledExposes NPU metrics.
NPU Feature DiscoveryEnabledControlled by spec.npu-feature-discovery.enabled. Maintains placement labels and adds Ascend-specific labels.
HCCN BootstrapDisabledControlled by spec.hccnBootstrap. Enabling it requires a dedicated subnet; the v26.6.0 validated profile is observe-only and does not rewrite device IPs.
NPU RebooterWorkflow-dependentUsed by approved driver upgrade or chip recovery reboot workflows.
ClusterDDisabledRequires Volcano if enabled.
WARNING

Enable the Ascend Device Plugin only when NPU Operator owns direct NPU allocation for those nodes.

If the deployment uses NPU Operator to prepare the Ascend base and uses HAMi Ascend Device Plugin to expose the devices, keep the NPU Operator Ascend Device Plugin disabled or scoped away from those HAMi nodes. The two components can have similar names and may use the same huawei.com/Ascend* resource namespace, but the NPU Operator plugin is for direct NPU allocation while the HAMi plugin is for HAMi-managed allocation or vNPU behavior. Do not rely on resource key differences to separate the two paths.

If you do not use Alauda Build of NPU Operator for full lifecycle management, install the device plugin that matches the workload model yourself: Huawei's Ascend Device Plugin when workloads request NPUs directly, or HAMi Ascend Device Plugin for HAMi-managed allocation and vNPU behavior. Use the Huawei MindCluster documentation as the upstream reference for the Huawei path.

For optional Ascend Operator, NodeD, ClusterD, Resilience Controller, MindIO TFT, and MindIO ACP components, enable them only when the workload or operations plan requires them. MindIO TFT and MindIO ACP use the delivered npu-node-provision image line; prepare node-side SDK zip files only for offline or controlled network environments.

7. Verify node placement labels

Creating the NPUOperatorCtl instance with spec.npu-feature-discovery.enabled=true deploys the npu-feature-discovery DaemonSet. It derives node placement labels from Kubernetes node roles and NPU discovery. Some managed components require these labels, but you do not need to add them manually when discovery runs successfully on the selected nodes.

Check the discovery DaemonSet and the labels it maintains:

kubectl -n npu-operator get daemonset npu-feature-discovery
kubectl -n npu-operator get pods -l app=npu-feature-discovery -o wide
kubectl get nodes \
  -L node-role.kubernetes.io/control-plane,masterselector,workerselector,openfuyao.com/npu.present

Expected results:

  • A node with node-role.kubernetes.io/control-plane has masterselector=dls-master-node after NPU Feature Discovery runs on it.
  • A non-control-plane node has workerselector=dls-worker-node.
  • A control-plane node that also hosts an NPU can have both placement labels after NPU discovery identifies the device.

If a required placement label is missing, first confirm that an npu-feature-discovery Pod can run on that node and that a control-plane node has the standard node-role.kubernetes.io/control-plane label. The delivered DaemonSet does not tolerate the standard control-plane NoSchedule taints, and it does not recognize only the legacy node-role.kubernetes.io/master role label as control-plane. Either condition can prevent automatic master labeling.

If the node is a control-plane node but has only the legacy role label, add the standard role label and let NPU Feature Discovery reconcile the placement labels:

kubectl label node <control-plane-node-id> node-role.kubernetes.io/control-plane= --overwrite

Only when automatic discovery cannot cover the selected node, add the matching placement label as a fallback:

kubectl label node <control-plane-node-id> masterselector=dls-master-node --overwrite
kubectl label node <npu-worker-node-id> workerselector=dls-worker-node --overwrite

Apply these labels only to nodes intended for the corresponding components. Where NPU Feature Discovery is running, it continuously reconciles the labels and can replace or remove values that do not match the detected node role. In particular, a manual masterselector is not durable on a legacy-master-only node while discovery is running; add the standard control-plane role label instead.

Next step

After the instance is created, continue with Verification.