開篇先總結一下三個存儲相關的概念:
PersistentVolume(PV) 是對具體存儲資源的描述,比如NFS、Ceph、GlusterFS等,通過PV可以訪問到具體的存儲資源; PersistentVolumeClaim(PVC) Pod想要使用具體的存儲資源需要對接到PVC,PVC里會定義好Pod希望使用存儲的屬性,通過PVC再去申請合適的存儲資源(PV),匹配到合適的資源后PVC和PV會進行綁定,它們兩者是一一對應的; StorageClass(SC) PV可以手動創建,也可以自動創建,當PV需求量非常大時,如果靠手動創建PV就非常麻煩了,SC可以實現自動創建PV,并且會將PVC和PV綁定。
SC會定義兩部分內容:
① pv的屬性,比如存儲類型、大小;
② 創建該PV需要用到的存儲插件(provisioner),這個provisioner是實現自動創建PV的關鍵。
API資源對象PV和PVC
1)PV YAML示例:
vi? testpv.yaml #內容如下
?
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的訪問權限模式,有三種:
ReadWriteOnce:存儲卷可讀可寫,但只能被一個節點上的 Pod 掛載;
ReadOnlyMany:存儲卷只讀不可寫,可以被任意節點上的 Pod 多次掛載;
ReadWriteMany:存儲卷可讀可寫,也可以被任意節點上的 Pod 多次掛載;
capacity 定義該存儲大小。
hostPath 定義該存儲訪問路徑,這里指的是本地的磁盤。
2)PVC ?YAML示例:
vi? testpvc.yaml? #內容如下
?
apiVersion: v1 kind: PersistentVolumeClaim metadata: ??name:?testpvc spec: storageClassName: test-storage accessModes: - ReadWriteOnce resources: requests: storage: 100Mi ##期望申請100Mi空間
?
應用pv和pvc的YAML
?
kubectl apply -f testpv.yaml -f testpvc.yaml
?
查看狀態
?
kubectl get pv,pvc
?
3)PV和PVC匹配規則
PV創建好后,會等待PVC與其進行綁定,PVC一旦找到合適的PV就會綁定。如果有多個PV時,PVC又是如何匹配PV的呢?它有如下一些規則:
① 訪問模式和存儲類匹配:Kubernetes會篩選出訪問模式(accessModes)和存儲類(storageClassName)與PVC相匹配的PV。如果沒有匹配的PV,PVC將保持未綁定狀態。
② 資源大小:在滿足訪問模式和存儲類匹配的PV中,Kubernetes會選擇資源大小大于或等于PVC請求大小的PV。
③ 最佳匹配:在滿足訪問模式、存儲類和資源大小的PV中,Kubernetes會選擇資源大小最接近PVC請求大小的PV。如果有多個PV具有相同的資源大小,Kubernetes會選擇其中一個進行綁定。
④ 避免重復綁定:一個PV在任何時候只能被一個PVC綁定。一旦PV被綁定到一個PVC,它將不再可用于其他PVC。
API資源對象StorageClass
SC的主要作用在于,自動創建PV,從而實現PVC按需自動綁定PV。
下面我們通過創建一個基于NFS的SC來演示SC的作用。
要想使用NFS的SC,還需要安裝一個NFS provisioner,provisioner里會定義NFS相關的信息(服務器IP、共享目錄等)
修改yaml,并創建rbac授權
?
cd nfs-subdir-external-provisioner/deploy sed -i 's/namespace: default/namespace: kube-system/' rbac.yaml ##修改命名空間為kube-system kubectl apply -f rbac.yaml ##創建rbac授權修改deployment.yaml
sed -i 's/namespace: default/namespace: kube-system/' deployment.yaml ##修改命名空間為kube-system ??##另外,你還需要手動修改下面內容 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服務器地址 - name: NFS_PATH ??????????????value:?/data/nfs??##改為你自己的nfs共享目錄 volumes: - name: nfs-client-root nfs: server: 192.168.222.99 ##改為你自己的nfs服務器地址 path: /data/nfs ##改為你自己的nfs共享目錄應用yaml
kubectl apply -f deployment.yaml kubectl apply -f class.yaml ##創建storageclassSC YAML示例 如下是class.yaml文件內容:
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?#增加如下內容
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfsPvc spec: storageClassName: nfs-client accessModes: - ReadWriteMany resources: requests: storage: 500Mi下面創建一個Pod,來使用PVC vi? nfsPod.yaml? #內容如下
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
審核編輯:劉清
?
評論
查看更多