存儲卷PersistentVolume


概述

與管理計算資源相比,管理存儲資源是一個完全不同的問題。為了更好的管理存儲,Kubernetes 引入了 PersistentVolume 和 PersistentVolumeClaim 兩個概念,將存儲管理抽象成如何提供存儲以及如何使用存儲兩個關注點。

關注點分離

通過 PersistentVolume 和 PersistentVolumeClaim,Kubernetes 分離了提供存儲和使用存儲着兩個關注點:

  • PersistentVolumeClaim 必須定義在與應用程序相同的名稱空間中,關注應用程序如何使用存儲,通常由應用程序管理員或開發人員負責
  • PersistentVolume 只能定義在集群層面,關注集群如何提供存儲,通常由集群管理員或者運維人員負責

PersistentVolume(PV 存儲卷)是集群中的一塊存儲空間,由集群管理員管理、或者由 Storage Class(存儲類)自動管理。PV(存儲卷)和 node(節點)一樣,是集群中的資源(kubernetes 集群由存儲資源和計算資源組成)。

PersistentVolumeClaim(存儲卷聲明)是一種類型的 Volume(數據卷),PersistentVolumeClaim(存儲卷聲明)引用的 PersistentVolume(存儲卷)有自己的生命周期,該生命周期獨立於任何使用它的容器組。PersistentVolume(存儲卷)描述了如何提供存儲的細節信息(NFS、cephfs等存儲的具體參數)。

PersistentVolumeClaim(PVC 存儲卷聲明)代表用戶使用存儲的請求。Pod 容器組消耗 node 計算資源,PVC 存儲卷聲明消耗 PersistentVolume 存儲資源。Pod 容器組可以請求特定數量的計算資源(CPU / 內存);PersistentVolumeClaim 可以請求特定大小/特定訪問模式(只能被單節點讀寫/可被多節點只讀/可被多節點讀寫)的存儲資源。

根據應用程序的特點不同,其所需要的存儲資源也存在不同的要求,例如讀寫性能等。集群管理員必須能夠提供關於 PersistentVolume(存儲卷)的更多選擇,無需用戶關心存儲卷背后的實現細節。為了解決這個問題,Kubernetes 引入了 StorageClass(存儲類)的概念

存儲卷和存儲卷聲明的關系

存儲卷和存儲卷聲明的關系如下圖所示:

  • PersistentVolume 是集群中的存儲資源,通常由集群管理員創建和管理
  • StorageClass 用於對 PersistentVolume 進行分類,如果正確配置,StorageClass 也可以根據 PersistentVolumeClaim 的請求動態創建 Persistent Volume
  • PersistentVolumeClaim 是使用該資源的請求,通常由應用程序提出請求,並指定對應的 StorageClass 和需求的空間大小
  • PersistentVolumeClaim 可以做為數據卷的一種,被掛載到容器組/容器中使用

存儲卷聲明的管理過程

PersistantVolume 和 PersistantVolumeClaim 的管理過程描述如下:

下圖主要描述的是 PV 和 PVC 的管理過程,因為繪制空間的問題,將掛載點與Pod關聯了,實際結構應該如上圖所示:

  • Pod 中添加數據卷,數據卷關聯PVC
  • Pod 中包含容器,容器掛載數據卷

提供 Provisioning

有兩種方式為 PersistentVolumeClaim 提供 PersistentVolume : 靜態、動態

  • 靜態提供 Static

    集群管理員實現創建好一系列 PersistentVolume,它們包含了可供集群中應用程序使用的關於實際存儲的具體信息。

動態提供 Dynamic

在配置有合適的 StorageClass(存儲類)且 PersistentVolumeClaim 關聯了該 StorageClass 的情況下,kubernetes 集群可以為應用程序動態創建 PersistentVolume。

綁定 Binding

假設用戶創建了一個 PersistentVolumeClaim 存儲卷聲明,並指定了需求的存儲空間大小以及訪問模式。Kubernets master 將立刻為其匹配一個 PersistentVolume 存儲卷,並將存儲卷聲明和存儲卷綁定到一起。如果一個 PersistentVolume 是動態提供給一個新的 PersistentVolumeClaim,Kubernetes master 會始終將其綁定到該 PersistentVolumeClaim。除此之外,應用程序將被綁定一個不小於(可能大於)其 PersistentVolumeClaim 中請求的存儲空間大小的 PersistentVolume。一旦綁定,PersistentVolumeClaim 將拒絕其他 PersistentVolume 的綁定關系。PVC 與 PV 之間的綁定關系是一對一的映射。

PersistentVolumeClaim 將始終停留在 未綁定 unbound 狀態,直到有合適的 PersistentVolume 可用。舉個例子:集群中已經存在一個 50Gi 的 PersistentVolume,同時有一個 100Gi 的 PersistentVolumeClaim,在這種情況下,該 PVC 將一直處於 未綁定 unbound 狀態,直到管理員向集群中添加了一個 100Gi 的 PersistentVolume。

# 使用 Using

對於 Pod 容器組來說,PersistentVolumeClaim 存儲卷聲明是一種類型的 Volume 數據卷。Kubernetes 集群將 PersistentVolumeClaim 所綁定的 PersistentVolume 掛載到容器組供其使用。

# 使用中保護 Storage Object in Use Protection

  • 使用中保護(Storage Object in Use Protection)的目的是確保正在被容器組使用的 PersistentVolumeClaim 以及其綁定的 PersistentVolume 不能被系統刪除,以避免可能的數據丟失。
  • 如果用戶刪除一個正在使用中的 PersistentVolumeClaim,則該 PVC 不會立即被移除掉,而是推遲到該 PVC 不在被任何容器組使用時才移除;同樣的如果管理員刪除了一個已經綁定到 PVC 的 PersistentVolume,則該 PV 也不會立刻被移除掉,而是推遲到其綁定的 PVC 被刪除后才移除掉。

# 回收 Reclaiming

當用戶不在需要其數據卷時,可以刪除掉其 PersistentVolumeClaim,此時其對應的 PersistentVolume 將被集群回收並再利用。Kubernetes 集群根據 PersistentVolume 中的 reclaim policy(回收策略)決定在其被回收時做對應的處理。當前支持的回收策略有:Retained(保留)、Recycled(重復利用)、Deleted(刪除)

  • 保留 Retain

    保留策略需要集群管理員手工回收該資源。當綁定的 PersistentVolumeClaim 被刪除后,PersistentVolume 仍然存在,並被認為是”已釋放“。但是此時該存儲卷仍然不能被其他 PersistentVolumeClaim 綁定,因為前一個綁定的 PersistentVolumeClaim 對應容器組的數據還在其中。集群管理員可以通過如下步驟回收該 PersistentVolume:

    • 刪除該 PersistentVolume。PV 刪除后,其數據仍然存在於對應的外部存儲介質中(nfs、cefpfs、glusterfs 等)
    • 手工刪除對應存儲介質上的數據
    • 手工刪除對應的存儲介質,您也可以創建一個新的 PersistentVolume 並再次使用該存儲介質
  • 刪除 Delete

    刪除策略將從 kubernete 集群移除 PersistentVolume 以及其關聯的外部存儲介質(雲環境中的 AWA EBS、GCE PD、Azure Disk 或 Cinder volume)。

  • 再利用 Recycle Kuboard 暫不支持

    • 再利用策略將在 PersistentVolume 回收時,執行一個基本的清除操作(rm -rf /thevolume/*),並使其可以再次被新的 PersistentVolumeClaim 綁定。
    • 集群管理員也可以自定義一個 recycler pod template,用於執行清除操作。請參考 Recycle

TIP

動態提供的 PersistentVolume 將從其對應的 StorageClass 繼承回收策略的屬性。

# 擴展 Expanding Persistent Volumes Claims

Kubernetes 中,該特性處於 beta 狀態 Kuboard 暫不支持 該特性只針對極少數的 PersistentVolume 類型有效。請參考 Expanding Persistent Volumes Claims

# 存儲卷類型

Kubernetes 支持 20 種存儲卷類型(可參考 Types of Persistent Volumes

),如下所示:

  • 非持久性存儲
    • emptyDir
    • HostPath (只在單節點集群上用做測試目的)
  • 網絡連接性存儲
    • SAN:iSCSI、ScaleIO Volumes、FC (Fibre Channel)
    • NFS:nfs,cfs
  • 分布式存儲
    • Glusterfs
    • RBD (Ceph Block Device)
    • CephFS
    • Portworx Volumes
    • Quobyte Volumes
  • 雲端存儲
    • GCEPersistentDisk
    • AWSElasticBlockStore
    • AzureFile
    • AzureDisk
    • Cinder (OpenStack block storage)
    • VsphereVolume
    • StorageOS
  • 自定義存儲
    • FlexVolume
  • 不推薦

存儲卷 PersistentVolume

PersistentVolume 字段描述如下表所示:

字段名稱 可選項/備注
容量 Capacity 通常,一個 PersistentVolume 具有一個固定的存儲容量(capacity)
Volume Mode FEATURE STATE: Kubernetes v1.13 beta Kubernetes 1.9 之前的版本,所有的存儲卷都被初始化一個文件系統。當前可選項有:block:使用一個 塊設備(raw block device) filesystem(默認值):使用一個文件系統
Access Modes 可被單節點讀寫-ReadWriteOnce 可被多節點只讀-ReadOnlyMany 可被多節點讀寫-ReadWriteMany
存儲類 StorageClassName 帶有存儲類 StorageClassName 屬性的 PersistentVolume 只能綁定到請求該 StorageClass 存儲類的 PersistentVolumeClaim。 沒有 StorageClassName 屬性的 PersistentVolume 只能綁定到無特定 StorageClass 存儲類要求的 PVC。
回收策略 Reclaim Policy 保留 Retain – 手工回收 再利用 Recycle – 清除后重新可用 (rm -rf /thevolume/*) 刪除 Delete – 刪除 PV 及存儲介質
Mount Options 掛載選項用來在掛載時作為 mount 命令的參數
狀態 Phase Available – 可用的 PV,尚未綁定到 PVCBound – 已經綁定到 PVCReleased – PVC 已經被刪除,但是資源還未被集群回收Failed – 自動回收失敗

======

存儲卷聲明 PersistentVolumeClaims

字段名稱 可選項/備注
存儲類 只有該 StorageClass 存儲類的 PV 才可以綁定到此 PVC
讀寫模式 Access Modes 可被單節點讀寫-ReadWriteOnce 可被多節點只讀-ReadOnlyMany 可被多節點讀寫-ReadWriteMany
Volume Modes blockfilesystem - default
總量 請求存儲空間的大小


免責聲明!

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



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