k8s-NFS Provisioner 為 NFS 提供StorageClass的動態存儲動態分配卷-8

      網友投稿 1192 2025-04-02

      k8s-NFS Provisioner 為 NFS 提供StorageClass的動態存儲動態分配卷-8

      1.StorageClass的動態存儲概述

      Kubernetes集群管理員通過提供不同的存儲類,可以滿足用戶不同的服務質量級別、備份策略和任意策略要求的存儲需求。動態存儲卷供應使用StorageClass進行實現,其允許存儲卷按需被創建。如果沒有動態存儲供應,Kubernetes集群的管理員將不得不通過手工的方式類創建新的存儲卷。通過動態存儲卷,Kubernetes將能夠按照用戶的需要,自動創建其需要的存儲。

      1)集群管理員預先創建存儲類(StorageClass);

      2)用戶創建使用存儲類的持久化存儲聲明(PVC:PersistentVolumeClaim);

      3)存儲持久化聲明通知系統,它需要一個持久化存儲(PV: PersistentVolume);

      4)系統讀取存儲類的信息;

      5)系統基于存儲類的信息,在后臺自動創建PVC需要的PV;

      6)用戶創建一個使用PVC的Pod;

      7)Pod中的應用通過PVC進行數據的持久化;

      8)而PVC使用PV進行數據的最終持久化處理。

      上面介紹了StorageClass整體體系工作原理,下面根據他的原理來實施部署。

      部署nfs提供數據持久化存儲

      配置ServiceAccount 授權NFS Provisioner操作權限

      部署NFS Provisioner 綁定nfs存儲卷

      部署StorageClass 存儲類 綁定存儲提供者NFS Provisioner

      創建PVC用戶通過在PersistentVolumeClaim中包含一個存儲類,來請求動態供應存儲。

      創建pod聲明需要的pvc資源

      2.部署nfs

      持久化存儲最終是要有一個存儲的載體來存儲數據,這個存儲服務可以選擇不同的產品。這里我們使用的是nfs服務共享文件夾存儲我們的數據。因此首先要搭建這篇文章的基礎層nfs存儲服務。

      在k8s所有節點上安裝nfs并啟動

      # 安裝nfs服務 yum install nfs-utils rpcbind -y # 啟動nfs服務 systemctl start nfs && systemctl enable nfs systemctl start rpcbind && systemctl enable rpcbind

      1

      2

      3

      4

      5

      以下操作只需要在共享目錄的節點上操作,該節點就為nfs服務端節點。

      mkdir -p /data/nfs/ chmod 777 /data/nfs/

      1

      2

      vim /etc/exports

      1

      配置文件內容

      /data/nfs 172.16.8.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)

      1

      我配置了將 /data/nfs 文件目錄設置為允許 IP 為該 172.16.8.0/24 區間的客戶端掛載,(注意這個IP地址范圍要改成你當前nfs服務所在主機的ip地址)當然,如果客戶端 IP 不在該區間也想要掛載的話,可以設置 IP 區間更大或者設置為 * 即允許所有客戶端掛載,例如:/home *(ro,sync,insecure,no_root_squash) 設置 /home 目錄允許所有客戶端只讀掛載。

      重啟nfs服務

      systemctl restart rpcbind systemctl restart nfs

      1

      2

      測試配置nfs是否可用

      #在nfs服務端測試 showmount -e localhost Export list for localhost: /data/nfs 172.16.8.0/24 #在其他node節點上測試nfs # IP地址是nfs部署所在節點的IP地址 showmount -e 172.16.8.113 Export list for 172.16.8.113: /data/nfs 172.16.8.0/24

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      3.配置授權

      k8s授權使用RBAC,我們創建一個ServiceAccount授權NFS Provisioner 操作權限。

      如果曾經配置過nfs的授權,先清理再創建。第一次創建則不需要執行清理步驟

      kubectl delete -f nfs-rbac.yaml -n kube-system

      1

      cat >nfs-rbac.yaml<<-EOF --- kind: ServiceAccount apiVersion: v1 metadata: name: nfs-client-provisioner --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-client-provisioner-runner rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: run-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner namespace: kube-system roleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: kube-system roleRef: kind: Role name: leader-locking-nfs-client-provisioner apiGroup: rbac.authorization.k8s.io EOF

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      #創建授權 kubectl apply -f nfs-rbac.yaml -n kube-system

      1

      2

      4.部署 nfs-client-provisioner

      # 下載源文件 git clone https://github.com/kubernetes-incubator/external-storage.git # 復制源文件中deploy到自己的工作目錄。 cp -R external-storage/nfs-client/deploy/ /opt/k8s # 進入deploy目錄 cd deploy

      1

      2

      3

      4

      5

      6

      清理NFS Provisioner

      如果之前配置過可用下面的命令清理

      kubectl delete -f nfs-provisioner-deploy.yaml -n kube-system

      1

      -nfs服務地址配置到環境變量

      將上面搭建好的nfs服務器IP地址和共享的目錄配置到環境變量中

      export NFS_ADDRESS='172.16.8.113' export NFS_DIR='/data/nfs'

      1

      2

      配置yaml文件

      cat >nfs-provisioner-deploy.yaml<<-EOF --- kind: Deployment apiVersion: apps/v1 metadata: name: nfs-client-provisioner spec: replicas: 1 selector: matchLabels: app: nfs-client-provisioner strategy: type: Recreate #---設置升級策略為刪除再創建(默認為滾動更新) template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: nfs-client #---nfs-provisioner的名稱,以后設置的storageclass要和這個保持一致 - name: NFS_SERVER value: ${NFS_ADDRESS} #---NFS服務器地址,和 valumes 保持一致 - name: NFS_PATH value: ${NFS_DIR} #---NFS服務器目錄,和 valumes 保持一致 volumes: - name: nfs-client-root nfs: server: ${NFS_ADDRESS} #---NFS服務器地址 path: ${NFS_DIR} #---NFS服務器目錄 EOF

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      # 啟動 kubectl apply -f nfs-provisioner-deploy.yaml -n kube-system #查看狀態 kubectl get pod -o wide -n kube-system|grep nfs-client #查看pod日志 kubectl logs -f `kubectl get pod -o wide -n kube-system|grep nfs-client|awk '{print }'` -n kube-system

      1

      2

      3

      4

      5

      6

      5.創建 StorageClass

      創建StorageClass主要是綁定我們創建的NFS Provisioner ,在配置的是否需要注意provisioner 參數的名字要和上面我們配置nfs-provisioner-deploy.yaml文件中定義的PROVISIONER_NAME名字相同。

      如果之前配置可用下面命令清除

      kubectl delete -f nfs-storage.yaml

      1

      cat >nfs-storage.yaml<<-EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage annotations: storageclass.kubernetes.io/is-default-class: "true" #---設置為默認的storageclass provisioner: nfs-client #---動態卷分配者名稱,必須和上面創建的"PROVISIONER_NAME"變量中設置的Name一致 parameters: archiveOnDelete: "true" #---設置為"false"時刪除PVC不會保留數據,"true"則保留數據 mountOptions: - hard #指定為硬掛載方式 #指定NFS版本,這個需要根據 NFS Server 版本號設置,查看版本號命令 nfsstat -s - nfsvers=4 EOF

      1

      2

      3

      k8s-NFS Provisioner 為 NFS 提供StorageClass的動態存儲動態分配卷-8

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      #啟動 kubectl apply -f nfs-storage.yaml #查看創建的storageclass(這里可以看到nfs-storage已經變為默認的storageclass了) kubectl get sc ------------------------------------ NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-storage (default) nfs-client Delete Immediate false 8m25s

      1

      2

      3

      4

      5

      6

      7

      6.創建pvc

      配置pvc文件

      cat >test-claim.yaml<<\EOF kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-claim spec: storageClassName: nfs-storage #---需要與上面創建的storageclass的名稱一致 accessModes: - ReadWriteMany resources: requests: storage: 100Gi #需要的資源大小根據自己的實際情況修改 EOF

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      啟動pvc

      kubectl apply -f test-claim.yaml -n kube-public

      1

      查看pvc綁定的storageclass

      kubectl get pvc -n kube-public

      1

      查看nfs自動創建的數據卷

      進入nfs共享共享目錄查看volume name的目錄已經創建出來了。其中volume的名字是namespace,PVC name以及uuid的組合

      7.測試pod

      創建一個pod使用上面創建好的pvc,查看數據是否存儲到nfs共享目錄。

      cat > test-pod.yaml <<\EOF kind: Pod apiVersion: v1 metadata: name: test-pod spec: containers: - name: test-pod image: busybox:latest command: - "/bin/sh" args: - "-c" - "touch /mnt/SUCCESS && exit 0 || exit 1" volumeMounts: - name: nfs-pvc mountPath: "/mnt" restartPolicy: "Never" volumes: - name: nfs-pvc persistentVolumeClaim: claimName: test-claim EOF

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      kubectl apply -f test-pod.yaml -n kube-public

      1

      kubectl get pod -o wide -n kube-public

      1

      #進入nfs共享目錄下的pvc數據卷 cd /data/nfs/kube-public-test-claim-pvc-baf9196b-9307-4cea-9963-12ad7105890b/ # 查看pvc數據卷下顯示pod創建的SUCCESS文件

      1

      2

      3

      Kubernetes

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:測試用例的設計方法-理論篇
      下一篇:節點甘特圖
      相關文章
      久久久久亚洲AV无码永不| 亚洲AV无码AV吞精久久| 亚洲av无码精品网站| 中文日韩亚洲欧美制服| 亚洲成AV人片在线观看| 亚洲AV无码乱码在线观看| 亚洲av无码有乱码在线观看| 亚洲色无码国产精品网站可下载| 亚洲人6666成人观看| 亚洲av永久无码精品三区在线4| 亚洲伊人久久大香线蕉| 亚洲毛片一级带毛片基地| 亚洲美女在线观看播放| 亚洲日本视频在线观看| 亚洲免费中文字幕| 久久亚洲精品国产亚洲老地址| 亚洲另类自拍丝袜第1页| 亚洲一区在线视频观看| 亚洲中文字幕久久久一区| 亚洲国产精品网站久久| 99久久婷婷国产综合亚洲| 亚洲日本VA中文字幕久久道具| 亚洲区日韩精品中文字幕| 亚洲精品自偷自拍无码| 亚洲国产成人无码AV在线 | 亚洲国产欧美国产综合一区| 亚洲JLZZJLZZ少妇| 亚洲国产精品成人| 精品亚洲视频在线观看 | 亚洲色欲色欲www| 亚洲精品福利你懂| 亚洲国产成人久久精品大牛影视 | 亚洲人成电影亚洲人成9999网| 亚洲小视频在线观看| 亚洲啪啪免费视频| 亚洲av午夜国产精品无码中文字 | 亚洲国产电影av在线网址| 在线观看亚洲av每日更新| 久久亚洲国产伦理| 久久久无码精品亚洲日韩京东传媒 | 亚洲一区二区三区成人网站|