原文地址: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
文檔描述PersistentVolume目前在k8s中的使用情況。
管理計算實例的直接問題就是管理存儲,引入PersisitentVolume
子系統提供給用戶和管理員,抽象描述了存儲如何被提供。爲此,提供了PersistentVolume
和PersistentVolumeClaim
資源對象。以下統稱PV
,PVC
。
名詞概念
PV
是集羣中已初始化的一塊存儲。一般由管理員或動態配置使用Storage Classes
初始化。PV
是集羣資源,類似volumes的存儲插件,但是他的生命週期是獨立於pod的,這裏與volume行爲不同。 它可獲取NFS、iSCSI等存儲系統的存儲實現的詳細信息。
PVC
是用戶容器對存儲的需求,它類似於pod
。pod
消耗節點資源而PVC
消耗PV
資源。PVC
可以請求具體大小的PV
資源和掛載方式。
通過針對不同問題使用PV
的多種特性。集羣管理員需要提供多種功能不同的PV
(不僅限於對一種存儲的大小和訪問模式不同),這些PV
不需要用戶瞭解存儲類別實現,由此引入了StorageClass
。
多種存儲類型抽象爲StorageClass
, 多種StorageClass
整合爲集羣PV
資源,Pod根據模板定義創建PVC
來使用這些PV資源。
volume和Claim的生命週期
資源供應
- 靜態
集羣管理員創建一些PV
,他們帶有實際存儲的詳細信息供用戶使用。 - 動態
用戶通過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
。
之後PVC
和PV
綁定是一對一映射的,使用ClaimRef
來雙向驗證。
如果沒有符合添加的PV
,PVC
將無限期保持非綁定狀態直到有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
使用因爲上一個的數據還在,管理員可以通過以下方式手動回收:
- 刪除
PV
。刪除後, 外部基礎架構中關聯的存儲(例如AWS EBS,GCE PD,Azure Disk或Cinder卷)依然存在。 - 手動清理關聯外部存儲上的數據。
- 手動刪除存儲。如果要重新使用,使用外部存儲創建一個新的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
指定,分三種情況
- 指定StorageClass, 僅綁定相同class的PV
- SCName=”“ 僅綁定class=”“的PV
- 未指定SCname 如果開啓了admissionPlugin並設置了DefaultStorageClass,PVC將按默認配置綁定。如果不開啓或未設置,將按 =""處理。
原生塊設備支持
以下卷支持原始塊設備模式,包括自動創建需求。
AWSWlasticBlockStore、AzureDisk、FC、GCEPersisitentDisk、iScsi、Localvolume、RBD(Ceph Block Device)、VsphereVolume
只要底層存儲類型支持,只要在對應PV
、PVC
的volumeMode填寫Block即可
卷快照和從快照恢復卷
通過pvc中的dataSource.kind = VolumeSnapshot
來配置支持從存儲卷快照 中 恢復存儲卷。
卷克隆
通過設置dataSource.kind = PersistentVolumeClaim
,由一個有已存在pvc克隆另一個