k8s基於NFS部署storageclass實現pv自動供給
https://www.cnblogs.com/Smbands/p/11059843.html
https://www.jianshu.com/p/1e870a8d6286
1. Storageclass解決PV手動創建需求
當每次創建 PVC 聲明使用存儲時,都需要去手動的創建 PV,來滿足 PVC 的使用。
可以用一種機制來根據用戶聲明的存儲使用量(PVC)來動態的創建對應的持久化存儲卷(PV)。k8s 用 StorageClass 來實現動態創建 持久化存儲。
1.1 實現原理:
存儲控制器 Volume Controller,是用來專門處理持久化存儲的控制器,其一個子控制循環 PersistentVolumeController 負責實現 PV 和 PVC 的綁定。
PersistentVolumeController 會 watch kube-apiserver 的 PVC 對象。如果發現有 PVC對象創建,則會查看所有可用的 PV, 如果有則綁定,若沒有,則會使用 StorageClass 的配置和 PVC 的描述創建 PV 進行綁定。
所謂將一個 PV 與 PVC 進行“綁定”,其實就是將這個PV對象的名字,填在了 PVC 對象的 spec.volumeName 字段上
1.2 使用方法
創建存儲類,在資源清單中指明地址和共享掛載卷目錄即可實現持久化存儲
1.3 官網概念說明:
https://kubernetes.io/docs/concepts/storage/storage-classes/
1.4 項目地址:
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
1.5 項目架構:
- 存儲工程師創建存儲類。
- 集群管理員維護集群中的存儲資源。
- 用戶或開發人員提交需求,(如在sts中只要在資源清單中編輯好volumeClaimTemplates中的需求,確保資源清單無誤即可運行)這個過程不需要人工手動創建PVC。

2. 搭建storageclass
從官網中可以看出目前NFS並不支持做存儲類,但是我們可以使用NFS的插件來支持。
NFS插件在Github中的項目地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
2.1 搭建NFS服務
與k8s集群同一網段下的主機,我這里選的是k8s-master
安裝nfs服務:yum -y install nfs-utils (集群中的每個節點也要安裝否則不支持)
啟動nfs並設為開機自啟:systemctl start nfs && systemctl enable nfs
創建共享掛載目錄: mkdir -pv /data/volumes/{v1,v2,v3}
編輯/etc/exports文件,將目錄共享到10.6.76.0/24這個網段中:
vi /etc/exports /data/volumes/v1 10.6.76.0/24(rw,no_root_squash) /data/volumes/v2 10.6.76.0/24(rw,no_root_squash) /data/volumes/v3 10.6.76.0/24(rw,no_root_squash) 發布:exportfs -avr exporting 10.6.76.0/24:/data/volumes/v3 exporting 10.6.76.0/24:/data/volumes/v2 exporting 10.6.76.0/24:/data/volumes/v1 查看:showmount –e 10.6.76.25 /data/volumes/v3 10.6.76.0/24 /data/volumes/v2 10.6.76.0/24 /data/volumes/v1 10.6.76.0/24
2.2 載/修改文件
下載項目:
for file in class.yaml deployment.yaml rbac.yaml test-claim.yaml ; do wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/$file ; done
修改資源清單(紅色地方需要修改):
#vim deployment.yaml apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nfs-client-provisioner spec: replicas: 1 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:v2.0.0 ##默認是latest版本 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: fuseim.pri/ifs ##這里的供應者名稱必須和class.yaml中的provisioner的名稱一致,否則部署不成功 - name: NFS_SERVER value: k8s-nfs ##這里寫NFS服務器的IP地址或者能解析到的主機名 - name: NFS_PATH value: /data/volumes/v1 ##這里寫NFS服務器中的共享掛載目錄(強調:這里的路徑必須是目錄中最后一層的文件夾,否則部署的應用將無權限創建目錄導致Pending) volumes: - name: nfs-client-root nfs: server: k8s-nfs ##NFS服務器的IP或可解析到的主機名 path: /data/volumes/v1 ##NFS服務器中的共享掛載目錄(強調:這里的路徑必須是目錄中最后一層的文件夾,否則部署的應用將無權限創建目錄導致Pending)
2.3 部署
[root@k8s-master storageclass]# kubectl apply -f . storageclass.storage.k8s.io/managed-nfs-storage created serviceaccount/nfs-client-provisioner created deployment.extensions/nfs-client-provisioner created serviceaccount/nfs-client-provisioner unchanged clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created persistentvolumeclaim/test-claim created
2.4 查看服務
查看此NFS插件的pod是否部署成功
[root@k8s-master storageclass]# kubectl get pods NAME READY STATUS RESTARTS AGE nfs-client-provisioner-5558488b74-mkhbs 1/1 Running 0 24s [root@k8s-master storageclass]#
2.5 查看測試storageclass
[root@k8s-master storageclass]# kubectl get storageclasses.storage.k8s.io
NAME PROVISIONER AGE
managed-nfs-storage fuseim.pri/ifs 7m8s
這個就根據官方的 test-claim.yaml創建的
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-claim annotations: volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" spec: accessModes: - ReadWriteMany resources: requests: storage: 1Mi
3. 應用-參考statefulset
參考下一篇
