初識PV、PVC、StorageClass
1.1 介紹
管理存儲是管理計算的一個明顯問題。該PersistentVolume子系統爲用戶和管理員提供了一個API,用於抽象如何根據消費方式提供存儲的詳細信息。爲此,我們引入了兩個新的API資源:PersistentVolume和PersistentVolumeClaim
PersistentVolume(PV)是集羣中由管理員配置的一段網絡存儲。 它是集羣中的資源,就像節點是集羣資源一樣。 PV是容量插件,如Volumes,但其生命週期獨立於使用PV的任何單個pod。 此API對象捕獲存儲實現的詳細信息,包括NFS,iSCSI或特定於雲提供程序的存儲系統。
PersistentVolumeClaim(PVC)是由用戶進行存儲的請求。 它類似於pod。 Pod消耗節點資源,PVC消耗PV資源。Pod可以請求特定級別的資源(CPU和內存)。聲明可以請求特定的大小和訪問模式(例如,可以一次讀/寫或多次只讀)。
雖然PersistentVolumeClaims允許用戶使用抽象存儲資源,但是PersistentVolumes對於不同的問題,用戶通常需要具有不同屬性(例如性能)。羣集管理員需要能夠提供各種PersistentVolumes不同的方式,而不僅僅是大小和訪問模式,而不會讓用戶瞭解這些卷的實現方式。對於這些需求,有StorageClass 資源。
StorageClass爲管理員提供了一種描述他們提供的存儲的“類”的方法。 不同的類可能映射到服務質量級別,或備份策略,或者由羣集管理員確定的任意策略。 Kubernetes本身對於什麼類別代表是不言而喻的。 這個概念有時在其他存儲系統中稱爲“配置文件”。
PVC和PV是一一對應的。
1.2 生命週期
PV是羣集中的資源。PVC是對這些資源的請求,並且還充當對資源的檢查。PV和PVC之間的相互作用遵循以下生命週期:
Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling
-
供應準備Provisioning
—通過集羣外的存儲系統或者雲平臺來提供存儲持久化支持。
- - 靜態提供Static:集羣管理員創建多個PV。 它們攜帶可供集羣用戶使用的真實存儲的詳細信息。 它們存在於Kubernetes API中,可用於消費
- - 動態提供Dynamic:當管理員創建的靜態PV都不匹配用戶的PersistentVolumeClaim時,集羣可能會嘗試爲PVC動態配置卷。 此配置基於StorageClasses:PVC必須請求一個類,並且管理員必須已創建並配置該類才能進行動態配置。 要求該類的聲明有效地爲自己禁用動態配置。
-
綁定Binding—用戶創建pvc並指定需要的資源和訪問模式。在找到可用pv之前,pvc會保持未綁定狀態。
-
使用Using—用戶可在pod中像volume一樣使用pvc。
-
釋放Releasing—用戶刪除pvc來回收存儲資源,pv將變成“released”狀態。由於還保留着之前的數據,這些數據需要根據不同的策略來處理,否則這些存儲資源無法被其他pvc使用。
-
回收Recycling
—pv可以設置三種回收策略:保留(Retain),回收(Recycle)和刪除(Delete)。
- - 保留策略:允許人工處理保留的數據。
- - 刪除策略:將刪除pv和外部關聯的存儲資源,需要插件支持。
- - 回收策略:將執行清除操作,之後可以被新的pvc使用,需要插件支持。
注:目前只有NFS和HostPath類型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持刪除(Delete)策略。
1.3 PV類型
- GCEPersistentDisk
- AWSElasticBlockStore
- AzureFile
- AzureDisk
- 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
1.4 PV卷階段狀態
- Available – 資源尚未被claim使用
- Bound – 卷已經被綁定到claim了
- Released – claim被刪除,卷處於釋放狀態,但未被集羣回收。
- Failed – 卷自動回收失敗
2、演示:創建PV
2.1 在master上創建PV
(1)編寫yaml文件,並創建pv
創建5個pv,存儲大小各不相同,是否可讀也不相同
[root@master volumes]# vim pv-damo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /data/volumes/v1
server: nfs
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /data/volumes/v2
server: nfs
accessModes: ["ReadWriteOnce"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /data/volumes/v3
server: nfs
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /data/volumes/v4
server: nfs
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
spec:
nfs:
path: /data/volumes/v5
server: nfs
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 15Gi
[root@master volumes]# kubectl apply -f pv-damo.yaml
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created
(2)查詢驗證
[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 5Gi RWO,RWX Retain Available 9s
pv002 5Gi RWO Retain Available 9s
pv003 5Gi RWO,RWX Retain Available 9s
pv004 10Gi RWO,RWX Retain Available 9s
pv005 15Gi RWO,RWX Retain Available 9s
3、創建PVC,綁定PV
(1)編寫yaml文件,並創建pvc
創建一個pvc,需要6G存儲;所以不會匹配pv001、pv002、pv003
[root@master volumes]# vim vol-pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: default
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 6Gi
---
apiVersion: v1
kind: Pod
metadata:
name: vol-pvc
namespace: default
spec:
volumes:
- name: html
persistentVolumeClaim:
claimName: mypvc
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
[root@master volumes]# kubectl apply -f vol-pvc-demo.yaml
persistentvolumeclaim/mypvc created
pod/vol-pvc created
(2)查詢驗證:pvc已經綁定到pv004上
[root@master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound pv004 10Gi RWO,RWX 24s
[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 5Gi RWO,RWX Retain Available 1m
pv002 5Gi RWO Retain Available 1m
pv003 5Gi RWO,RWX Retain Available 1m
pv004 10Gi RWO,RWX Retain Bound default/mypvc 1m
pv005 15Gi RWO,RWX Retain Available 1m
(3)查詢業務驗證
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
vol-pvc 1/1 Running 0 59s 10.244.2.117 node2
[root@master ~]# curl 10.244.2.117
<h1>NFS stor 04</h1>