kubernetes系列11—PV和PVC詳解
本文收錄在 容器技術學習系列文章總目錄
1、認識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
nfs伺服器在上一篇已經部署,詳情請看上一篇部落格。
2.1 準備 nfs 服務
( 1)在 nfs 伺服器上先建立儲存卷對應的目錄
[root@nfs ~]# cd /data/volumes/ [root@nfs volumes]# mkdir v{1,2,3,4,5} [root@nfs volumes]# ls index.htmlv1v2v3v4v5 [root@nfs volumes]# echo "<h1>NFS stor 01</h1>" > v1/index.html [root@nfs volumes]# echo "<h1>NFS stor 02</h1>" > v2/index.html [root@nfs volumes]# echo "<h1>NFS stor 03</h1>" > v3/index.html [root@nfs volumes]# echo "<h1>NFS stor 04</h1>" > v4/index.html [root@nfs volumes]# echo "<h1>NFS stor 05</h1>" > v5/index.html
( 2)修改 nfs 的配置
[root@nfs volumes]# vim /etc/exports /data/volumes/v1192.168.130.0/24(rw,no_root_squash) /data/volumes/v2192.168.130.0/24(rw,no_root_squash) /data/volumes/v3192.168.130.0/24(rw,no_root_squash) /data/volumes/v4192.168.130.0/24(rw,no_root_squash) /data/volumes/v5192.168.130.0/24(rw,no_root_squash)
( 3)檢視 nfs 的配置
[root@nfs volumes]# exportfs -arv exporting 192.168.130.0/24:/data/volumes/v5 exporting 192.168.130.0/24:/data/volumes/v4 exporting 192.168.130.0/24:/data/volumes/v3 exporting 192.168.130.0/24:/data/volumes/v2 exporting 192.168.130.0/24:/data/volumes/v1
( 4)是配置生效
[root@nfs volumes]# showmount -e Export list for nfs: /data/volumes/v5 192.168.130.0/24 /data/volumes/v4 192.168.130.0/24 /data/volumes/v3 192.168.130.0/24 /data/volumes/v2 192.168.130.0/24 /data/volumes/v1 192.168.130.0/24
2.2 在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 NAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGE pv0015GiRWO,RWXRetainAvailable9s pv0025GiRWORetainAvailable9s pv0035GiRWO,RWXRetainAvailable9s pv00410GiRWO,RWXRetainAvailable9s pv00515GiRWO,RWXRetainAvailable9s
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 NAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGE mypvcBoundpv00410GiRWO,RWX24s [root@master ~]# kubectl get pv NAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGE pv0015GiRWO,RWXRetainAvailable1m pv0025GiRWORetainAvailable1m pv0035GiRWO,RWXRetainAvailable1m pv00410GiRWO,RWXRetainBounddefault/mypvc1m pv00515GiRWO,RWXRetainAvailable1m
( 3)查詢業務驗證
[root@master ~]# kubectl get pods -o wide NAMEREADYSTATUSRESTARTSAGEIPNODE vol-pvc1/1Running059s10.244.2.117node2 [root@master ~]# curl 10.244.2.117 <h1>NFS stor 04</h1>
本篇本來還想再寫2個特色的儲存卷 configmap和secret 的解析和使用,但是博主今天又些急事,改天在下一篇補上;本篇內容有些少,還望大家見諒~