持久卷(PV)與持久卷聲明(PVC)


持久卷 PersistentVolume:

PersistentVolume(PV)是集群中一塊存儲資源,由管理員主動創建提供或使用 StorageClass 動態提供。它與節點資源一樣,不屬於任何命名空間,有着自己獨立的生命周期。而用戶則通過 PersistentVolumeClaim (PVC) 來申請所需的存儲資源。
 

1. 生命周期

在 Kubernetes 集群中,PV 作為存儲資源存在,Pod 通過 PVC 來使用 PV。PV 和 PVC 之間的交互過程有着自己的生命周期,這個生命周期分為5個階段:

  • 供應(Provisioning):即 PV 的創建,可以直接創建 PV(靜態方式),也可以使用 StorageClass(動態方式);
  • 綁定(Binding):將 PV 分配給 PVC;
  • 使用(Using):Pod 通過 PVC 使用該 Volume;
  • 釋放(Releasing):Pod 釋放 Volume 並刪除 PVC;
  • 回收(Reclaiming):回收 PV,可以保留 PV 以便下次使用,也可以直接從雲存儲中刪除;

根據上述的5個階段,存儲卷的存在下面的 4 種狀態:

  • Available:可用狀態,處於此狀態表明 PV 以及准備就緒了,可以被 PVC 使用了;
  • Bound:綁定狀態,表明 PV 已被分配給了 PVC;
  • Released:釋放狀態,表明 PVC 解綁 PV,但還未執行回收策略;
  • Failed:錯誤狀態,表明 PV 發生錯誤;

1.1 供應(Provisioning)

供應是為集群提供可用的存儲卷,在 Kubernetes 中有兩種持久化存儲卷的提供方式:靜態或者動態,兩者區別在於。

1.1.1 靜態 (Static)

PV 是由 Kubernetes 的集群管理員創建的,代表真實的存儲,可被 Pod 作為真實存儲使用。在靜態供應的情況下,由集群管理員預先創建 PV,開發者創建 PVC 和 Pod,Pod 通過 PVC 使用 PV 提供的存儲。靜態供應方式的過程如下圖所示:

[圖片上傳中...(image-5c62e8-1597076467904-3)]

<figcaption></figcaption>

2.1.2 動態(Dynamic)

對於動態的提供方式,當管理員創建的靜態 PV 都不能夠匹配用戶的 PVC 時,集群會嘗試自動為 PVC 提供一個存儲卷,這種提供方式基於 StorageClass。在動態提供方面,PVC 需要請求一個存儲類,但此存儲類必須由管理員預先創建和配置。集群管理員需要在 API-Server 中啟用 DefaultStorageClass 控制器。動態供應過程如下圖所示:

[圖片上傳中...(image-7fd658-1597076467904-2)]

<figcaption></figcaption>

1.2 綁定(Binding)

Kubernetes 會動態的將 PVC 與可用的 PV 的進行綁定,如果一個 PV 曾經動態供給到了一個新的 PVC,那么 PVC 綁定就是專屬的。另外,用戶總是能得到它們所要求的存儲,但是 volume 可能超過它們的請求。一旦綁定了,PVC綁定就是專屬的,無論它們的綁定模式是什么。

如果沒有匹配的 PV,那么 PVC 會無限期的處於未綁定狀態,直到存在匹配的 PV。比如,就算集群中存在很多的 50G 的 PV,需要 100G 容量的 PVC 也不會匹配滿足需求的 PV,直到集群中有 100G 的 PV 時,PVC 才會被綁定。PVC 會基於下面的條件綁定PV,如果下面的條件同時存在,則選擇符合所有要求的 PV 進行綁定:

  1. 如果PVC指定了存儲類,則只會綁定指定了同樣存儲類的PV;

  2. 如果PVC設置了選擇器,則選擇器去匹配符合的PV;

  3. 如果沒有指定存儲類和設置選取器,PVC會根據存儲空間容量大小和訪問模式匹配符合的PV。

1.3 使用(Using)

Pod 把 PVC 作為卷來使用,集群會通過 PVC 查找綁定的 PV,並將其掛接至 Pod。對於支持多種訪問方式的卷,用戶在使用 PVC 作為卷時,可以指定需要的訪問方式。一旦用戶擁有了一個已經綁定的 PVC,被綁定的 PV 就歸該用戶所有。用戶能夠通過在 Pod 的存儲卷中包含的 PVC,從而訪問所占有的 PV。

1.4釋放(Releasing)

當用戶完成對卷的使用時,可以通過請求 API-Server 來刪除 PVC,刪除后還可以重新申請,在刪除 PVC 后對應的持久化存儲卷被視為“被釋放”,但這時還不能給其他的 PVC 使用。之前的 PVC 數據還保存在卷中,要根據策略來進行后續處理。

1.5 回收(Reclaiming)

PV 的回收策略向集群闡述了在 PVC 釋放卷時,應如何進行后續工作。目前可以采用三種策略:保留,回收或者刪除。保留策略允許重新申請這一資源。在 PVC 能夠支持的情況下,刪除策略會同時刪除卷以及AWS EBS/GCE PD或者Cinder卷中的存儲內容。如果插件能夠支持,回收策略會執行基礎的擦除操作(rm -rf /thevolume/*),這一卷就能被重新申請了。

1.5.1 保留

保留回收策略允許手工回收資源。當 PVC 被刪除,PV 將繼續存儲現有的數據,雖然存儲卷被處於已釋放的狀態,但是它對於其他的 PVC 仍是不可用的。管理員能夠通過下面的步驟手工回收存儲卷:

  1. 刪除 PV:在 PV 被刪除后,在外部設施中相關的存儲資產仍然還在;

  2. 手工刪除遺留在外部存儲中的數據;

  3. 手工刪除存儲資產,如果需要重用這些存儲資產,則需要創建新的 PV;

1.5.2 循環

此策略將會被遺棄,建議后續使用動態供應的模式。

循環回收會在存儲卷上執行基本擦除命令 rm -rf /thevolume/,使數據對於新的 PVC 可用。

1.5.3 刪除

對於支持刪除回收策略的存儲卷插件,刪除即會從 Kubernetes 中移除 PV,也會從相關的外部設施中刪除存儲資產,例如 AWS EBS, GCE PD, Azure Disk 或者 Cinder 存儲卷。

2. 創建持久存儲卷

在創建持久卷 PV 時需要指定實際存儲類型,類型是作為插件實現的,目前支持以下插件:

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • AzureFile
  • AzureDisk
  • CSI
  • FC (Fibre Channel)
  • FlexVolume
  • Flocker
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • CephFS
  • Cinder (OpenStack block storage)
  • Glusterfs
  • VsphereVolume
  • Quobyte Volumes
  • HostPath (Single node testing only -- local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
  • Portworx Volumes
  • ScaleIO Volumes
  • StorageOS

下面是一個持久卷的聲明 YAML 配置文件。在此配置文件中要求提供 5Gi 的存儲空間,存儲模式為Filesystem ,訪問模式是 ReadWriteOnce,通過 Recycle 回收策略進行持久化存儲卷的回收,指定存儲類為 slow,使用 nfs 的插件類型。


apiVersion: v1 kind: PersistentVolume metadata: name: pv spec: capacity: #容量 storage: 5Gi volumeMode: Filesystem #存儲卷模式 accessModes: #訪問模式 - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle #持久化卷回收策略 storageClassName: slow #存儲類 mountOptions: #掛接選項 - hard - nfsvers=4.1 nfs: path:/tmp server:172.17.0.2 

2.1 容量(Capacity)

PV 需通過 capcity 屬性指定存儲容量,目前 capcity 屬性僅有 storage(存儲大小)這唯一一個設置。

2.2 存儲卷模式(Volume Mode)

存儲卷模式的默認值為 Filesystem。在 Kubernetesv1.9 版本后用戶可以指定volumeMode 的值,除了支持文件系統(files ystem)外,也支持塊設備(raw block devices)。

2.3 訪問模式(Access Modes)

訪問模式的可選范圍如下:

  • ReadWriteOnce(縮寫 RWO):僅允許單個節點掛載進行讀寫;
  • ReadOnlyMany(縮寫 ROX):允許多個節點掛載且只讀;
  • ReadWriteMany(縮寫 RWX):允許多個節點掛載進行讀寫;

2.4 類(Class)

通過 storageClassName 屬性指定存儲類別,即 StorageClass 資源對象的名稱。具有特定類別的 PV 只能與請求了該類別的 PVC 進行綁定。

2.5 回收策略

當前的回收策略可選值包括:

  • Retain -- 持久化卷被釋放后,仍保留數據,需要手工進行回收操作;
  • Recycle -- 回收空間,刪除 PVC 后,執行基礎擦除命令 rm-rf /thevolume/* (NFS、HostPath 存儲支持);
  • Delete -- 刪除 PVC 后,會刪除與 PV 相關的存儲數據(AWSEBS、GCE PD 存儲支持);

2.6 掛載參數(Mount Options)

當 PV 掛載到一個節點時,可能需要設置額外的掛載參數,可以通過 mountOptions 字段設置。但只有下面的存儲卷類型支持掛載參數:

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • AzureFile
  • AzureDisk
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • CephFS
  • Cinder (OpenStack block storage)
  • Glusterfs
  • VsphereVolume
  • Quobyte Volumes
  • VMware Photon

3. 持久卷聲明

下面是一個名稱為 myclaim 的持久卷聲明 YAML 配置文件,它的訪問模式為 ReadWriteOnce,存儲卷模式是 Filesystem,需要的存儲空間大小為 8Gi,指定的存儲類為 slow,並設置了標簽選擇器和匹配表達式。


    apiVersion: v1
   kind: PersistentVolumeClaim
metadata: name: pvc spec: accessModes: #訪問模式 - ReadWriteOnce volumeMode: Filesystem #存儲卷模式 resources: #資源 requests: storage: 8Gi storageClassName: slow #存儲類 selector: #選擇器 matchLabels: release: "stable" matchExpressions: #匹配表達式 - {key: environment, operator: In, values: [dev]}

3.1 選擇器

在 PVC 中,可以通過標簽選擇器來進一步的過濾 PV。選擇器的有兩種:

  • matchLabels: 只有存在與此處的標簽一樣的 PV 才會被 PVC 選中;
  • matchExpressions :匹配表達式由鍵、值和操作符組成,操作符包括 In, NotIn, ExistsDoesNotExist,只有符合表達式的 PV 才能被選擇;

如果同時設置了 matchLabelsmatchExpressions,則會進行求與(&),即只有同時滿足上述匹配要求的 PV 才會被選擇。

3.2 存儲類

除了使用標簽過濾 PV,還可通過 storageClassName 屬性指定存儲類,PV 只有為該存儲類的才能被綁定到 PVC 上。


4. Pod 中使用 PVC

Pod 通過使用 PVC 來訪問 PV,Pod 需與 PVC 在同一個命名空間中,PVC 會與集群中合適的 PV 進行綁定,並將 PV 掛載到主機和 Pod 上。

 

apiVersion: v1
kind: Pod metadata: name: mypod spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: "/var/www/html" name: mypd # 掛載的存儲卷的名稱 volumes: - name: mypd persistentVolumeClaim: claimName: myclaim # PVC名稱

定義 PVC:

kind: PersistentVolumeClaim apiVersion: v1 metadata: name: local-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: local-storage

定義 Pod:

apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deploy spec: replicas: 1 selector: matchLabels: appname: myapp template: metadata: name: myapp labels: appname: myapp spec: containers: - name: myapp image: tomcat:8.5.38-jre8 ports: - name: http containerPort: 8080 protocol: TCP volumeMounts: - name: tomcatedata mountPath : "/data" volumes: - name: tomcatedata persistentVolumeClaim: claimName: local-claim
 
 
 







免責聲明!

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



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