Skip to main content

CentOS Stream 10: Use External Storage

Configure external storage with Persistent Volumes and Persistent Volume Claims in a Kubernetes cluster on CentOS Stream 10.

May 24, 2026 8 min read
centoscentos-stream-10kubernetesk8scluster

Configure Persistent Storage in Kubernetes Cluster.

This example is based on the environment like follows.

+----------------------+   +----------------------+

|  [ ctrl.srv.world ]  |   |   [ dlp.srv.world ]  |

|     Manager Node     |   |     Control Plane    |

+-----------+----------+   +-----------+----------+

        eth0|10.0.0.25             eth0|10.0.0.30

            |                          |

------------+--------------------------+-----------

            |                          |

        eth0|10.0.0.51             eth0|10.0.0.52

+-----------+----------+   +-----------+----------+

| [ node01.srv.world ] |   | [ node02.srv.world ] |

|     Worker Node#1    |   |     Worker Node#2    |

+----------------------+   +----------------------+

For example, configure cluster that pods can use NFS share as external storage on NFS server [nfs.srv.world (10.0.0.35)].

Step 1

Configure NFS Server.

On this example, set [/home/nfsshare] directory as NFS share.

Step 2

Create PV (Persistent Volume) object and PVC (Persistent Volume Claim) object.

create PV definition

[cent@ctrl ~]$ vi nfs-pv.yml

apiVersion: v1

kind: PersistentVolume

metadata:

  <span class="color2"># any PV name</span>

  name: nfs-pv

spec:

  capacity:

    <span class="color2"># storage size</span>

    storage: 10Gi

  accessModes:

    <span class="color2"># Access Modes:

    # - ReadWriteMany (RW from multi nodes)

    # - ReadWriteOnce (RW from a node)

    # - ReadOnlyMany (R from multi nodes)</span>

    - ReadWriteMany

  persistentVolumeReclaimPolicy:

    <span class="color2"># retain even if pods terminate</span>

    Retain

  nfs:

    <span class="color2"># NFS server definition</span>

    path: /home/nfsshare

    server: 10.0.0.35

    readOnly: false

[cent@ctrl ~]$ kubectl create -f nfs-pv.yml

persistentvolume "nfs-pv" created

[cent@ctrl ~]$ kubectl get pv

NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE

nfs-pv   10Gi       RWX            Retain           Available                          <unset>                          4s

create PVC definition

[cent@ctrl ~]$ vi nfs-pvc.yml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  <span class="color2"># any PVC name</span>

  name: nfs-pvc

spec:

  accessModes:

  - ReadWriteMany

  resources:

     requests:

       storage: 10Gi

[cent@ctrl ~]$ kubectl create -f nfs-pvc.yml

persistentvolumeclaim "nfs-pvc" created

[cent@ctrl ~]$ kubectl get pvc

NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE

nfs-pvc   Bound    nfs-pv   10Gi       RWX                           <unset>                 4s

Step 3

Create Pods with PVC above.

[cent@ctrl ~]$ vi nginx-nfs.yml

apiVersion: apps/v1

kind: Deployment

metadata:

  <span class="color2"># any Deployment name</span>

  name: nginx-nfs

  labels:

    name: nginx-nfs

spec:

  replicas: 3

  selector:

    matchLabels:

      app: nginx-nfs

  template:

    metadata:

      labels:

        app: nginx-nfs

    spec:

      containers:

      - name: nginx-nfs

        image: nginx

        ports:

          - name: web

            containerPort: 80

        volumeMounts:

          - name: nfs-share

            <span class="color2"># mount point in container</span>

            mountPath: /usr/share/nginx/html

      volumes:

        - name: nfs-share

          persistentVolumeClaim:

            <span class="color2"># PVC name you created</span>

            claimName: nfs-pvc

[cent@ctrl ~]$ kubectl apply -f nginx-nfs.yml

deployment.apps/nginx-nfs created

[cent@ctrl ~]$ kubectl get pods -o wide

NAME                        READY   STATUS    RESTARTS   AGE   IP                NODE               NOMINATED NODE   READINESS GATES

nginx-nfs-5b49cb5f4-h548l   1/1     Running   0          85s   192.168.241.139   node02.srv.world   <none>           <none>

nginx-nfs-5b49cb5f4-kthfq   1/1     Running   0          85s   192.168.40.203    node01.srv.world   <none>           <none>

nginx-nfs-5b49cb5f4-m4bmq   1/1     Running   0          85s   192.168.40.202    node01.srv.world   <none>           <none>

[cent@ctrl ~]$ kubectl expose deployment nginx-nfs --type="NodePort" --port 80

service/nginx-nfs exposed

[cent@ctrl ~]$ kubectl port-forward service/nginx-nfs --address 127.0.0.1 8081:80 &

create a test file under the NFS share

[cent@ctrl ~]$ kubectl exec nginx-nfs-5b49cb5f4-h548l -- sh -c "echo 'NFS Persistent Storage Test' > /usr/share/nginx/html/index.html"

verify access

[cent@ctrl ~]$ curl localhost:8081

Handling connection for 8081

NFS Persistent Storage Test