開篇先總結(jié)一下三個存儲相關(guān)的概念:
PersistentVolume(PV) 是對具體存儲資源的描述,比如NFS、Ceph、GlusterFS等,通過PV可以訪問到具體的存儲資源; PersistentVolumeClaim(PVC) Pod想要使用具體的存儲資源需要對接到PVC,PVC里會定義好Pod希望使用存儲的屬性,通過PVC再去申請合適的存儲資源(PV),匹配到合適的資源后PVC和PV會進行綁定,它們兩者是一一對應(yīng)的; StorageClass(SC) PV可以手動創(chuàng)建,也可以自動創(chuàng)建,當(dāng)PV需求量非常大時,如果靠手動創(chuàng)建PV就非常麻煩了,SC可以實現(xiàn)自動創(chuàng)建PV,并且會將PVC和PV綁定。
SC會定義兩部分內(nèi)容:
① pv的屬性,比如存儲類型、大小;
② 創(chuàng)建該PV需要用到的存儲插件(provisioner),這個provisioner是實現(xiàn)自動創(chuàng)建PV的關(guān)鍵。
API資源對象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:? 定義存儲類名稱,PV和PVC中都會有該字段,目的是為了方便兩者匹配綁定在一起
accessModes定義該pv的訪問權(quán)限模式,有三種:
ReadWriteOnce:存儲卷可讀可寫,但只能被一個節(jié)點上的 Pod 掛載;
ReadOnlyMany:存儲卷只讀不可寫,可以被任意節(jié)點上的 Pod 多次掛載;
ReadWriteMany:存儲卷可讀可寫,也可以被任意節(jié)點上的 Pod 多次掛載;
capacity 定義該存儲大小。
hostPath 定義該存儲訪問路徑,這里指的是本地的磁盤。
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)建好后,會等待PVC與其進行綁定,PVC一旦找到合適的PV就會綁定。如果有多個PV時,PVC又是如何匹配PV的呢?它有如下一些規(guī)則:
① 訪問模式和存儲類匹配:Kubernetes會篩選出訪問模式(accessModes)和存儲類(storageClassName)與PVC相匹配的PV。如果沒有匹配的PV,PVC將保持未綁定狀態(tài)。
② 資源大小:在滿足訪問模式和存儲類匹配的PV中,Kubernetes會選擇資源大小大于或等于PVC請求大小的PV。
③ 最佳匹配:在滿足訪問模式、存儲類和資源大小的PV中,Kubernetes會選擇資源大小最接近PVC請求大小的PV。如果有多個PV具有相同的資源大小,Kubernetes會選擇其中一個進行綁定。
④ 避免重復(fù)綁定:一個PV在任何時候只能被一個PVC綁定。一旦PV被綁定到一個PVC,它將不再可用于其他PVC。
API資源對象StorageClass
SC的主要作用在于,自動創(chuàng)建PV,從而實現(xiàn)PVC按需自動綁定PV。
下面我們通過創(chuàng)建一個基于NFS的SC來演示SC的作用。
要想使用NFS的SC,還需要安裝一個NFS provisioner,provisioner里會定義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 ??##另外,你還需要手動修改下面內(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" ##自動回收存儲空間有了SC,還需要一個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)建一個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
審核編輯:劉清
?
評論
查看更多