一、什么是PV和PVC?
PV的全稱是Persistent Volume,翻譯過來為持久化存儲卷,是對底層的共享存儲的一種抽象,PV由管理員進行創建和配置,主要含存儲能力、訪問模式、存儲類型、回收策略、后端存儲類型等主要信息,它和具體的底層的共享存儲技術的實現方式有關,比如NFS、Hostpath、RBD等。
PVC的全稱是: PersistenVolumeClaim (持久化卷聲明),PVC是用戶存儲的一種聲明,PVC和Pod類似,Pod是消耗節點node資源,PVC消耗的是PV資源,Pod可以請求CPU的內存,而PVC可以請求特定的存儲空間和訪問模式。
二、PV和PVC的使用場景
配圖來自K8S權威指南第四版
存儲工程師把分布式存儲系統上的總空間划分成一個一個小的存儲塊,K8S的集群管理員將存儲塊和PV進行一一對應,用戶通過PVC對對存儲進行申請,比如可以指定具體容量的大小,訪問模式或者存儲類型,這樣的好處是用戶不需要關心底層的存儲實現細節,只需要直接申請使用PVC即可,若申請的PVC所對應的PV不能滿足用戶的要求,不會生效,直到有合適的PV生成,PVC會自動與PV完成綁定,存儲工程師、K8S管理員,用戶之間業務解耦,靈活性更強。
三、創建PV
PV支持多種不同類型的存儲,如:NFS、hostpath、RBD、ICCSI,本文以hostpath為例介紹如何創建PV
第一步:現在宿主機data目錄下data/pod/volume1,volume1將作為PV對應的hostpath本地存儲的目錄
第二步:通過yaml文件創建PV
1 [root@k8s-master zhanglei]# cat pv-hostpath.yaml 2 kind: PersistentVolume #指定為PV類型 3 apiVersion: v1 4 metadata: 5 name: pv-statefulset #指定PV的名稱 6 labels: #指定PV的標簽 7 release: stable 8 spec: 9 capacity: 10 storage: 0.1Gi #指定PV的容量 11 accessModes: 12 - ReadWriteOnce #指定PV的訪問模式,簡寫為RWO,只支持掛在1個Pod的讀和寫 13 persistentVolumeReclaimPolicy: Recycle #指定PV的回收策略,Recycle表示支持回收,回收完成后支持再次利用 14 hostPath: #指定PV的存儲類型,本文是以hostpath為例 15 path: /data/pod/volume1 #指定PV對應后端存儲hostpath的目錄
說明:
accessModes支持多種訪問模式
1)ReadWriteOnce(RWO):讀寫權限,但是只支持掛載在1個Node
2)ReadOnlyMany(ROX):只讀權限,支持掛載在多個Node
3)ReadWriteMany(RW):讀寫權限,支持掛載在多個Node
persistentVolumeReclaimPolicy的策略,指的是如果PVC被釋放掉后,PV的處理,這里所說的釋放,指的是用戶刪除PVC后,與PVC對應的PV會被釋放掉,PVC個PV是一一對應的關系
1)Retain,PV的數據不會清理,會保留volume,如果需要清理,需要手動進行
2)Recycle,會將數據進行清理,即 rm -rf /thevolume/*(只有 NFS 和 HostPath 支持),清理完成后,PV會呈available狀態,支持再次的bound
3)Delete,刪除存儲資源,會刪除PV及后端的存儲資源,比如刪除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
四、創建PVC
[root@k8s-master zhanglei]# cat pvc-hostpath.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mppvc-01 # 指定PVC的名稱 namespace: default spec: accessModes: ["ReadWriteOnce"] # 指定PVC的訪問模式 resources: requests: storage: 0.05Gi # PVC申請的容量
說明:
1)PVC聲明了accessModes訪問類型為ReadWriteOnce,創建后,系統會自動去找能夠支持ReadWriteOnce訪問類型的PV,若無符合條件的PV,則不會進行綁定,
2)PVC聲明了storage的大小為0.05Gi,創建后,系統會自動去找能夠支持此容量的PV,通常PV的容量至少要大於或者等於0.05Gi才會去進行綁定
從這里來看,對於用戶來說,即只需要聲明訪問類型、容量、另外還可通過StorageClass聲明具體的PV類型即可完成對持久化存儲卷的申請,而不需要去維護和關注后端存儲
五、查詢PV和PVC的
經過前面的步驟我們創建了PV和PVC,現在來看下兩者是否已經完成了綁定,在PV的創建已經指定了其名稱為pv-statefulset,PVC的名稱為mppvc-01
[root@k8s-master zhanglei]# kubectl get pv |grep pv-statefulset pv-statefulset 107374182400m RWO Recycle Bound default/mppvc-01
[root@k8s-master zhanglei]# kubectl get pvc |grep mppvc-01 mppvc-01 Bound pv-statefulset 107374182400m RWO 13d
可以看到pv-statefulset這個PV已經和mppvc-01的PVC進行了綁定(Bound),RWO和Recycle也是之前PV和PVC聲明的狀態,說明綁定成功
[root@k8s-master zhanglei]# kubectl describe pv pv-statefulset Name: pv-statefulset Labels: release=stable Annotations: pv.kubernetes.io/bound-by-controller: yes Finalizers: [kubernetes.io/pv-protection] StorageClass: Status: Bound Claim: default/mppvc-01 Reclaim Policy: Recycle Access Modes: RWO VolumeMode: Filesystem Capacity: 107374182400m Node Affinity: <none> Message: Source: Type: HostPath (bare host directory volume) Path: /data/pod/volume1 HostPathType: Events: <none>
[root@k8s-master zhanglei]# kubectl describe pvc mppvc-01 Name: mppvc-01 Namespace: default StorageClass: Status: Bound Volume: pv-statefulset Labels: <none> Annotations: pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes Finalizers: [kubernetes.io/pvc-protection] Capacity: 107374182400m Access Modes: RWO VolumeMode: Filesystem Mounted By: <none> Events: <none>
再來看下PV的詳細(describe)信息,可以看到type是hostpath類型,顯示了數據卷在宿主機的/data/pod/volume1的目錄。
六、總結
創建PV和PVC分為二步:
第一步:創建PV,支持自定義不同的存儲大小和訪問模式(RWX,RWO)、存放路徑、后端服務server(如hostpath、或NAS盤的數據盤的掛載點)
第二步:創建PVC,綁定到PV。創建PVC的時候可以指定PVC的request storage,即申請的存儲的容量,會根據申請的storage和訪問模式自動匹配符合要求的PV
創建完PV和PVC主要是為了使用它來達到實現持久化存儲的目的,如何進行使用請看本作者后續與statufulset有關的文章,謝謝閱讀~
作者簡介:雲計算容器\K8S方向產品經理,學點技術,為更好地設計產品。