開篇先總結(jié)一下三個(gè)存儲(chǔ)相關(guān)的概念:
PersistentVolume(PV) 是對(duì)具體存儲(chǔ)資源的描述,比如NFS、Ceph、GlusterFS等,通過PV可以訪問到具體的存儲(chǔ)資源; PersistentVolumeClaim(PVC) Pod想要使用具體的存儲(chǔ)資源需要對(duì)接到PVC,PVC里會(huì)定義好Pod希望使用存儲(chǔ)的屬性,通過PVC再去申請合適的存儲(chǔ)資源(PV),匹配到合適的資源后PVC和PV會(huì)進(jìn)行綁定,它們兩者是一一對(duì)應(yīng)的; StorageClass(SC) PV可以手動(dòng)創(chuàng)建,也可以自動(dòng)創(chuàng)建,當(dāng)PV需求量非常大時(shí),如果靠手動(dòng)創(chuàng)建PV就非常麻煩了,SC可以實(shí)現(xiàn)自動(dòng)創(chuàng)建PV,并且會(huì)將PVC和PV綁定。
SC會(huì)定義兩部分內(nèi)容:
① pv的屬性,比如存儲(chǔ)類型、大小;
② 創(chuàng)建該P(yáng)V需要用到的存儲(chǔ)插件(provisioner),這個(gè)provisioner是實(shí)現(xiàn)自動(dòng)創(chuàng)建PV的關(guān)鍵。
API資源對(duì)象PV和PVC
1)PV YAML示例:
vi? testpv.yaml #內(nèi)容如下
?
apiVersion: v1 kind: PersistentVolume metadata: ??name:?testpv spec: storageClassName: test-storage accessModes: - ReadWriteOnce capacity: storage: 500Mi ##提供500Mi空間 hostPath: path: /tmp/testpv/
?
說明:
storageClassName:? 定義存儲(chǔ)類名稱,PV和PVC中都會(huì)有該字段,目的是為了方便兩者匹配綁定在一起
accessModes定義該pv的訪問權(quán)限模式,有三種:
ReadWriteOnce:存儲(chǔ)卷可讀可寫,但只能被一個(gè)節(jié)點(diǎn)上的 Pod 掛載;
ReadOnlyMany:存儲(chǔ)卷只讀不可寫,可以被任意節(jié)點(diǎn)上的 Pod 多次掛載;
ReadWriteMany:存儲(chǔ)卷可讀可寫,也可以被任意節(jié)點(diǎn)上的 Pod 多次掛載;
capacity 定義該存儲(chǔ)大小。
hostPath 定義該存儲(chǔ)訪問路徑,這里指的是本地的磁盤。
2)PVC ?YAML示例:
vi? testpvc.yaml? #內(nèi)容如下
?
apiVersion: v1 kind: PersistentVolumeClaim metadata: ??name:?testpvc spec: storageClassName: test-storage accessModes: - ReadWriteOnce resources: requests: storage: 100Mi ##期望申請100Mi空間
?
應(yīng)用pv和pvc的YAML
?
kubectl apply -f testpv.yaml -f testpvc.yaml
?
查看狀態(tài)
?
kubectl get pv,pvc
?
3)PV和PVC匹配規(guī)則
PV創(chuàng)建好后,會(huì)等待PVC與其進(jìn)行綁定,PVC一旦找到合適的PV就會(huì)綁定。如果有多個(gè)PV時(shí),PVC又是如何匹配PV的呢?它有如下一些規(guī)則:
① 訪問模式和存儲(chǔ)類匹配:Kubernetes會(huì)篩選出訪問模式(accessModes)和存儲(chǔ)類(storageClassName)與PVC相匹配的PV。如果沒有匹配的PV,PVC將保持未綁定狀態(tài)。
② 資源大?。涸跐M足訪問模式和存儲(chǔ)類匹配的PV中,Kubernetes會(huì)選擇資源大小大于或等于PVC請求大小的PV。
③ 最佳匹配:在滿足訪問模式、存儲(chǔ)類和資源大小的PV中,Kubernetes會(huì)選擇資源大小最接近PVC請求大小的PV。如果有多個(gè)PV具有相同的資源大小,Kubernetes會(huì)選擇其中一個(gè)進(jìn)行綁定。
④ 避免重復(fù)綁定:一個(gè)PV在任何時(shí)候只能被一個(gè)PVC綁定。一旦PV被綁定到一個(gè)PVC,它將不再可用于其他PVC。
API資源對(duì)象StorageClass
SC的主要作用在于,自動(dòng)創(chuàng)建PV,從而實(shí)現(xiàn)PVC按需自動(dòng)綁定PV。
下面我們通過創(chuàng)建一個(gè)基于NFS的SC來演示SC的作用。
要想使用NFS的SC,還需要安裝一個(gè)NFS provisioner,provisioner里會(huì)定義NFS相關(guān)的信息(服務(wù)器IP、共享目錄等)
修改yaml,并創(chuàng)建rbac授權(quán)
?
cd nfs-subdir-external-provisioner/deploy sed -i 's/namespace: default/namespace: kube-system/' rbac.yaml ##修改命名空間為kube-system kubectl apply -f rbac.yaml ##創(chuàng)建rbac授權(quán)修改deployment.yaml
sed -i 's/namespace: default/namespace: kube-system/' deployment.yaml ##修改命名空間為kube-system ??##另外,你還需要手動(dòng)修改下面內(nèi)容 spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: chronolaw/nfs-subdir-external-provisioner:v4.0.2 ##改為dockerhub地址 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: k8s-sigs.io/nfs-subdir-external-provisioner - name: NFS_SERVER ??????????????value:?192.168.222.99??##改為你自己的nfs服務(wù)器地址 - name: NFS_PATH ??????????????value:?/data/nfs??##改為你自己的nfs共享目錄 volumes: - name: nfs-client-root nfs: server: 192.168.222.99 ##改為你自己的nfs服務(wù)器地址 path: /data/nfs ##改為你自己的nfs共享目錄應(yīng)用yaml
kubectl apply -f deployment.yaml kubectl apply -f class.yaml ##創(chuàng)建storageclassSC YAML示例 如下是class.yaml文件內(nèi)容:
apiVersion:?storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-client provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME' parameters: archiveOnDelete: "false" ##自動(dòng)回收存儲(chǔ)空間有了SC,還需要一個(gè)PVC vi nfsPvc.yaml?#增加如下內(nèi)容
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfsPvc spec: storageClassName: nfs-client accessModes: - ReadWriteMany resources: requests: storage: 500Mi下面創(chuàng)建一個(gè)Pod,來使用PVC vi? nfsPod.yaml? #內(nèi)容如下
apiVersion: v1 kind: Pod metadata: name: nfsPod spec: containers: - name: nfsPod image: nginx:1.23.2 volumeMounts: - name: nfspv mountPath: "/usr/share/nginx/html" volumes: - name: nfspv persistentVolumeClaim: claimName: nfsPvc
審核編輯:劉清
?
評(píng)論
查看更多