Fedora 41
Sponsored Link

Kubernetes : डायनेमिक वॉल्यूम प्रोविजनिंग (NFS)2024/11/06

 

पर्सिस्टेंट स्टोरेज का उपयोग करते समय डायनेमिक वॉल्यूम प्रोविजनिंग सुविधा का उपयोग करने के लिए, क्लस्टर एडमिनिस्ट्रेटर द्वारा मैन्युअल रूप से पीवी बनाए बिना डायनेमिक रूप से पीवी (पर्सिस्टेंट वॉल्यूम) बनाना संभव है, जब उपयोगकर्ता द्वारा पीवीसी (पर्सिस्टेंट वॉल्यूम क्लेम) बनाया जाता है।

यह उदाहरण निम्न प्रकार के वातावरण पर आधारित है।

उदाहरण के लिए, कंट्रोल प्लेन नोड पर NFS सर्वर चलाएं और NFS प्रोविजनर के साथ डायनेमिक वॉल्यूम प्रोविजनिंग कॉन्फ़िगर करें।

-----------+---------------------------+--------------------------+------------
           |                           |                          |
       eth0|10.0.0.30              eth0|10.0.0.51             eth0|10.0.0.52
+----------+-----------+   +-----------+----------+   +-----------+----------+
|   [ dlp.srv.world ]  |   | [ node01.srv.world ] |   | [ node02.srv.world ] |
|     Control Plane    |   |      Worker Node     |   |      Worker Node     |
+----------------------+   +----------------------+   +----------------------+

[1]

कंट्रोल प्लेन नोड पर NFS सर्वर चलाएँ, यहाँ देखें।
इस उदाहरण में, [/home/nfsshare] निर्देशिका को NFS शेयर के रूप में कॉन्फ़िगर करें।

[2]

वर्कर नोड्स को NFS सर्वर पर NFS शेयर माउंट करने में सक्षम होना चाहिए।

[3] एनएफएस क्लाइंट प्रोविजनर स्थापित करें।
[root@dlp ~]#
dnf -y install helm
[root@dlp ~]#
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
# nfs.server = (NFS सर्वर का होस्टनाम या IP पता)
# nfs.path = (NFS शेयर पथ)

[root@dlp ~]#
helm install nfs-client -n kube-system --set nfs.server=10.0.0.30 --set nfs.path=/home/nfsshare nfs-subdir-external-provisioner/nfs-subdir-external-provisioner
NAME: nfs-client
LAST DEPLOYED: Wed Nov  6 11:33:19 2024
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

[root@dlp ~]#
kubectl get pods -n kube-system

NAME                                                         READY   STATUS    RESTARTS       AGE
.....
.....
nfs-client-nfs-subdir-external-provisioner-779f4566db-md7t5   1/1     Running   0          21s
[4] यह पॉड द्वारा डायनेमिक वॉल्यूम प्रोविजनिंग का उपयोग करने का एक उदाहरण है।
[root@dlp ~]#
kubectl get pv

No resources found in default namespace.
[root@dlp ~]#
kubectl get pvc

No resources found in default namespace.
[root@dlp ~]#
kubectl get storageclass

NAME         PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   cluster.local/nfs-client-nfs-subdir-external-provisioner   Delete          Immediate           true                   63s

# पीवीसी बनाएं

[root@dlp ~]#
vi my-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-provisioner
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      # वॉल्यूम आकार
      storage: 5Gi
  # स्टोरेजक्लास नाम निर्दिष्ट करें
  storageClassName: nfs-client

[root@dlp ~]#
kubectl apply -f my-pvc.yml

persistentvolumeclaim/my-provisioner created
[root@dlp ~]#
kubectl get pvc

NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
my-provisioner   Bound    pvc-42743b06-0794-41eb-8f0e-5372385bd632   5Gi        RWO            nfs-client     <unset>                 4s

# पी.वी. गतिशील रूप से उत्पन्न होता है

[root@dlp ~]#
kubectl get pv

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-42743b06-0794-41eb-8f0e-5372385bd632   5Gi        RWO            Delete           Bound    default/my-provisioner   nfs-client     <unset>                          2m15s

[root@dlp ~]#
vi my-pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: my-mginx
spec:
  containers:
    - name: my-mginx
      image: nginx
      ports:
        - containerPort: 80
          name: web
      volumeMounts:
      - mountPath: /usr/share/nginx/html
        name: nginx-pvc
  volumes:
    - name: nginx-pvc
      persistentVolumeClaim:
        # आपके द्वारा बनाया गया PVC नाम
        claimName: my-provisioner

[root@dlp ~]#
kubectl apply -f my-pod.yml

pod/my-mginx created
[root@dlp ~]#
kubectl get pod my-mginx -o wide

NAME       READY   STATUS    RESTARTS   AGE   IP               NODE               NOMINATED NODE   READINESS GATES
my-mginx   1/1     Running   0          14s   192.168.40.198   node01.srv.world   <none>           <none>

[root@dlp ~]#
kubectl exec my-mginx -- df /usr/share/nginx/html

Filesystem                                                                               1K-blocks    Used Available Use% Mounted on
10.0.0.30:/home/nfsshare/default-my-provisioner-pvc-42743b06-0794-41eb-8f0e-5372385bd632  80674816 5331968  75342848   7% /usr/share/nginx/html

# परीक्षण सूचकांक फ़ाइल बनाने के लिए पहुँच सत्यापित करें

[root@dlp ~]#
echo "Nginx Index" > index.html

[root@dlp ~]#
kubectl cp index.html my-mginx:/usr/share/nginx/html/index.html

[root@dlp ~]#
curl 192.168.40.198

Nginx Index
# जब पीवीसी को हटाया जाता है, तो पीवी को भी गतिशील रूप से हटाया जाता है

[root@dlp ~]#
kubectl delete pod my-mginx

pod "my-mginx" deleted
[root@dlp ~]#
kubectl delete pvc my-provisioner

persistentvolumeclaim "my-provisioner" deleted
[root@dlp ~]#
kubectl get pv

No resources found in default namespace.
[5] स्टेटफुलसेट का उपयोग करने के लिए, [volumeClaimTemplates] निर्दिष्ट करना संभव है।
[root@dlp ~]#
kubectl get pv

No resources found in default namespace.
[root@dlp ~]#
kubectl get pvc

No resources found in default namespace.
[root@dlp ~]#
kubectl get storageclass

NAME         PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   cluster.local/nfs-client-nfs-subdir-external-provisioner   Delete          Immediate           true                   9m42s

[root@dlp ~]#
vi statefulset.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-mginx
spec:
  serviceName: my-mginx
  replicas: 1
  selector:
    matchLabels:
      app: my-mginx
  template:
    metadata:
      labels:
        app: my-mginx
    spec:
      containers:
      - name: my-mginx
        image: nginx
        volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      # स्टोरेजक्लास नाम निर्दिष्ट करें
      storageClassName: nfs-client
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi

[root@dlp ~]#
kubectl apply -f statefulset.yml

statefulset.apps/my-mginx created
[root@dlp ~]#
kubectl get statefulset

NAME       READY   AGE
my-mginx   1/1     13s

[root@dlp ~]#
kubectl get pods -o wide

NAME         READY   STATUS    RESTARTS   AGE   IP               NODE               NOMINATED NODE   READINESS GATES
my-mginx-0   1/1     Running   0          29s   192.168.40.199   node01.srv.world   <none>           <none>

[root@dlp ~]#
kubectl get pvc

NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
data-my-mginx-0   Bound    pvc-149e89de-0bd6-4e6b-b229-50706494f426   5Gi        RWO            nfs-client     <unset>                 63s

[root@dlp ~]#
kubectl get pv

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                     STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-149e89de-0bd6-4e6b-b229-50706494f426   5Gi        RWO            Delete           Bound    default/data-my-mginx-0   nfs-client     <unset>                          87s
मिलान सामग्री