मेरे पास Google क्लाउड पर मेरे कुबेरनेट्स क्लस्टर पर एक रेडिस पॉड है। मैंने पीवी और दावा बनाया है।

kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: my-size 
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: postgres
  name: redis-pv-claim
spec:
  storageClassName: manual
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: my size 

मैंने इसे अपने परिनियोजन में भी रखा है। yaml

volumeMounts:
      - mountPath: /data
        name: redis-pv-claim
    volumes:
    - name: redis-pv-claim
      persistentVolumeClaim:
        claimName: redis-pv-claim  

पॉड का वर्णन करते समय मुझे कोई त्रुटि नहीं दिखाई दे रही है

Volumes:
  redis-pv-claim:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  redis-pv-claim
    ReadOnly:   false

लेकिन यह किसी भी कुंजी को सहेज नहीं सकता है। प्रत्येक परिनियोजन के बाद, "/ डेटा" फ़ोल्डर बस खाली होता है।

मेरा NFS अभी सक्रिय है लेकिन मैं अभी भी डेटा नहीं रख सकता।

पीवीसी का वर्णन करें


Namespace:     my namespace 
StorageClass:  nfs-client
Status:        Bound
Volume:        pvc-5d278b27-a51e-4262-8c1b-68b290b21fc3
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-class: nfs-client
               volume.beta.kubernetes.io/storage-provisioner: cluster.local/ext1-nfs-client-provisioner
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Gi
Access Modes:  RWX
VolumeMode:    Filesystem
Mounted By:    my grafana pod
Events:        <none>

वर्णन फली हालांकि मुझे एक त्रुटि देता है।


Warning  FailedMount  18m   kubelet, gke-devcluster-pool-1-36e6a393-rg7d  MountVolume.SetUp failed for volume "pvc-5d278b27-a51e-4262-8c1b-68b290b21fc3" : mount failed: exit status 1
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/8f7b6630-ed9b-427a-9ada-b75e1805ed60/volumes/kubernetes.io~nfs/pvc-5d278b27-a51e-4262-8c1b-68b290b21fc3 --scope -- /
home/kubernetes/containerized_mounter/mounter mount -t nfs 192.168.1.21:/mnt/nfs/development-test-claim-pvc-5d278b27-a51e-4262-8c1b-68b290b21fc3 /var/lib/kubelet/pods/8f7b6630-ed9b-427a-9ada-b75e1805ed60
/volumes/kubernetes.io~nfs/pvc-5d278b27-a51e-4262-8c1b-68b290b21fc3
Output: Running scope as unit: run-ra5925a8488ef436897bd44d526c57841.scope
Mount failed: mount failed: exit status 32
Mounting command: chroot
2
Pasha 31 मार्च 2020, 18:09

1 उत्तर

सबसे बढ़िया उत्तर

क्या हो रहा है कि जब आपके पास पॉड्स के बीच फ़ाइलों को साझा करने के लिए पीवीसी का उपयोग करने वाले कई नोड होते हैं तो यह सबसे अच्छा तरीका नहीं है।

पीवीसी एक ही नोड में रहने वाले पॉड्स के बीच फाइल साझा कर सकते हैं। इसलिए यदि कभी-कभी मेरे पास एकाधिक नोड होते हैं तो मुझे यह आभास हो सकता है कि मेरी फ़ाइलें ठीक से संग्रहीत नहीं की जा रही हैं।

आपके लिए आदर्श समाधान उपलब्ध किसी भी DSF समाधान का उपयोग करना है। अपने प्रश्न में आप उल्लेख करते हैं कि आप जीसीपी का उपयोग कर रहे हैं और यह स्पष्ट नहीं है कि क्या आप जीकेई का उपयोग कर रहे हैं या यदि आपने गणना उदाहरणों के शीर्ष पर अपना क्लस्टर बनाया है।

अगर आप GKE का उपयोग कर रहे हैं, तो क्या आपने पहले ही इस दस्तावेज़ की जांच कर ली है ? कृपया मुझे बताओ।

यदि आपके पास अपने नोड्स तक पहुंच है, तो आपके पास सबसे आसान सेटअप आपके किसी एक नोड में NFS सर्वर बनाना और nfs-client-provisioner अपने पॉड से nfs सर्वर तक पहुंच प्रदान करने के लिए।

मैं काफी समय से इस दृष्टिकोण का उपयोग कर रहा हूं और यह वास्तव में अच्छी तरह से काम करता है।

1 - मेरे मास्टर नोड पर एनएफएस सर्वर स्थापित और कॉन्फ़िगर करें (डेबियन लिनक्स, यह आपके लिनक्स वितरण के आधार पर बदल सकता है):

NFS कर्नेल सर्वर को स्थापित करने से पहले, हमें अपने सिस्टम के रिपॉजिटरी इंडेक्स को अपडेट करना होगा:

$ sudo apt-get update

अब, अपने सिस्टम पर NFS कर्नेल सर्वर स्थापित करने के लिए निम्न कमांड चलाएँ:

$ sudo apt install nfs-kernel-server

निर्यात निर्देशिका बनाएं

$ sudo mkdir -p /mnt/nfs_server_files

जैसा कि हम चाहते हैं कि सभी क्लाइंट निर्देशिका तक पहुंचें, हम निम्नलिखित आदेशों के माध्यम से निर्यात फ़ोल्डर की प्रतिबंधात्मक अनुमतियों को हटा देंगे (यह आपकी सुरक्षा नीति के अनुसार आपके सेट-अप पर भिन्न हो सकता है):

$ sudo chown nobody:nogroup /mnt/nfs_server_files
$ sudo chmod 777 /mnt/nfs_server_files

NFS निर्यात फ़ाइल के माध्यम से क्लाइंट (ग्राहकों) को सर्वर एक्सेस असाइन करें

$ sudo nano /etc/exports

इस फ़ाइल के अंदर, अन्य सर्वरों से अपने हिस्से तक पहुंच की अनुमति देने के लिए एक नई लाइन जोड़ें।

/mnt/nfs_server_files        10.128.0.0/24(rw,sync,no_subtree_check)

आप अपने हिस्से में विभिन्न विकल्पों का उपयोग करना चाह सकते हैं। 10.128.0.0/24 मेरा k8s आंतरिक नेटवर्क है।

साझा निर्देशिका निर्यात करें और यह सुनिश्चित करने के लिए सेवा को पुनरारंभ करें कि सभी कॉन्फ़िगरेशन फ़ाइलें सही हैं।

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server

सभी सक्रिय शेयरों की जाँच करें:

$ sudo exportfs
/mnt/nfs_server_files
                10.128.0.0/24

2 - मेरे सभी वर्कर नोड्स पर NFS क्लाइंट स्थापित करें:

$ sudo apt-get update
$ sudo apt-get install nfs-common

इस बिंदु पर आप यह जांचने के लिए एक परीक्षण कर सकते हैं कि क्या आपके पास अपने कार्यकर्ता नोड्स से अपने हिस्से तक पहुंच है:

$ sudo mkdir -p /mnt/sharedfolder_client
$ sudo mount kubemaster:/mnt/nfs_server_files /mnt/sharedfolder_client

ध्यान दें कि इस समय आप अपने मास्टर नोड के नाम का उपयोग कर सकते हैं। K8s यहां DNS की देखभाल कर रहा है। जांचें कि क्या वॉल्यूम अपेक्षित रूप से माउंट किया गया है और कुछ फ़ोल्डर्स और फाइलें पुरुष को सुनिश्चित करें कि सब कुछ ठीक काम कर रहा है।

$ cd /mnt/sharedfolder_client
$ mkdir test
$ touch file

अपने मास्टर नोड पर वापस जाएं और जांचें कि क्या ये फ़ाइलें /mnt/nfs_server_files फ़ोल्डर में हैं।

3 - NFS क्लाइंट प्रोविजनर स्थापित करें

हेल्म का उपयोग करके प्रोविजनर स्थापित करें:

$ helm install --name ext --namespace nfs --set nfs.server=kubemaster --set nfs.path=/mnt/nfs_server_files stable/nfs-client-provisioner

ध्यान दें कि मैंने इसके लिए एक नाम स्थान निर्दिष्ट किया है। जांचें कि क्या वे चल रहे हैं:

$ kubectl get pods -n nfs
NAME                                         READY   STATUS      RESTARTS   AGE
ext-nfs-client-provisioner-f8964b44c-2876n   1/1     Running     0          84s

इस बिंदु पर हमारे पास nfs- क्लाइंट नामक एक स्टोरेज क्लास है:

$ kubectl get storageclass -n nfs
NAME         PROVISIONER                                AGE
nfs-client   cluster.local/ext-nfs-client-provisioner   5m30s

हमें एक PersistentVolumeClaim बनाने की आवश्यकता है:

$ more nfs-client-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  namespace: nfs 
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs-client"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
$ kubectl apply -f nfs-client-pvc.yaml

स्थिति की जाँच करें (बाउंड अपेक्षित है):

$ kubectl get persistentvolumeclaim/test-claim -n nfs
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Bound    pvc-e1cd4c78-7c7c-4280-b1e0-41c0473652d5   1Mi        RWX            nfs-client     24s

4 - यह जांचने के लिए एक सरल पॉड बनाएं कि क्या हम NFS शेयर को पढ़/लिख सकते हैं:

इस यम का उपयोग करके एक पॉड बनाएं:

apiVersion: v1
kind: Pod
metadata:
  name: pod0
  labels:
    env: test
  namespace: nfs  
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim
$ kubectl apply -f pod.yaml

आइए हमारे पॉड पर सभी माउंटेड वॉल्यूम को सूचीबद्ध करें:

$ kubectl exec -ti -n nfs pod0 -- df -h /mnt
Filesystem                                                                               Size  Used Avail Use% Mounted on
kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-a2e53b0e-f9bb-4723-ad62-860030fb93b1   99G   11G   84G  11% /mnt

जैसा कि हम देख सकते हैं, हमारे पास /mnt पर एक NFS वॉल्यूम आरोहित है। (पथ पर ध्यान देना महत्वपूर्ण है kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-a2e53b0e-f9bb-4723-ad62-860030fb93b1)

आइए इसे जांचें:

root@pod0:/# cd /mnt
root@pod0:/mnt# ls -la
total 8
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 08:33 .
drwxr-xr-x 1 root   root    4096 Nov  5 08:38 ..

यह खाली है। आइए कुछ फाइलें बनाएं:

$ for i in 1 2; do touch file$i; done;
$ ls -l 
total 8
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 08:58 .
drwxr-xr-x 1 root   root    4096 Nov  5 08:38 ..
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file1
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file2

अब देखते हैं कि ये फ़ाइलें हमारे NFS सर्वर (मास्टर नोड) पर कहाँ हैं:

$ cd /mnt/nfs_server_files
$ ls -l 
total 4
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 09:11 nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12
$ cd nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12/
$ ls -l 
total 0
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file1
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file2

और यहाँ वे फ़ाइलें हैं जिन्हें हमने अभी अपने पॉड के अंदर बनाया है!

कृपया मुझे बताएं कि क्या इस समाधान ने आपकी मदद की।

3
Mark Watney 1 अप्रैल 2020, 07:56