Kubernetes PV & pvc
介紹
PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的兩種API資源,用于抽象存儲細節(jié)。管理員關(guān)注于如何通過pv提供存儲功能而無需
關(guān)注用戶如何使用彩掐,同樣的用戶只需要掛載pvc到容器中而不需要關(guān)注存儲卷采用何種技術(shù)實現(xiàn)凫海。
pvc和pv的關(guān)系與pod和node關(guān)系類似寂汇,前者消耗后者的資源。pvc可以向pv申請指定大小的存儲資源并設置訪問模式,這就可以通過Provision -> Claim 的方式,來對存儲資源進行控制罩锐。
生命周期
pv和pvc遵循以下生命周期:
供應準備。通過集群外的存儲系統(tǒng)或者云平臺來提供存儲持久化支持卤唉。
- 靜態(tài)提供:管理員手動創(chuàng)建多個PV涩惑,供PVC使用。
- 動態(tài)提供:動態(tài)創(chuàng)建PVC特定的PV桑驱,并綁定竭恬。綁定。用戶創(chuàng)建pvc并指定需要的資源和訪問模式熬的。在找到可用pv之前痊硕,pvc會保持未綁定狀態(tài)。
使用押框。用戶可在pod中像volume一樣使用pvc岔绸。
釋放。用戶刪除pvc來回收存儲資源,pv將變成“released”狀態(tài)盒揉。由于還保留著之前的數(shù)據(jù)晋被,這些數(shù)據(jù)需要根據(jù)不同的策略來處理,否則這些存儲資源無法被其他pvc使用刚盈。
-
回收(Reclaiming)羡洛。pv可以設置三種回收策略:保留(Retain),回收(Recycle)和刪除(Delete)藕漱。
- 保留策略:允許人工處理保留的數(shù)據(jù)欲侮。
- 刪除策略:將刪除pv和外部關(guān)聯(lián)的存儲資源,需要插件支持肋联。
- 回收策略:將執(zhí)行清除操作锈麸,之后可以被新的pvc使用,需要插件支持牺蹄。目前只有NFS和HostPath類型卷支持回收策略忘伞,AWS EBS,GCE PD,Azure Disk和Cinder支持刪除(Delete)策略。
Provisioning
兩種方式提供的PV資源供給:
-
static
通過集群管理者創(chuàng)建多個PV沙兰,為集群“使用者”提供存儲能力而隱藏真實存儲的細節(jié)氓奈。并且存在于kubenretes api中,可被直接使用鼎天。
-
dynamic
動態(tài)卷供給是kubernetes獨有的功能舀奶,這一功能允許按需創(chuàng)建存儲建。在此之前斋射,集群管理員需要事先在集群外由存儲提供者或者云提供商創(chuàng)建
存儲卷育勺,成功之后再創(chuàng)建PersistentVolume對象,才能夠在kubernetes中使用罗岖。動態(tài)卷供給能讓集群管理員不必進行預先創(chuàng)建存儲卷涧至,而是隨著用戶需求
進行創(chuàng)建。在1.5版本提高了動態(tài)卷的彈性和可用性桑包。
在此前1.4版本中加入了一個 新的 API 對象 StorageClass南蓬,可以定義多個 StorageClass 對象,并可以分別指定存儲插件哑了、設置參數(shù)赘方,用于提
供不同的存儲卷。這樣的設計讓集群管理員能夠在同一個集群內(nèi)弱左,定義和提供不同類型的窄陡、不同參數(shù)的卷(相同或者不同的存儲系統(tǒng))。這樣的設計還確
保了最終用戶在無需了解太多的情況下拆火,有能力選擇不同的存儲選項跳夭。
PV類型
pv支持以下類型:
- GCEPersistentDisk
- AWSElasticBlockStore
- NFS
- iSCSI
- RBD (Ceph Block Device)
- Glusterfs
- AzureFile
- AzureDisk
- CephFS
- cinder
- FC
- FlexVolume
- Flocker
- PhotonPersistentDisk
- Quobyte
- VsphereVolume
- HostPath (single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
PV屬性:
- 訪問模式,與pv的語義相同鳖悠。在請求資源時使用特定模式。
- 資源,申請的存儲資源數(shù)額优妙。
PV卷階段狀態(tài):
- Available – 資源尚未被claim使用
- Bound – 卷已經(jīng)被綁定到claim了
- Released – claim被刪除乘综,卷處于釋放狀態(tài),但未被集群回收套硼。
- Failed – 卷自動回收失敗
AwsElasticBlockServer 靜態(tài)PV示例
需要滿足以下條件方可使用EBS:
- Pod運行的節(jié)點必須為AWS EC2實例
- 這些示例需要和EBS在同一個區(qū)域和可用區(qū)域
- EBS只支持一個EC2掛載一個卷
- RC或者Deployment 副本集只能為1卡辰。
1. 創(chuàng)建PV(Persistent Volume)
$ vim ebs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: ebs-pv
labels:
type: amazonEBS
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
awsElasticBlockStore:
volumeID: vol-079c492115a7be6e1
fsType: ext4
$ kubectl create -f ebs-pv.yaml
persistentvolume "ebs-pv" created
2. 創(chuàng)建PVC(Persistent Volume Claim)
$ vim nginx-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
labels:
type: amazonEBS
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
$ kubectl create -f nginx-pvc.yaml
persistentvolumeclaim "nginx-pvc" created
3.創(chuàng)建deployment服務使用pvc資源
$ vim nginx-with-pvc.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-with-pvc
spec:
replicas: 1
template:
metadata:
labels:
service: nginx
app: test
spec:
containers:
- image: nginx
name: nginx-with-pvc
volumeMounts:
- mountPath: /test-ebs
name: my-pvc
volumes:
- name: my-pvc
persistentVolumeClaim:
claimName: nginx-pvc
kubectl create -f nginx-with-pvc.yaml
Deployment "nfs-web" created
注意事項
- 由于aws ebs限制一個ebs只能同時掛載一個ec2,在使用基于pvc的pod時,建議使用replicas=1來創(chuàng)建一個部署集邪意。StatefulSet可解決數(shù)據(jù)庫集群問題九妈。
- pod遷移,pvc遷移(卸載舊實例/掛載新實例)默認35秒。
- 通過deployemnt部署雾鬼,刪除deployment之后萌朱,可重新掛載原有pvc到新的pod里面。
- 當pod被刪除策菜,同時刪除依賴的pvc晶疼,pv狀態(tài)變更為release。此時不能被其他pvc使用又憨,aws ebs需要delete pv重建翠霍。目前不支持通過手動回收
。
- 已經(jīng)被pvc綁定的pv可以被刪除蠢莺,刪除后對應的pvc仍為Bound狀態(tài)寒匙。如有pod正在使用此pvc則仍可使用。如無pod使用躏将,則創(chuàng)建pod掛載此pvc時
會出現(xiàn)失敗锄弱。
- pv可以在綁定后被編輯(如訪問模式,容量)祸憋,導致信息與對應的pvc不一致会宪。