小白學k8s(12)-k8s中PV和PVC理解


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

生命周期

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 DiskCinder支持刪除(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM