Available with limitations in Certified Core/CSE Lite (1.73), Certified Pro/CSE Pro (1.73)

Available without limitations in:  Ultimate/EE

Included in extensions:  Storage Integration

The module lifecycle stageGeneral Availability

The module has requirements for installation

How much of a volume is reserved for the superuser?

Nothing, by default: the module tells Trident to format with -m0, so the whole volume is available to the workload.

Where the classic 5% ext4 reserve is wanted — for example to keep a filesystem writable for a privileged process after a workload has filled it — annotate the NetappStorageConnection with the percentage to reserve:

d8 k annotate netappstorageconnection <name> storage.deckhouse.io/ext4-reserved-percent=5

Note the resource: unlike the other storage modules, the percentage is set per connection, not per StorageClass. Trident keeps the mkfs options on the backend, so the value applies to every StorageClass served by that connection.

The value is a whole number of percent between 0 and 50; an invalid one leaves the NetappStorageConnection with Ready=False and the reason in its status, instead of breaking volume creation later.

The reserve applies only to volumes created after the annotation was set — filesystems that already exist keep the reserve they were created with.

What happens if a node’s repositories cannot provide open-iscsi and multipath-tools?

The module installs them itself, from an image of its own.

On every node it serves — those carrying storage.deckhouse.io/csi-netapp-node — the NodeGroupConfiguration first asks the node’s package manager for open-iscsi and multipath-tools (iscsi-initiator-utils and device-mapper-multipath on RPM distributions). That stays the preferred path: a host’s own client and daemon are what the rest of that host is built around, and nothing about them is the module’s business while they are there.

When the install fails — a closed environment with no route to the repositories, or a distribution that does not ship the packages — the module falls back to its own package image, iscsi-tools. bashible pulls it from the module’s registry, unpacks it on the node and runs its install script. The payload lands under /var/lib/deckhouse/sds/csi-netapp, every binary is started through its own dynamic loader with its own library path, and two units come up for the daemons:

systemctl is-active d8-csi-netapp-iscsid.service d8-csi-netapp-multipathd.service

Everything the NodeGroupConfiguration does after the install runs on such a node exactly as it does on any other: the find_multipaths no override, the NetApp ONTAP device block, the kernel modules, and the storage.deckhouse.io/csi-netapp-node-ready label the CSI node waits for.

Two things the install script arranges that are worth knowing about, because both are invisible until something does not mount.

Trident reaches iscsiadm, multipath and multipathd on the host by name, through nsenter, so each name is resolved against the container’s PATH inside the host’s mount namespace. The script leaves a wrapper for all three in /usr/local/sbin, and each wrapper prefers a distribution binary the moment one appears.

And multipathd from the package reads its configuration under the prefix it was built with, not under /etc. The script links multipath.conf and multipath from that prefix onto the node’s own. Without that link Trident’s own pre-flight checks see find_multipaths: yes and refuse to stage a volume at all.

The two paths never mix. A host that already has iscsiadm of its own keeps everything of its own, and the install script does nothing there: the client and the daemon must always come from the same source, because iscsiadm of one version does not speak to iscsid of another.

To tell which path a node took, look at what is running on it:

# the distribution's stack
systemctl is-active iscsid multipathd
# the module's own
ls /var/lib/deckhouse/sds/csi-netapp/bin
multipathd show config | grep find_multipaths

Two things the fallback deliberately does not change. It never merges anything into the host’s /lib64 or /usr/lib — the payload is self-contained. And it does not touch /etc/iscsi/initiatorname.iscsi when the node already has one: the IQN is the node’s identity on the array, registered there in a host object, and a node that comes back under a different name is a node the array has never heard of.

How to explicitly enable the module…

You may explicitly enable or disable the module in one of the following ways:

  • Via Deckhouse web UI. In the “System” → “System Management” → “Deckhouse” → “Modules” section, open the csi-netapp module and enable (or disable) the “Module enabled” toggle. Save changes.

    Example:

    Module enable/disable interface
  • Via Deckhouse CLI (d8).

    Use the d8 system module enable command for enabling, or d8 system module disable command for disabling the module (you need Deckhouse CLI (d8), configured to work with the cluster).

    Example of enabling the module:

    d8 system module enable csi-netapp
  • Using ModuleConfig csi-netapp.

    Set spec.enabled to true or false in ModuleConfig csi-netapp (create it if necessary);

    Example of a manifest to enable module csi-netapp:

    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: csi-netapp
    spec:
      enabled: true

How to configure the module…

You can configure the module in one of the following ways:

  • Via Deckhouse web UI.

    In the “System” → “System Management” → “Deckhouse” → “Modules” section, open the csi-netapp module and enable the “Advanced Settings” switch. Fill in the required fields in the “Configuration” tab or specify the module settings in YAML format on the “YAML” tab, excluding the settings section. Save the changes.

    Example:

    Module Setup Interface

    You can also edit the ModuleConfig object csi-netapp on the “YAML” tab in the module settings window (“System” → “System Management” → “Deckhouse” → “Modules”, open the module csi-netapp) by specifying the schema version in the spec.version parameter and the necessary module parameters in the spec.settings section.

  • Via Deckhouse CLI (d8) (requires Deckhouse CLI (d8) configured to work with the cluster).

    Edit the existing ModuleConfig csi-netapp (for more details on configuring Deckhouse, see the documentation) by executing the following command:

    d8 k edit mc csi-netapp

    Make the necessary changes in the spec.settings section. If necessary, specify the schema version in the spec.version parameter. Save the changes.

    You can also create a file with manifest for ModuleConfig csi-netapp using the example below. Fill in the spec.settings section with the required module parameters. If necessary, specify the schema version in the spec.version parameter.

    Apply the manifest using the following command (indicate the manifest file name):

    d8 k apply -f <FILENAME>

    Example of a manifest for ModuleConfig csi-netapp:

    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: csi-netapp
    spec:
      version: 1
      enabled: true
      settings: # Module parameters from the "Parameters" section below.

How to change the module release channel…

To change the module release channel, follow the instruction.

Requirements

To the Deckhouse version: 1.72 and above.

Parameters

Schema version: 1

  • settings
    object
    • settings.logLevel
      string
      The verbosity level of the module’s log output.

      Default: INFO

      Allowed values: ERROR, WARN, INFO, DEBUG, TRACE

    • settings.nodeSelector
      object
      Specifies where shares can be mounted. Works the same way as the spec.nodeSelector parameter in Kubernetes Pods. If this parameter is omitted, NetApp shares can be mounted on any node in the cluster running the Linux OS.

      Default: { "kubernetes.io/os": "linux" }

    • settings.storageClassLabelIgnoredPrefixes
      array of strings

      List of label-key prefixes that MUST NOT be propagated from a NetappStorageClass to the managed Kubernetes StorageClass.

      The controller treats this list as a complement to a built-in (system) list and drops any NetappStorageClass label whose key starts with any prefix from either list.

      The defaults cover labels typically added by GitOps tooling (Argo CD, Flux, Rancher Fleet) so that their reconcilers do not fight the storage controller over labels on the managed StorageClass.

      Default: [ "argocd.argoproj.io/", "kustomize.toolkit.fluxcd.io/", "helm.toolkit.fluxcd.io/", "fleet.cattle.op/" ]