Operator

Starting with Container Storage Module 1.12, all deployments will use images from quay.io by default. New release images will be available on Docker Hub until CSM 1.14 (May 2025), and existing releases will remain on Docker Hub.

Operator Installation

To deploy the Operator, follow the instructions available here.


CSM Installation Wizard Support Matrix Click Here


The Container Storage Modules Installation Wizard is a webpage that helps you create a manifest file to install Dell CSI Drivers and CSM Modules. Users can enable or disable modules through the UI, and it generates a single manifest file, eliminating the need to download individual Helm charts for drivers and modules.

Generate Manifest File

  1. Open the Installation Wizard.
  2. Select the Installation Type as Helm/Operator.
  3. Select the Array.
  4. Enter the Image Repository. The default value is dellemc.
  5. Select the CSM Version.
  6. Select the modules for installation. If there are module specific inputs, enter their values.
  7. If needed, modify the Controller Pods Count.
  8. If needed, select Install Controller Pods on Control Plane and/or Install Node Pods on Control Plane.
  9. Enter the Namespace. The default value is csi-<array>.
  10. Click on Generate YAML.
  11. A manifest file, values.yaml will be generated and downloaded.
  12. A section Run the following commands to install will be displayed.
  13. Run the commands displayed to install Dell CSI Driver and Modules using the generated manifest file.

Installation Using Operator

Steps

NOTE: Ensure that the csm-operator is installed and that the namespace, secrets, and config.yaml are created as prerequisites.

  • Copy the downloaded values.yaml file.

  • Look over all the fields in the generated values.yaml and fill in/adjust any as needed.

NOTE: The CSM Installation Wizard generates values.yaml with the minimal inputs required to install the CSM. To configure additional parameters in values.yaml, you can follow the steps outlined in CSI Driver, Resiliency.

  • If Observability is checked in the wizard, refer to Observability to export metrics to Prometheus and load the Grafana dashboards.
  • If Authorization is checked in the wizard, only the sidecar is enabled. Refer to Authorization to install and configure the CSM Authorization Proxy Server.
  • If Replication is checked in the wizard, refer to Replication for the necessary prerequisites required for this module.
  • Install the Operator.

On your terminal, run this command:

    kubectl create -f values.yaml

Install Driver

  1. Create namespace:

    Run kubectl create namespace <driver-namespace> using the desired name to create the namespace.

  2. Create PowerMax credentials:

    Create a file called powermax-creds.yaml or pick a sample that has Powermax array connection details :

       apiVersion: v1
       kind: Secret
       metadata:
         name: powermax-creds
           # Replace driver-namespace with the namespace where driver is being deployed
         namespace: <driver-namespace>
       type: Opaque
       data:
         # set username to the base64 encoded username
         username: <base64 username>
         # set password to the base64 encoded password
         password: <base64 password>
         # Uncomment the following key if you wish to use ISCSI CHAP authentication (v1.3.0 onwards)
         # chapsecret: <base64 CHAP secret>
    

    Replace the values for the username and password parameters. These values can be obtained using base64 encoding as described in the following example:

    echo -n "myusername" | base64
    echo -n "mypassword" | base64
    # If mychapsecret is the iSCSI CHAP secret
    echo -n "mychapsecret" | base64
    

    Run the kubectl create -f powermax-creds.yaml command to create the secret.

  3. Create Reverseproxy Configmap:

    Create a configmap using sample here. Fill in the appropriate values for driver configuration. Example: config.yaml

    port: 2222 # Port on which reverseproxy will listen
    logLevel: debug
    logFormat: text
    config:
      storageArrays:
          - storageArrayId: "000000000001" # arrayID
            primaryURL: https://primary-1.unisphe.re:8443 # primary unisphere for arrayID
            backupURL: https://backup-1.unisphe.re:8443   # backup unisphere for arrayID
            proxyCredentialSecrets:
              - primary-unisphere-secret-1 # credential secret for primary unisphere, e.g., powermax-creds
              - backup-unisphere-secret-1 # credential secret for backup unisphere, e.g., powermax-creds
          - storageArrayId: "000000000002"
            primaryURL: https://primary-2.unisphe.re:8443
            backupURL: https://backup-2.unisphe.re:8443
            proxyCredentialSecrets:
            - primary-unisphere-secret-2
            - backup-unisphere-secret-2
      managementServers:
        - url: https://primary-1.unisphe.re:8443 # primary unisphere endpoint
          arrayCredentialSecret: primary-unisphere-secret-1 # primary credential secret e.g., powermax-creds
          skipCertificateValidation: true
        - url: https://backup-1.unisphe.re:8443 # backup unisphere endpoint
          arrayCredentialSecret: backup-unisphere-secret-1 # backup credential secret e.g., powermax-creds
          skipCertificateValidation: false # value false, to verify unisphere certificate and provide certSecret
          certSecret: primary-certs # unisphere verification certificate
        - url: https://primary-2.unisphe.re:8443
          arrayCredentialSecret: primary-unisphere-secret-2
          skipCertificateValidation: true
        - url: https://backup-2.unisphe.re:8443
          arrayCredentialSecret: backup-unisphere-secret-2
          skipCertificateValidation: false
          certSecret: primary-certs
    

    After editing the file, run this command to create a secret called powermax-reverseproxy-config. If you are using a different namespace/secret name, just substitute those into the command.

    kubectl create configmap powermax-reverseproxy-config --from-file config.yaml -n powermax
    
  4. Create Powermax Array Configmap:
    Create a configmap using the sample file here. Fill in the appropriate values for driver configuration.

       # To create this configmap use: kubectl create -f powermax-array-config.yaml
       apiVersion: v1
       kind: ConfigMap
       metadata:
         name: powermax-array-config
         namespace: powermax
       data:
         powermax-array-config.yaml: |
           # List of comma-separated port groups (ISCSI only). Example: PortGroup1, portGroup2 Required for iSCSI only
           X_CSI_POWERMAX_PORTGROUPS: ""
           # Choose which transport protocol to use (ISCSI, FC, NVMETCP, auto) defaults to auto if nothing is specified
           X_CSI_TRANSPORT_PROTOCOL: ""
           # IP address of the Unisphere for PowerMax (Required), Defaults to https://0.0.0.0:8443
           X_CSI_POWERMAX_ENDPOINT: "https://10.0.0.0:8443" 
           # List of comma-separated array ID(s) which will be managed by the driver (Required)
           X_CSI_MANAGED_ARRAYS: "000000000000,000000000000,"
    
  5. Create a CR (Custom Resource) for PowerFlex using the sample files provided

    a. Default Configuration: Use the sample file for default settings. Modify if needed.

    [OR]

    b. Detailed Configuration: Use the sample file for detailed settings.

NOTE: Replication module must be enabled to use the Metro volume

Example:

    - name: replication
      enabled: true

Target clusterID should be set as self

Example:

    - name: "TARGET_CLUSTERS_IDS"
      value: "self"
  1. Users should configure the parameters in CR. The following table lists the primary configurable parameters of the PowerMax driver and their default values:
    Parameters
  1. Execute the following command to create the PowerMax custom resource:kubectl create -f <input_sample_file.yaml>. The above command will deploy the CSI-PowerMax driver.

  2. The mandatory module CSI PowerMax Reverseproxy will be installed automatically with the same command.

  3. Once the driver Custom Resource (CR) is created, you can verify the installation as mentioned below

    • Check if ContainerStorageModule CR is created successfully using the command below:
      kubectl get csm/<name-of-custom-resource> -n <driver-namespace> -o yaml
      
    • Check the status of the CR to verify if the driver installation is in the Succeeded state. If the status is not Succeeded, see the Troubleshooting guide for more information.
  4. Refer Volume Snapshot Class and Storage Class for the sample files.

Other features to enable

Dynamic Logging Configuration

This feature is introduced in CSI Driver for powermax version 2.0.0.

As part of driver installation, a ConfigMap with the name powermax-config-params is created using the manifest located in the sample file. This ConfigMap contains an attribute CSI_LOG_LEVEL which specifies the current log level of the CSI driver. To set the default/initial log level user can set this field during driver installation.

To update the log level dynamically user has to edit the ConfigMap powermax-config-params and update CSI_LOG_LEVEL to the desired log level.

kubectl edit configmap -n powermax powermax-config-params

Volume Health Monitoring

This feature is introduced in CSI Driver for PowerMax version 2.2.0.

Volume Health Monitoring feature is optional and by default this feature is disabled for drivers when installed via CSM operator.

To enable this feature, set X_CSI_HEALTH_MONITOR_ENABLED to true in the driver manifest under controller and node section. Also, install the external-health-monitor from sideCars section for controller plugin. To get the volume health state value under controller should be set to true as seen below. To get the volume stats value under node should be set to true.

     # Install the 'external-health-monitor' sidecar accordingly.
        # Allowed values:
        #   true: enable checking of health condition of CSI volumes
        #   false: disable checking of health condition of CSI volumes
        # Default value: false
     controller:
       envs:
         - name: X_CSI_HEALTH_MONITOR_ENABLED
           value: "true"
     node:
       envs:
        # X_CSI_HEALTH_MONITOR_ENABLED: Enable/Disable health monitor of CSI volumes from node plugin - volume usage
        # Allowed values:
        #   true: enable checking of health condition of CSI volumes
        #   false: disable checking of health condition of CSI volumes
        # Default value: false
         - name: X_CSI_HEALTH_MONITOR_ENABLED
           value: "true"

Support for custom topology keys

This feature is introduced in CSI Driver for PowerMax version 2.3.0.

Support for custom topology keys is optional and by default this feature is disabled for drivers when installed via CSM operator.

X_CSI_TOPOLOGY_CONTROL_ENABLED provides a way to filter topology keys on a node based on array and transport protocol. If enabled, user can create custom topology keys by editing node-topology-config configmap.

  1. To enable this feature, set X_CSI_TOPOLOGY_CONTROL_ENABLED to true in the driver manifest under node section.

       # X_CSI_TOPOLOGY_CONTROL_ENABLED provides a way to filter topology keys on a node based on array and transport protocol
            # if enabled, user can create custom topology keys by editing node-topology-config configmap.
            # Allowed values:
            #   true: enable the filtration based on config map
            #   false: disable the filtration based on config map
            # Default value: false
            - name: X_CSI_TOPOLOGY_CONTROL_ENABLED
              value: "false"
    
  2. Edit the sample config map “node-topology-config” as described here with appropriate values: Example:

            kind: ConfigMap
            metadata:
              name: node-topology-config
              namespace: powermax
            data:
              topologyConfig.yaml: |
                allowedConnections:
                  - nodeName: "node1"
                    rules:
                      - "000000000001:FC"
                      - "000000000002:FC"
                  - nodeName: "*"
                    rules:
                      - "000000000002:FC"
                deniedConnections:
                  - nodeName: "node2"
                    rules:
                      - "000000000002:*"
                  - nodeName: "node3"
                    rules:
                      - "*:*"
    
    Parameters

  1. Run following command to create the configmap
kubectl create -f topologyConfig.yaml

Note: Name of the configmap should always be node-topology-config.



The driver and modules versions installable with the Container Storage Module Operator Click Here