Deploy OpenShift Data Foundation across availability zones using Multus

Deploying Red Hat OpenShift across availability zones provides high availability, fault tolerance, and improved performance. Combining multiple availability zones and Multus for network isolation can help make a deployment more robust.

Before creating the storage cluster, run the multus validation tool to verify the network configuration.  This interactive tool provided by Red Hat will run a series of validation tests that determine whether the current Network Attachment Definitions (NAD) and system configurations will support ODF using multus.  The tool can be downloaded from the Red Hat Knowledgebase, which also contains installation instructions.

Prerequisites:

  • NNCP added
  • NAD applied
  • DHCP configured for the cluster

In this lesson, you will:

  • Run the Multus tool to verify the network configuration.
  • Deploy the storage cluster.

Run a validation test

To run the validation test, pass the name of the cluster and public storage networks.  Ensure you are logged into the OpenShift cluster with administrator privileges prior to running the command.

./rook multus validation run --cluster-network=odf-cluster-network --public-network=odf-public-network
2025/05/05 16:51:36 maxprocs: Leaving GOMAXPROCS=2: CPU quota undefined
2025-05-05 16:51:36.042904 I | rookcmd: created kube client interface from default CLI parameters
2025-05-05 16:51:36.043103 I | multus-validation: starting multus validation test with the following config:
namespace: openshift-storage
serviceAccountName: rook-ceph-system
publicNetwork: odf-public-network
clusterNetwork: odf-cluster-network
resourceTimeout: 3m0s
flakyThreshold: 30s
hostCheckOnly: false
nginxImage: quay.io/nginx/nginx-unprivileged:stable-alpine
nodeTypes:
  shared-storage-and-worker-nodes:
    osdsPerNode: 19
    otherDaemonsPerNode: 0
    placement:
      nodeSelector: {}
      tolerations: []
2025-05-05 16:51:36.085529 I | multus-validation: continuing: expected number of image pull pods not yet ready: image pull daemonset for node type "shared-storage-and-worker-nodes" expects zero scheduled pods
…
2025-05-05 16:54:25.192015 I | multus-validation: all 57 clients are 'Ready'
RESULT: multus validation test succeeded!
cleaning up multus validation test resources in namespace "openshift-storage"
multus validation test resources were successfully cleaned up

The tool will verify the connectivity across the nodes, but does not complete any performance or load testing.  If the tool indicates a failure, reference the KCS article for troubleshooting recommendations.  View the pod logs from the tool to view potential issues.  Once debugging is complete, clean up the running instances by executing the tool with the cleanup option.

./rook multus validation cleanup --namespace openshift-storage

StorageCluster Custom Resource Definition

The storage cluster Custom Resource Definition (CRD) defines and manages the Ceph storage cluster.   The storage cluster will need to be deployed through the command-line interface (CLI) so that it can include the IP address ranges managed by the DHCP server for the public and cluster networks.  If the .spec.network.addressRanges are not included in the CRD, the Ceph pods will not be able to start correctly. Make sure that all ranges from all data centers/zones for the public and cluster networks that are managed by the DHCP servers are included.

apiVersion: ocs.openshift.io/v1
kind: StorageCluster
metadata:
  annotations:
    cluster.ocs.openshift.io/local-devices: 'true'
  name: ocs-storagecluster
  namespace: openshift-storage
spec:
  storageDeviceSets:
    - count: 3
      dataPVCTemplate:
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: '1'
          storageClassName: odf-osd-localvolumeset
          volumeMode: Block
      name: ocs-deviceset-odf-osd-localvolumeset
      replica: 3
  monDataDirHostPath: /var/lib/rook
  network:
    addressRanges:
      cluster:
        - 172.10.11.0/24
        - 172.10.75.0/24
        - 172.10.139.0/24
      public:
        - 172.10.10.0/24
        - 172.10.74.0/24
        - 172.10.138.0/24
    connections:
      encryption:
        enabled: true
    provider: multus
    selectors:
      cluster: openshift-storage/odf-cluster-network
      public: openshift-storage/odf-public-network
  resourceProfile: performance
  flexibleScaling: false

Apply the StorageCluster configuration using the oc command.

oc apply -f storage-cluster.yaml

Get the status of the storage cluster.

oc get storagecluster -n openshift-storage
NAME                 AGE    PHASE   EXTERNAL   CREATED AT             VERSION
ocs-storagecluster   10m   Ready              2025-05-08T15:18:59Z   4.18.2

Verify the isolated storage networks.

oc get storagecluster ocs-storagecluster -n openshift-storage -o=jsonpath='{.spec.network}{"\n"}' | jq 
{
  "addressRanges": {
    "cluster": [
      "172.21.136.0/24",
      "172.21.200.0/24",
      "172.21.72.0/24"
    ],
    "public": [
      "172.21.135.0/24",
      "172.21.199.0/24",
      "172.21.71.0/24"
    ]
  },
  "connections": {
    "encryption": {
      "enabled": true
    }
  },
  "multiClusterService": {},
  "provider": "multus",
  "selectors": {
    "cluster": "openshift-storage/odf-cluster-network",
    "public": "openshift-storage/odf-public-network"
  }
}

Summary

We have walked through deploying an ODF Storage Cluster using Multus for dedicated networks across availability zones, which improves performance, availability, and security. With careful planning, this approach can be scaled to your organization's infrastructure to build highly available and performant solutions that can withstand infrastructure failures and meet demanding application requirements.

Ready to learn more about Kubernetes and OpenShift? Try these learning paths:

Previous resource
Configure DHCP for Red Hat OpenShift