Path C: Full Deployment (Slurm + K8s + Telemetry)¶
Deploy a production-grade cluster with Slurm job scheduling, a highly available Kubernetes service cluster, and telemetry. This is the canonical Omnia deployment that exercises every major subsystem.
What you will build:
| Role | Functional Group | Count | Purpose |
|---|---|---|---|
| OIM (management) | -- | 1 | Runs omnia_core; orchestrates the deployment. |
| K8s control plane | service_kube_control_plane_x86_64 |
3 | HA Kubernetes control plane (kube-apiserver, etcd, kube-scheduler, kube-controller-manager). |
| K8s worker node | service_kube_node_x86_64 |
1 | Runs the telemetry stack: iDRAC collector, LDMS aggregator, Kafka, VictoriaMetrics. |
| Slurm control node | slurm_control_node_x86_64 |
1 | Runs slurmctld (Slurm controller), slurmdbd (accounting), and MariaDB. |
| Slurm compute node(s) | slurm_node_x86_64 / slurm_node_aarch64 |
1+ | Run slurmd; execute jobs submitted to the cluster. |
| Login / compiler node | login_compiler_node_x86_64 / login_compiler_node_aarch64 |
1 | User-facing SSH gateway with compiler toolchains for job submission and building applications. |
Estimated time: ~4 hours.
Note
Complete the Prerequisites Checklist before proceeding.
Step 1 -- Deploy the omnia_core Container¶
Clone the Omnia artifacts repository, build the omnia_core container
image, and deploy the container on the OIM. The container packages the
complete Omnia codebase and Ansible engine.
For details, see Deploy Omnia Core.
-
Clone the Omnia Artifactory repository and build the container image:
Run on: OIM hostgit clone https://github.com/dell/omnia-artifactory.git -b omnia-container-v2.2.0.0 cd omnia-artifactory ./build_images.sh core omnia_branch=v2.2.0.0 core_tag=2.2 -
Download the
omnia.shscript:Run on: OIM hostwget https://raw.githubusercontent.com/dell/omnia/refs/tags/v2.2.0.0/omnia.sh chmod +x omnia.sh -
Install the omnia_core container:
Run on: OIM host./omnia.sh --install
Caution
The password must not contain special characters such as
, |, &, ;, \, <>, *, ?, !, $, (), {}, []`.
Verification
-
Verify the
omnia_corecontainer is running:Run on: OIM hostpodman ps --filter name=omnia_core --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"Expected output:
Expected outputNAMES IMAGE STATUS PORTS omnia_core localhost/omnia_core:2.2 Up 1 day 2222/tcp -
Access the omnia_core container:
Run on: OIM hostssh omnia_coreYou will be automatically logged in to the
omnia_corecontainer.
Warning
- Do not delete any key pairs generated by Omnia from
/root/.ssh-- this causesomnia_core.serviceexecution failure. - Do not manually delete files from the Omnia shared directory. Use
./omnia.sh --uninstallto safely remove.
Step 2 -- Create the Mapping File¶
Omnia supports two methods for creating the PXE mapping file:
- Manual -- Collect PXE NIC information and fill in the
pxe_mapping_file.csvmanually. - OME-based discovery (recommended) -- Use OpenManage Enterprise (OME)
to discover cluster nodes and auto-generate the mapping file using
discovery.yml.
Option A: Fill the PXE mapping file manually
Create a pxe_mapping_file.csv in
/opt/omnia/input/project_default/ and set the pxe_mapping_file_path
variable in provision_config.yml to point to it.
FUNCTIONAL_GROUP_NAME,GROUP_NAME,SERVICE_TAG,PARENT_SERVICE_TAG,HOSTNAME,ADMIN_MAC,ADMIN_IP,BMC_MAC,BMC_IP
service_kube_control_plane_x86_64,kube,SVCTAG01,,kube-cp01,24:6E:96:BB:01:01,10.5.0.201,,10.3.0.201
service_kube_control_plane_x86_64,kube,SVCTAG02,,kube-cp02,24:6E:96:BB:01:02,10.5.0.202,,10.3.0.202
service_kube_control_plane_x86_64,kube,SVCTAG03,,kube-cp03,24:6E:96:BB:01:03,10.5.0.203,,10.3.0.203
service_kube_node_x86_64,kube,SVCTAG04,,kube-wk01,24:6E:96:BB:02:01,10.5.0.204,,10.3.0.204
slurm_control_node_x86_64,slurm,SVCTAG05,,head01,24:6E:96:BB:03:01,10.5.0.205,,10.3.0.205
slurm_node_x86_64,slurm,SVCTAG06,SVCTAG05,compute01,24:6E:96:BB:04:01,10.5.0.206,,10.3.0.206
slurm_node_x86_64,slurm,SVCTAG07,SVCTAG05,compute02,24:6E:96:BB:04:02,10.5.0.207,,10.3.0.207
login_compiler_node_x86_64,slurm,SVCTAG08,,login-compiler01,24:6E:96:BB:05:01,10.5.0.208,,10.3.0.208
Warning
Replace all placeholder values (SVCTAG*, MAC addresses, IPs) with
your actual hardware data.
Note
- All header fields are case-sensitive.
PARENT_SERVICE_TAGmaps Slurm nodes to their parent service kube node for iDRAC telemetry grouping.- The
ADMIN_MACandBMC_MACaddresses should refer to the PXE NIC and BMC NIC on the target nodes respectively. - Target servers should be configured to boot in PXE mode with the appropriate NIC as the first boot device.
- Hostnames should not contain the domain name of the nodes.
Note
The arch field accepts x86_64 or aarch64. If your cluster
includes aarch64 nodes, add a separate entry for each software
component with "arch": ["aarch64"].
For detailed information on PXE mapping file format and parameters, see PXE Mapping File.
Option B: Create PXE file using OME
Use the discovery.yml playbook to auto-generate the mapping file from
an OME inventory. For detailed instructions including OME prerequisites,
static group setup, and iDRAC hostname conventions, see
Discover Nodes Using OME.
cd /omnia/discovery
ansible-playbook discovery.yml -e "discovery_mechanism=ome"
The playbook generates a bmc_pxe_mapping_file_<timestamp>.csv in
/opt/omnia/input/project_default/. Verify and edit the file as needed.
Warning
For a full deployment, ensure at least 3 rows use the
service_kube_control_plane functional group and at least 1 row
uses service_kube_node. HA requires a minimum of 3 control-plane
nodes.
Step 3 -- Provide Inputs¶
Configure the input files that define your cluster's network, provisioning,
telemetry, and storage settings. For a full deployment, update the following
input files in /opt/omnia/input/project_default/. Click each file name to
view the full parameter reference.
| Input File | Purpose |
|---|---|
network_spec.yml |
Network CIDRs, interfaces, and IP ranges |
provision_config.yml |
OS provisioning and PXE settings |
high_availability_config.yml |
Kubernetes HA virtual IP configuration |
telemetry_config.yml |
Telemetry sources, bridges, and sinks |
telemetry_storage_config.yml |
Telemetry storage resources and retention |
software_config.json |
Software stack (K8s, Slurm, telemetry components) |
local_repo_config.yml |
Repository mirror settings |
storage_config.yml |
NFS storage mount configuration |
omnia_config.yml |
Slurm and service cluster K8s settings |
security_config.yml |
OpenLDAP authentication settings |
discovery_config.yml |
BMC discovery and OME integration |
build_stream_config.yml |
BuildStreaM CI/CD pipeline settings (optional) |
additional_cloud_init.yml |
Custom cloud-init scripts (optional) |
For the full procedure and parameter reference, see Configure Inputs. For detailed Slurm-specific input configuration, see Set Up Slurm.
Tip
If you need to build custom Slurm RPMs from source or host them on a local server, complete those steps first:
InfiniBand deployments
If any Slurm nodes have an InfiniBand interface and ib_network is
defined in network_spec.yml:
- The Slurm user repository must not include
ucx,ucx-devel,openmpi, oropenmpi-develpackages. - Slurm must be compiled without UCX and OpenMPI support.
- DOCA-OFED provides its own UCX and OpenMPI stack, configured automatically during provisioning.
For InfiniBand network configuration details, see Configure InfiniBand.
Step 4 -- Prepare the OIM¶
Deploys the OIM infrastructure: OpenCHAMI provisioning stack, Pulp local repository, container registry, MinIO S3 storage, OpenLDAP authentication, and step-ca certificate authority.
For details, see Prepare OIM.
cd /omnia/prepare_oim
ansible-playbook prepare_oim.yml
Verification -- OIM Infrastructure
After prepare_oim.yml completes, verify the OIM services on the
OIM host (not inside the container):
-
Check
omnia.targetstatus:Run on: OIM hostsystemctl is-active omnia.targetExpected output:
active -
Verify all service dependencies:
Run on: OIM hostsystemctl list-dependencies omnia.targetExpected output:
Expected outputomnia.target ● ├─minio.service ● ├─omnia_auth.service ● ├─omnia_core.service ● ├─pulp.service ● ├─registry.service ● ├─network-online.target ● │ └─NetworkManager-wait-online.service ● └─openchami.target ● ├─acme-deploy.service ● ├─acme-register.service ● ├─bss-init.service ● ├─bss.service ● ├─cloud-init-server.service ● ├─coresmd-coredhcp.service ● ├─coresmd-coredns.service ● ├─haproxy.service ● ├─hydra-gen-jwks.service ● ├─hydra-migrate.service ● ├─hydra.service ● ├─opaal-idp.service ● ├─opaal.service ● ├─openchami-cert-trust.service ● ├─postgres.service ● ├─smd-init.service ● ├─smd.service ● └─step-ca.service -
Verify all containers are running:
Run on: OIM hostpodman ps --format "table {{.Names}}\t{{.Status}}"Expected output:
Expected outputNAMES STATUS bss Up 1 day cloud-init-server Up 1 day coresmd-coredhcp Up 1 day coresmd-coredns Up 1 day haproxy Up 1 day hydra Up 1 day minio-server Up 1 day omnia_auth Up 1 day omnia_core Up 1 day opaal Up 1 day opaal-idp Up 1 day postgres Up 1 day pulp Up 1 day registry Up 1 day smd Up 1 day step-ca Up 1 day
Note
- The
minio-servercontainer will not be present if you configured PowerScale as the S3 endpoint (s3_configurations.provider: "powerscale") instorage_config.yml. In that case, Omnia uses the external PowerScale S3 service instead of deploying a local MinIO container. - The
omnia_authcontainer will not be present ifopenldapis not included insoftware_config.json.
For detailed OIM verification procedures, see Verify OIM Services.
Step 5 -- Create Local Repositories¶
Downloads all required RPM packages, container images, and tarballs
into Pulp based on software_config.json for air-gapped provisioning.
For details, see Create Local Repos.
cd /omnia/local_repo
ansible-playbook local_repo.yml
Note
Expect 45--90 minutes depending on network speed. Total download size is typically 20--40 GB.
Verification -- Local Repository Status
After local_repo.yml completes, verify that all software components
were downloaded successfully by checking the software.csv status file.
The components listed in this file correspond directly to the software
entries configured in software_config.json.
-
Verify x86_64 package status:
Run on: omnia_core containercat /opt/omnia/log/local_repo/rhel/10.0/x86_64/software.csvExpected output:
Expected outputname,status default_packages,success admin_debug_packages,success openldap,success service_k8s,success slurm_custom,success csi_driver_powerscale,success ldms,success -
Verify aarch64 package status (if aarch64 is included in
software_config.json):Run on: omnia_core containercat /opt/omnia/log/local_repo/rhel/10.0/aarch64/software.csvExpected output:
Expected outputname,status default_packages,success openldap,success slurm_custom,success
Note
The software.csv output reflects the software components configured
in software_config.json. Each component with "arch": ["x86_64"]
appears in the x86_64 status file, and each component with
"arch": ["aarch64"] appears in the aarch64 status file. Components
such as service_k8s and csi_driver_powerscale are typically
x86_64-only. All entries must show success status before proceeding.
Step 6 -- Build Node Images¶
Builds diskless OS images for each functional group in the PXE mapping file and uploads them to MinIO (S3) for PXE boot delivery.
For details, see Build Cluster Images.
Build x86_64 Images
cd /omnia/build_image_x86_64
ansible-playbook build_image_x86_64.yml
Build aarch64 Images
If your PXE mapping file contains aarch64 functional groups, you must first prepare an aarch64 build node. See Prepare aarch64 Node for the complete procedure (manual RHEL 10 installation, inventory file creation, etc.).
cd /omnia/build_image_aarch64
ansible-playbook build_image_aarch64.yml -i inventory
Verification -- Boot Images in S3
After the build playbooks complete, verify the images are uploaded to
MinIO (S3). Each functional group produces 3 image artifacts:
rootfs (full OS root filesystem), vmlinuz (Linux kernel), and
initramfs (initial RAM filesystem for PXE boot).
-
List all boot images in S3:
Run on: OIM hosts3cmd ls s3://boot-images/Expected output (one directory per functional group plus
efi-images):Expected outputDIR s3://boot-images/efi-images/ DIR s3://boot-images/login_compiler_node_x86_64/ DIR s3://boot-images/service_kube_control_plane_first_x86_64/ DIR s3://boot-images/service_kube_control_plane_x86_64/ DIR s3://boot-images/service_kube_node_x86_64/ DIR s3://boot-images/slurm_control_node_x86_64/ DIR s3://boot-images/slurm_node_x86_64/ DIR s3://boot-images/slurm_node_aarch64/ -
Verify individual image artifacts for a specific functional group:
Run on: OIM hosts3cmd ls -Hr s3://boot-images/slurm_control_node_x86_64/ s3cmd ls -Hr s3://boot-images/efi-images/slurm_control_node_x86_64/Expected output:
Expected output2026-06-26 11:42 1449M s3://boot-images/slurm_control_node_x86_64/rhel-slurm_control_node_x86_64_omnia_2.2.0.0/rhel10.0-rhel-slurm_control_node_x86_64_omnia_2.2.0.0-10.0 2026-06-26 11:42 78M s3://boot-images/efi-images/slurm_control_node_x86_64/rhel-slurm_control_node_x86_64_omnia_2.2.0.0/initramfs-6.12.0-55.82.1.el10_0.x86_64.img 2026-06-26 11:42 15M s3://boot-images/efi-images/slurm_control_node_x86_64/rhel-slurm_control_node_x86_64_omnia_2.2.0.0/vmlinuz-6.12.0-55.82.1.el10_0.x86_64
Note
The directories listed in s3://boot-images/ correspond to the
functional groups defined in your PXE mapping file. Each functional
group will have exactly 3 image artifacts (rootfs, vmlinuz,
initramfs). The efi-images/ directory contains the initramfs
and vmlinuz boot files used during PXE network boot, while the root
filesystem is stored directly under each functional group directory.
If any artifacts are missing, re-run the corresponding build playbook.
Step 7 -- Provision Nodes¶
The provision.yml playbook provisions the cluster nodes. It configures
boot scripts, cloud-init, and prepares nodes for K8s and Slurm deployment.
cd /omnia/provision
ansible-playbook provision.yml
Verification -- nodes.yaml
After provision.yml completes, verify that all nodes from your PXE
mapping file are present in the generated nodes.yaml file. Every
node defined in pxe_mapping_file.csv should have a corresponding
entry with its hostname, functional group, MAC address, and IP address.
cat /opt/omnia/openchami/workdir/nodes/nodes.yaml
Expected output (one entry per node in the PXE mapping file):
nodes:
- name: scnode
xname: x1000c0s0b0n0
description: JS8MN34
nid: 1
group: slurm_control_node_x86_64
bmc_mac: 6c:3c:8c:85:be:04
bmc_ip: 10.3.0.XXX
interfaces:
- mac_addr: 04:32:01:DD:9D:F0
ip_addrs:
- name: management
ip_addr: 10.5.0.XXX
- name: snode1
xname: x1000c0s0b1n0
description: 1T8MN34
nid: 2
group: slurm_node_x86_64
...
- name: kcp1
xname: x1000c0s0b5n0
description: H94M8F3
nid: 6
group: service_kube_control_plane_first_x86_64
bmc_mac: b0:7b:25:d8:4a:f4
bmc_ip: 10.3.0.XXX
interfaces:
- mac_addr: BC:97:E1:F0:94:F0
ip_addrs:
- name: management
ip_addr: 10.5.0.XXX
...
Note
Post execution of provision.yml, IPs and hostnames cannot be
re-assigned by changing the mapping file.
Caution
- Do not run
ssh-keygenpost execution ofprovision.ymlto avoid breaking the password-less SSH channel on the OIM. - Do not delete the Omnia shared path or the NFS directory.
For troubleshooting boot issues, IP route conflicts, and cloud-init failures, see Provisioning Issues.
Step 8 -- PXE Boot Nodes¶
After provision.yml completes, PXE boot all cluster nodes (K8s and Slurm).
Option 1: Manual PXE Boot
Configure each node to boot from the network via iDRAC or BIOS settings.
Option 2: Automated PXE Boot
Sets PXE boot order on all nodes via iDRAC Redfish and reboots them.
cd /omnia/utils
ansible-playbook set_pxe_boot.yml
Warning
This playbook will restart your servers and power them on if they are off. Any unsaved data will be lost.
Verification -- Cloud-Init Provisioning Status
After the nodes PXE boot, verify that cloud-init has completed on all
nodes. SSH from omnia_core into each node using its hostname from the
PXE mapping file (HOSTNAME column):
ssh scnode 'cloud-init status'
ssh kcp1 'cloud-init status'
Expected output on each node:
status: done
Note
Check every node in your cluster. Open your PXE mapping file
and run
ssh <HOSTNAME> 'cloud-init status' for each entry. All nodes must
report status: done before proceeding.
Verification -- Kubernetes Service Cluster
SSH into any service_kube_control_plane node and verify all nodes
are Ready:
ssh kcp1 'kubectl get nodes'
Expected output:
NAME STATUS ROLES AGE VERSION
kcp1 Ready control-plane 1d v1.35.1
kcp2 Ready control-plane 1d v1.35.1
kcp3 Ready control-plane 1d v1.35.1
kn Ready <none> 1d v1.35.1
Verification -- Slurm Cluster
SSH into the slurm_control_node and verify all compute nodes are
idle:
ssh scnode 'sinfo'
Expected output:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
normal* up infinite 2 idle snode[1-2]
For detailed cluster verification procedures, see Verify Cluster.
Step 9 -- Deploy iDRAC Telemetry (Optional)¶
The telemetry.yml playbook initiates the iDRAC telemetry service on the service cluster. For prerequisites, configuration details, and collecting telemetry from external nodes, see Configure iDRAC Telemetry.
Note
This step is required only when idrac: metrics_enabled is set to true in telemetry_config.yml. It is not required for other telemetry types.
cd /omnia/telemetry
ansible-playbook telemetry.yml
Important
If you want to enable additional telemetry components after the
first successful deployment (by updating telemetry_config.yml),
and Kubernetes is already up and running, execute the telemetry.sh
script on kube-control-plane at path
<K8s_NFS_mount_point>/telemetry/telemetry.sh.
Step 10 -- Verify the Telemetry Pipeline¶
After deploying telemetry, verify that all telemetry pods and services are operational. Refer to the topics in the following table for instructions on verifying each telemetry service.
| Telemetry Service | Description | Topic |
|---|---|---|
| iDRAC | Verify collection and ingestion of hardware telemetry metrics. | iDRAC Telemetry -- Verification |
| LDMS | Verify collection and routing of node-level telemetry metrics. | LDMS Telemetry -- Verification |
| PowerScale | Verify collection and ingestion of storage metrics and logs. | PowerScale Telemetry -- Verification |
| UFM | Verify collection and ingestion of fabric metrics and logs. | UFM Telemetry -- Verification |
| VAST | Verify collection and ingestion of storage metrics and logs. | VAST Telemetry -- Verification |
| OpenManage Enterprise (OME) | Verify collection and routing of OME metrics and logs. | OME Telemetry -- Verification |
What's Next?¶
Your cluster is fully operational with Slurm scheduling, Kubernetes service cluster, and telemetry monitoring. Common next steps:
Configure GPU support If your compute nodes have NVIDIA GPUs, follow Slurm with GPU to enable GPU scheduling and GRES configuration.
Customize Slurm configuration Tune partitions, scheduling policies, and accounting settings using Configure Slurm.
Enable additional telemetry sources Configure iDRAC, DCGM, PowerScale, UFM, VAST, or OME telemetry collection. See Telemetry Setup for an overview of all supported sources.
Deploy PowerScale CSI driver Enable persistent storage for Kubernetes workloads using Deploy PowerScale CSI.
Run HPC benchmarks Validate cluster performance with HPL, OSU Micro-Benchmarks, and other tools using Run HPC Benchmarks.
Scale the cluster Add or remove compute nodes with Add / Remove Nodes.
Back up Slurm configuration Create timestamped backups and rollback points using Config Backup.
Enable BuildStreaM for GitOps Automate image building and deployment via CI/CD pipelines using BuildStreaM Deployment.
Info
- Set Up Slurm -- Detailed Slurm setup guide
- Telemetry Setup -- Telemetry sources and configuration
- Prerequisites Checklist -- Master checklist
- Slurm Troubleshooting -- Troubleshoot Slurm issues
- Telemetry Troubleshooting -- Troubleshoot telemetry issues