Kubernetes之十四----PV和PVC詳解

認識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 – 卷自動回收失敗

 

1.5 存儲綁定 

用戶基於一系列存儲需求和訪問模式定義好 PVC 後, Kubernetes 系統的控制器即會爲 其查找匹配的 PV,並於找到之後在此二者之間建立起關聯關係,而後它們二者之間的狀態 即轉爲“綁定”(Binding)。 若 PV 是爲 PVC 而動態創建的 , 則該 PY 專用於其 PVC。 若是無法爲 PVC 找到可匹配的 PY,則 PVC 將一直處於未綁定( unbound)狀態,直到 有符合條件的 PV 出現並完成綁定方纔可用。

( 1 )存儲使用(Using) Pod 資源基於 p巳rsistenVolumeClaim 卷類型的定義,將選定的 PVC 關聯爲存儲卷,而 後即可爲內部的容器所使用。 對於支持多種訪問模式的存儲捲來說,用戶需要額外指定要使 用的模式。一旦完成將存儲卷掛載至 Pod 對象內的容器中,其應用即可使用關聯的 PV 提供 的存儲空間。

( 2 ) PVC 保護(Protection) 爲了避免使用中的存儲卷被移除而導致數據丟失, Kubernetes 自 1.9 版本起引入了 “ PVC 保護機制” 。 啓用了此特性後,萬一有用戶刪除了仍處於某 Pod 資源使用中的 PVC 時, Kubernetes 不會立即予以移除,而是推遲到不再被任何 Pod 資源使用後方才執行刪除操 作。 處於此種階段的 PVC 資源的 status 宇段爲“ Termination ” ,並且其 Finalizers 字段中包 含“ kubernetes.io/pvc-protection” 。

 

1.6 PVC 保護(Protection) 

爲了避免使用中的存儲卷被移除而導致數據丟失,啓用了此特性後,萬一有用戶刪除了仍處於某 Pod 資源使用中的 PVC 時, Kubernetes 不會立即予以移除,而是推遲到不再被任何 Pod 資源使用後方才執行刪除操 作。 處於此種階段的 PVC 資源的 status 宇段爲“ Termination ” ,並且其 Finalizers 字段中包 含“ kubernetes.io/pvc-protection” 。

1.7 存儲回收( Reclaiming) 

完成存儲卷的使用目標之後, 即可刪除 PVC 對象以便進行資源回收。 不過,至於如 何操作則取決於 PV 的回收策略。 目 前,可用的回收策略有三種 : R巳tained、 Recycled 和
Deleted。

( 1 )留存(Retain ) 

留存策略意味着在刪除 PVC 之後, Kubernetes 系統不會自動刪除 PY ,而僅僅是將 它置於“釋放”(released)狀態。 不過,此種狀態的 PV 尚且不能被其他 PVC 申請所綁定, 因爲此前的申請生成的數據仍然存在,需要由管理員於動決定其後續處理方案。 這就 意味着,如果想要再次使用此類的 PV 資源 ,則需要由管理員按下面的步驟手動執行刪除 操作。

  • 刪除 PV,這之後,此 PY 的數據依然留存於外部的存儲之上。
  • 手工清理存儲系統上依然留存的數據。
  • 手工刪除存儲系統級的存儲卷(例如, RBD 存儲系統上的 image)以釋放空間,以 便再次創建,或者直接將其重新創建爲 PV。

( 2 )回收(Recycle)

如果可被底層存儲插件支持,資源回收策略會在存儲捲上執行數據刪除操作並讓 PV 資師、再次變爲可被 Claim。 另外,管理員也可以配置一個自定義的回收器 Pod 模板,以便執行 自定義的回收操作。 不過,此種回收策略行將廢棄。 

( 3 )刪除(Delete)

對於支持 Deleted 回收策略的存儲插件來說,在 PVC 被刪除後會直接移除 PV 對象,同 時移除的還有 PY 相關的外部存儲系統上的存儲資產( asset)。 支持這種操作的存儲系統有 AWS EBS , GCE PD 、 Azure Disk 或 Cinder。 動態創建的 PV 資源的回收策略取決於相關存 儲類上的定義,存儲類上相關的默認策略爲 Delete ,大多數情況下,管理員都需要按用戶期 望的處理機制修改此默認策略 ,以免導致數據非計劃內的誤刪除。

2、創建PV

2.1 準備nfs服務

(1)在nfs服務器上先建立存儲卷對應的目錄

1
2
3
4
5
6
7
8
9
[root@nfs ~]# cd /data/volumes/
[root@nfs volumes]# mkdir v{1,2,3,4,5}
[root@nfs volumes]# ls
index.html  v1  v2  v3  v4  v5
[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的配置

1
2
3
4
5
6
[root@nfs volumes]# vim /etc/exports
/data/volumes/v1        192.168.130.0/24(rw,no_root_squash)
/data/volumes/v2        192.168.130.0/24(rw,no_root_squash)
/data/volumes/v3        192.168.130.0/24(rw,no_root_squash)
/data/volumes/v4        192.168.130.0/24(rw,no_root_squash)
/data/volumes/v5        192.168.130.0/24(rw,no_root_squash)

  

(3)查看nfs的配置

1
2
3
4
5
6
[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)使配置生效

1
2
3
4
5
6
7
[root@nfs volumes]# showmount -e
Export list for nfs:
/data/volumes/v5 192.168.7.0/24
/data/volumes/v4 192.168.7.0/24
/data/volumes/v3 192.168.7.0/24
/data/volumes/v2 192.168.7.0/24
/data/volumes/v1 192.168.7.0/24

 

(5)啓動nfs服務器

# systemctl start nfs

  

2.2 在master上創建PV

(1)編寫yaml文件,並創建pv

創建5個pv,存儲大小各不相同,是否可讀也不相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
[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)查詢驗證

1
2
3
4
5
6
7
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[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上

1
2
3
4
5
6
7
8
9
10
[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 # 綁定到pv4上                            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>

  

4、刪除Pod、PVC、PV

1、此時我們如果想刪除PVC,就必須先刪除Pod才能刪除PVC,因爲PVC有受保護機制,無法直接刪除。

[root@master ~]# kubectl get pvc   # 查看此時的PVC名稱
NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc   Bound    pv004    10Gi       RWO,RWX                       14m
[root@master ~]# kubectl delete pvc mypvc   #刪除PVC,此時是受保護狀態,無法刪除
persistentvolumeclaim "mypvc" deleted

 

2、開啓新的k8s-master窗口刪除Pod,此時上面執行刪除PVC的操作也會被執行

[root@master ~]# kubectl get pods    # 查看此時的pod名稱
NAME      READY   STATUS    RESTARTS   AGE
vol-pvc   1/1     Running   0          17m
[root@master ~]# kubectl delete pod vol-pvc   # 刪除對應的pod
pod "vol-pvc" deleted

#########此時查看上面刪除PVC的操作也被執行了
[root@master ~]# kubectl delete pvc mypvc 
persistentvolumeclaim "mypvc" deleted

 

3、刪除完PVC後,此時PV就處於釋放空閒狀態

[root@master ~]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   2Gi        RWO,RWX        Retain           Available                                           24m
pv002   5Gi        RWO            Retain           Available                                           24m
pv003   20Gi       RWO,RWX        Retain           Available                                           24m
pv004   10Gi       RWO,RWX        Retain           Released    default/mypvc                           24m
pv005   15Gi       RWO,RWX        Retain           Available                                           24m

 

4、如果此時知道PV不再使用,也可以將PV刪除,最後將在NFS服務器上共享的文件也一併刪除,如果不確定文件是否還使用,可以將共享的文件先移動到其他目錄,以防再次使用

[root@master ~]# kubectl delete pv pv004  # 刪除PV
persistentvolume "pv004" deleted


########此時我們在NFS共享服務器的指定目錄下,將對應的共享文件移動到指定目錄下,進行備份
[root@mon03volumes]#cd v4
[root@mon03v4]#pwd
/data/volumes/v4
[root@mon03v4]#ll
total 4
-rw-r--r-- 1 root root 21 Aug 2 22:13 index.html
[root@mon03v4]#rm -rf ./*   # 如果文件還在使用,最好是移動到其他目錄進行備份

  

 

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