Persistent Volumes閱讀

原文地址: https://kubernetes.io/docs/concepts/storage/persistent-volumes/

文檔描述PersistentVolume目前在k8s中的使用情況。

管理計算實例的直接問題就是管理存儲,引入PersisitentVolume子系統提供給用戶和管理員,抽象描述了存儲如何被提供。爲此,提供了PersistentVolumePersistentVolumeClaim資源對象。以下統稱PV,PVC

名詞概念

PV是集羣中已初始化的一塊存儲。一般由管理員或動態配置使用Storage Classes初始化。PV是集羣資源,類似volumes的存儲插件,但是他的生命週期是獨立於pod的,這裏與volume行爲不同。 它可獲取NFS、iSCSI等存儲系統的存儲實現的詳細信息。

PVC是用戶容器對存儲的需求,它類似於podpod消耗節點資源而PVC消耗PV資源。PVC可以請求具體大小的PV資源和掛載方式。

通過針對不同問題使用PV的多種特性。集羣管理員需要提供多種功能不同的PV(不僅限於對一種存儲的大小和訪問模式不同),這些PV不需要用戶瞭解存儲類別實現,由此引入了StorageClass

多種存儲類型抽象爲StorageClass, 多種StorageClass整合爲集羣PV資源,Pod根據模板定義創建PVC來使用這些PV資源。

volume和Claim的生命週期

資源供應

  1. 靜態
    集羣管理員創建一些PV,他們帶有實際存儲的詳細信息供用戶使用。
  2. 動態
    用戶通過PVC聲明需要綁定的靜態PV,如果沒有匹配到,將嘗試爲PVC動態創建卷。動態創建建立在StorageClass的基礎上: PVC必須請求了具體類型的StorageClass並且集羣管理員預先設置了這個class才能完成動態創建。
    使用StorageClass需要在apiServer的啓動參數--enable-admisson-plugins的列表中添加DefaultStorageClass來開啓。

綁定
一個具有確定大小和訪問模式的PVC被創建後,controlLoop將watch到此PVC併爲其匹配已存在PV,匹配到時執行bind。
如果這個PV是由PVC需求而被動態創建的,controllerLoop將總是將這兩個bind。
非動態創建時,用戶可能獲得 size大於等於所需的PV
之後PVCPV綁定是一對一映射的,使用ClaimRef來雙向驗證。
如果沒有符合添加的PVPVC將無限期保持非綁定狀態直到有OK的PV可綁定轉爲可用狀態。

使用
pod將PVC視爲存儲卷,集羣會檢查PVC綁定的存儲卷並將其載入pod。其中用戶可指定期望的訪問模式。
一旦用戶綁定了某個PVC,將可以在需要的時候無限使用

使用中的存儲對象保護
這裏指的是 確保在使用的pod綁定的PVC和該PVC綁定的PV不會被系統移除,造成數據的丟失。

如果用戶刪除Pod正在使用的PVC,這個PVC將被延遲到不再有任何pod使用它才刪除。
如果管理員刪除了PV,這個PV將被延遲到不再有任何PVC綁定它才刪除。

當在PV、PVC中配置了Finalizers: [kubernetes.io/pvc-protection],如果被刪除,將收到刪除保護行爲。

存儲資源回收

當用戶使用完卷,就可以刪除這個PVC去釋放資源,PVC配置的Reclaim Policy標識處理已被Claim釋放的卷應該如何處理,有保留、刪除、回收三種方式。
保留
保留回收策略允許手動回收資源。當PVC被刪除時,對應的PV將一直存在並轉爲released態,但是它不能被下一個PVC使用因爲上一個的數據還在,管理員可以通過以下方式手動回收:

  1. 刪除PV。刪除後, 外部基礎架構中關聯的存儲(例如AWS EBS,GCE PD,Azure Disk或Cinder卷)依然存在。
  2. 手動清理關聯外部存儲上的數據。
  3. 手動刪除存儲。如果要重新使用,使用外部存儲創建一個新的PV。

刪除
對於支持Delete Policy的存儲插件,刪除操作將會同時刪除PV對象和外部存儲(例如AWS EBS,GCE PD,Azure Disk或Cinder卷)。被動態創建的存儲將繼承他們的StorageClass的回收行爲,默認爲刪除。這裏根據用戶期望來配置StorageClass, 否則就要在PV創建後去更新PV了。

回收 (不推薦使用) 下面的例子還沒測過
如果底層存儲插件支持,Recycle策略將在那塊存儲上執行一個基本的清理(rm -rf /thevolume/*)使其可以被下一個claim綁定。
管理與那可以將清理操作配置在pod裏,讓k8sControllerManager去處理它。配置方式如下:

apiVersion: v1
kind: Pod
metadata:
  name: pv-recycler
  namespace: default
spec:
  restartPolicy: Never
  volumes:
  - name: vol
    hostPath:
      path: /any/path/it/will/be/replaced
  containers:
  - name: pv-recycler
    image: "k8s.gcr.io/busybox"
    command: ["/bin/sh", "-c", "test -e /scrub && rm -rf /scrub/..?* /scrub/.[!.]* /scrub/*  && test -z \"$(ls -A /scrub)\" || exit 1"]
    volumeMounts:
    - name: vol
      mountPath: /scrub

擴展PVC

k8s-v1.11之後,PVC默認開啓可使用擴展存儲。支持類型如下:
gcePersistentDisk、awsElasticBlockStore、Cinder、glusterfs、rbd、AzureFile、AzureDisk、Portworx、FlexVolume、CSI

對於底層存儲StorageClass,只有配置了allowVolumeExpansion纔可被PVC使用。
如果更新了PVC的大小,將觸發底層存儲大小的擴展。注意這裏:不是去創建一個新size的PV,而是重新調整已存在存儲的大小。

調整包含文件系統的卷的大小
僅當包含的文件系統爲XFS、Ext3或Ext4 並且綁定的PVC爲讀寫模式時,可以重新調整存儲大小,當Pod啓動時或pod運行並且基礎文件系統支持聯機擴展時,完成文件系統擴展。
如果將RequiresFSResize設置爲true,則可以在pod重啓動時調整FlexVolume大小。

調整在使用的PVC的大小
v1.15後,ExpandInUsePersistentVolume功能被開啓。
當文件系統擴展後,所有使用中的PVC都將自動供其pod使用,此功能對未使用的·PVC`無效。與其他卷類型類似-當由pod使用時,flexVolume卷也可以擴展。

PV類型

每個PV對象包含spec和status描述存儲卷的信息和狀態,pv.name必須是一個有效的dns域名,下面是個簡單的pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
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

capacity

通常,PV將有指定的大小。請參閱這裏以瞭解容量相關的單位。
當前,存儲大小是可以設置或請求的唯一資源。將來的屬性可能包括IOPS,吞吐量等。

volumeMode

V1.9之前,所有PV都被創建了文件系統。現在可以設置volumeMode=block使用原始的塊設備,或者設置volumeMode=filesystem去使用文件系統的。

accessModes

可對根據底層存儲可支持的訪問模式去選擇指定PV的訪問模式。例如NFS支持多種讀/寫模式,但NFS PV僅支持只讀。
訪問模式共三種:
ReadWriteOnce 存儲可被掛載在單獨node上進行讀寫
ReadOnlyMany 存儲可被掛載到多個node上讀
ReadWriteMany 存儲可被掛載到多個node上讀寫

具體還得看底層存儲支持情況,上層PV才能支持。

Class

通過StorageClassName指定要使用的StorageClass,指定了class的PV將綁定給明確需求此class類型的PVC。如果不指定此值,將綁定給不明確需求的PVC

mount Options

k8s可爲某些存儲類型的PV指定掛載參數

Node Affinity

節點親和性,通過selector方式限制node是否可訪問。

Phase

共四種狀態
Available 尚未綁定到claim的空閒資源
Bound 已綁定到claim的存儲
Released 綁定的claim已經被刪除,但資源還被保留在集羣中
Failed 該卷自動回收失敗

PVC

同PV,包含spec和status,且pvc.name必須是個有效的dns子域名
訪問模式 ~
卷模式 選擇以 塊設備模式 或者 文件系統模式 使用PV
資源 通過storage: 8Gi 指定所需大小
選擇器 其下指定selector規則匹配volume,匹配才能使用
Class
這個還是通過StorageClassName指定,分三種情況

  1. 指定StorageClass, 僅綁定相同class的PV
  2. SCName=”“ 僅綁定class=”“的PV
  3. 未指定SCname 如果開啓了admissionPlugin並設置了DefaultStorageClass,PVC將按默認配置綁定。如果不開啓或未設置,將按 =""處理。

原生塊設備支持

以下卷支持原始塊設備模式,包括自動創建需求。
AWSWlasticBlockStore、AzureDisk、FC、GCEPersisitentDisk、iScsi、Localvolume、RBD(Ceph Block Device)、VsphereVolume
只要底層存儲類型支持,只要在對應PVPVC的volumeMode填寫Block即可

卷快照和從快照恢復卷

通過pvc中的dataSource.kind = VolumeSnapshot來配置支持從存儲卷快照 中 恢復存儲卷。

卷克隆

通過設置dataSource.kind = PersistentVolumeClaim ,由一個有已存在pvc克隆另一個

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章