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服務器上先建立存儲卷對應的目錄
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.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,存儲大小各不相同,是否可讀也不相同
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
1m
pv005 15Gi RWO,RWX Retain Available 1m
|
(3)查詢業務驗證
1
2
3
4
5
|
[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
>
|