CentOS Stream 10: Use External Storage
Configure external storage with Persistent Volumes and Persistent Volume Claims in a Kubernetes cluster on CentOS Stream 10.
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