k8s-NFS Provisioner 為 NFS 提供StorageClass的動態存儲動態分配卷-8
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
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小時內刪除侵權內容。