pv和pvc
什么是pv和PVC
持久卷(PersistentVolume,PV)是集群中由管理員配置的一段網絡存儲。它是集群中的資源,就像節點是集群資源一樣。PV持久卷和普通的Volume一樣,也是使用卷插件來實現的,只是它們擁有獨立於任何使用PV的Pod的生命周期。此API對象捕獲存儲實現的詳細信息,包括NFS,iSCSI或特定於雲提供程序的存儲系統。
持久卷申領(PersistentVolumeClaim,PVC)表達的是用戶對存儲的請求。概念上與Pod類似。Pod會耗用節點資源,而PVC申領會耗用PV資源。Pod可以請求特定數量的資源(CPU 和內存);同樣 PVC 申領也可以請求特定的大小和訪問模式 (例如,可以要求PV卷能夠以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一來掛載)。
雖然PersistentVolumeClaims允許用戶使用抽象存儲資源,但是PersistentVolumes對於不同的問題,用戶通常需要具有不同屬性(例如性能)。群集管理員需要能夠提供各種PersistentVolumes不同的方式,而不僅僅是大小和訪問模式,而不會讓用戶了解這些卷的實現方式。對於這些需求,有StorageClass 資源。
StorageClass為管理員提供了一種描述他們提供的存儲的“類”的方法。 不同的類可能映射到服務質量級別,或備份策略,或者由群集管理員確定的任意策略。 Kubernetes本身對於什么類別代表是不言而喻的。 這個概念有時在其他存儲系統中稱為“配置文件”。
總結下來就是
-
PVC:描述 Pod想要使用的持久化屬性,比如存儲大小、讀寫權限等
-
PV:描述一個具體的Volume屬性,比如Volume的類型、掛載目錄、遠程存儲服務器地址等
-
StorageClass:充當PV的模板,自動為PVC創建PV
生命周期
pv和pvc遵循以下生命周期:
1、 供應准備。通過集群外的存儲系統或者雲平台來提供存儲持久化支持。
-
靜態提供:管理員手動創建多個PV,供PVC使用。
-
動態提供:動態創建PVC特定的PV,並綁定。
2、綁定。用戶創建pvc並指定需要的資源和訪問模式。在找到可用pv之前,pvc會保持未綁定狀態。
3、使用。用戶可在pod中像volume一樣使用pvc。
4、釋放。用戶刪除pvc來回收存儲資源,pv將變成“released”狀態。由於還保留着之前的數據,這些數據需要根據不同的策略來處理,否則這些存儲資源無法被其他pvc使用。
5、回收(Reclaiming)。pv可以設置三種回收策略:保留(Retain),回收(Recycle)和刪除(Delete)。
-
保留策略:允許人工處理保留的數據。
-
刪除策略:將刪除pv和外部關聯的存儲資源,需要插件支持。
-
回收策略:將執行清除操作,之后可以被新的pvc使用,需要插件支持。
目前只有NFS和HostPath類型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持刪除(Delete)策略。
PV創建的流程
大多數情況,持久化Volume的實現,依賴於遠程存儲服務,如遠程文件存儲(NFS、GlusterFS)、遠程塊存儲(公有雲提供的遠程磁盤)等。
K8s需要使用這些存儲服務,來為容器准備一個持久化的宿主機目錄,以供以后掛載使用,創建這個目錄分為兩階段:
1、創建一個遠程塊存儲,相當於創建了一個磁盤,稱為Attach
由Volume Controller負責維護,不斷地檢查 每個Pod對應的PV和所在的宿主機的掛載情況。可以理解為創建了一塊NFS磁盤,相當於執行
gcloud compute instances attach-disk < 虛擬機名字 > --disk < 遠程磁盤名字 >
為了使用這塊磁盤,還需要掛載操作
2、將這個磁盤設備掛載到宿主機的掛載點,稱為Mount
將遠程磁盤掛載到宿主機上,發生在Pod對應的宿主機上,是kubelet組件一部分,利用goroutine執行
相當於執行
mount -t nfs <NFS 服務器地址 >:/ /var/lib/kubelet/pods/<Pod 的 ID>/volumes/kubernetes.io~<Volume 類型 >/<Volume 名字 >
通過這個掛載操作,Volume的宿主機目錄就成為了一個遠程NFS目錄的掛載點,以后寫入的所有文件,都會被保存在NFS服務器上
如果是已經有NFS磁盤,第一步可以省略.
同樣,刪除PV的時候,也需要Umount和Dettach兩個階段處理
3、綁定
master中的控制環路監視新的PVC,尋找匹配的PV(如果可能),並將它們綁定在一起。如果為新的PVC動態調配PV,則該環路將始終將該PV綁定到PVC。否則,用戶總會得到他們所請求的存儲,但是容量可能超出要求的數量,一旦PV和PVC綁定后,Persistent Volume Claim綁定是排它性的,不管它們是如何綁定的,PVC和PV綁定是一對一映射的。
持久化卷聲明的保護
PVC保護的目的是確保由Pod正在使用的PVC不會沖系統中移除,因為如果被移除的話可能會導致數據的丟失,當啟用PVC保護alpha功能時,如果用戶刪除了一個Pod正在使用的PVC,則該PVC不會被立即刪除,PVC的刪除將會被推遲,直到PVC不再被任何Pod使用
注意:當Pod狀態為Pending,並且Pod已經分配給節點或Pod為Running狀態時,PVC處於活動狀態。
PV類型
awsElasticBlockStore - AWS 彈性塊存儲(EBS)
azureDisk - Azure Disk
azureFile - Azure File
cephfs - CephFS volume
cinder - Cinder (OpenStack 塊存儲) (棄用)
csi - 容器存儲接口 (CSI)
fc - Fibre Channel (FC) 存儲
flexVolume - FlexVolume
flocker - Flocker 存儲
gcePersistentDisk - GCE 持久化盤
glusterfs - Glusterfs 卷
hostPath - HostPath 卷 (僅供單節點測試使用;不適用於多節點集群; 請嘗試使用 local 卷作為替代)
iscsi - iSCSI (SCSI over IP) 存儲
local - 節點上掛載的本地存儲設備
nfs - 網絡文件系統 (NFS) 存儲
photonPersistentDisk - Photon 控制器持久化盤。 (這個卷類型已經因對應的雲提供商被移除而被棄用)。
portworxVolume - Portworx 卷
quobyte - Quobyte 卷
rbd - Rados 塊設備 (RBD) 卷
scaleIO - ScaleIO 卷 (棄用)
storageos - StorageOS 卷
vsphereVolume - vSphere VMDK 卷
PV卷階段狀態
-
Available: 資源尚未被claim使用
-
Bound: 卷已經被綁定到claim了
-
Released: claim被刪除,卷處於釋放狀態,但未被集群回收
-
Failed: 卷自動回收失敗
PV訪問模式
Persistent Volume可以以資源提供者支持的任何方式掛載到主機上,如下所示,供應商具有不同的功能,每個PV的訪問模式都將被設置為該卷支持的特定模式。例如,NFS可以支持多個讀/寫客戶端,但特定的NFS PV可能以只讀方式導出到服務器上,每個PV都有一套自己用來描述特定功能的訪問模式
-
ReadWriteOnce:該卷可以被單個節點以讀/寫模式掛載
-
ReadOnlyMany:該卷可以被多個節點以只讀模式掛載
-
ReadWriteMany:該卷可以被多個節點以讀/寫模式掛載
在命令行中,訪問模式縮寫為:
-
RWO -- ReadWriteOnce
-
ROX -- ReadOnlyMany
-
RWX -- ReadWriteMany
注意:一個卷一次只能使用一種訪問模式掛載,即使它支持很多種訪問模式。例如:GCEPersistentDisk可以由單個節點作為ReadWriteOnce模式掛載,或由多個節點以ReadOnlyMany模式掛載,但不能同時掛載。
基本的使用
定義NFS PV 資源(靜態):
#pv定義如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.244.1.4
path: "/"
定義pvc資源:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs
spec:
accessModes:
- ReadWriteMany
storageClassName: manual
resources:
requests:
storage: 1Gi
pvc和pv匹配規則:
-
PV 和 PVC 的 spec 字段。比如,PV 的存儲(storage)大小,必須滿足 PVC的要求。
-
PV 和 PVC 的 storageClassName 字段必須一樣。
總結
1、PVC和PV相當於面向對象的接口和實現
2、用戶創建的Pod聲明了PVC,K8S會找一個PV配對,如果沒有PV,就去找對應的StorageClass,幫它創建一個PV,然后和PVC完成綁定
3、新創建的PV,要經過Master節點Attach為宿主機創建遠程磁盤,再經過每個節點kubelet組件把Attach的遠程磁盤Mount到宿主機目錄
參考
【kubernetes系列11—PV和PVC詳解】https://www.cnblogs.com/along21/p/10342788.html
【PV、PVC和StorageClass】https://support.huaweicloud.com/basics-cce/kubernetes_0030.html
【持久卷】https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes/
【存儲類】https://kubernetes.io/zh/docs/concepts/storage/storage-classes/
【持久化存儲之 PV、PVC、StorageClass】https://www.cnblogs.com/menkeyi/p/10903647.html
