Create storage class

F5 recommends using a Kubernetes StorageClass backed by NFS that supports the ReadWriteMany (RWX) access mode. RWX is required because TMM pods and Observer pods run on different nodes. With this distributed design, local node storage is not suitable, since data written on one node is not available to pods on another.

The F5 Lifecycle Operator (FLO) creates a PersistentVolumeClaim (PVC) with RWX access mode and the required naming. Kubernetes then uses an RWX‑capable StorageClass to provision a PersistentVolume (PV) automatically.

These persistent volumes store important operational data such as core files, statistics, and other files that must remain available across pod restarts and node reboots.

For more information on StorageClass behavior, see https://kubernetes.io/docs/concepts/storage/storage-classes/.

Create storage class

Follow these steps to configure an NFS‑based StorageClass.

  1. Install the NFS CSI driver.

    helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
    
    helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs \
      --namespace kube-system \
      --set kubeletDir=/var/lib/kubelet
    

    List the CSI driver pods:

    kubectl get pods --selector app.kubernetes.io/name=csi-driver-nfs --namespace kube-system
    

    Sample output

    NAME                                  READY   STATUS    RESTARTS   AGE
    csi-nfs-controller-7dfdf8bb86-h6b2q   5/5     Running   0          32h
    csi-nfs-node-9s784                    3/3     Running   0          32h
    csi-nfs-node-ccld9                    3/3     Running   0          32h
    

    List the available CSI drivers:

    kubectl get csidrivers
    

    Sample output

    NAME             ATTACHREQUIRED   PODINFOONMOUNT   STORAGECAPACITY   TOKENREQUESTS   REQUIRESREPUBLISH   MODES        AGE
    nfs.csi.k8s.io   false            false            false             <unset>         false               Persistent   32h
    
  2. Create the StorageClass configuration file.

    Create a file named storageclass.yaml with the following example configuration:

    allowVolumeExpansion: true
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
      name: nfs
    parameters:
      share:
      server:
    provisioner: nfs.csi.k8s.io
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    mountOptions:
      - hard
      - nfsvers=4.0
    
  3. Update values in storageclass.yaml before applying it:

    • Set parameters.share to the path where PVCs should be created.

    • Set parameters.server to the external NFS server address.

  4. Apply the StorageClass.

    kubectl apply -f storageclass.yaml
    
  5. Verify the StorageClass.

    kubectl get storageclass
    

    Sample output

    NAME            PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    nfs (default)   nfs.csi.k8s.io   Delete          Immediate           true                   31h
    
  6. Set the NFS StorageClass as the default.

    kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
    
  7. Verify the NFS StorageClass.

    kubectl get storageclass
    

    Sample output

    NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    nfs (default)   nfs.csi.k8s.io          Delete          Immediate              true                   12d
    

Next steps