1、emptyDir
EmptyDir是最基礎(chǔ)的Volume類型榆浓,一個(gè)EmptyDir就是Host上的一個(gè)空目錄于未。
EmptyDir是在Pod被分配到Node時(shí)創(chuàng)建的,它的初始內(nèi)容為空陡鹃,并且無須指定宿主機(jī)上對(duì)應(yīng)的目錄文件烘浦,因?yàn)閗ubernetes會(huì)自動(dòng)分配一個(gè)目錄,當(dāng)Pod銷毀時(shí)萍鲸, EmptyDir中的數(shù)據(jù)也會(huì)被永久刪除闷叉。
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
namespace: default
spec:
containers:
- name: web
image: nginx:1.14
volumeMounts:
- name: web-volume
mountPath: /usr/share/nginx/html
readOnly: true
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
args:
- "-c"
- "while true;do echo $(date) >> /data/index.html;sleep 1;done"
volumeMounts:
- name: web-volume
mountPath: /data
volumes:
- name: web-volume
emptyDir:
medium: Memory
sizeLimit: 10Mi
驗(yàn)證
[root@master volume]# kubectl get po pod-emptydir -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-emptydir 2/2 Running 0 29s 10.244.1.132 node2 <none> <none>
[root@master volume]# curl 10.244.1.132
Thu Dec 2 14:01:16 UTC 2021
Thu Dec 2 14:01:17 UTC 2021
Thu Dec 2 14:01:18 UTC 2021
......
2、hostPath
HostPath就是將Node主機(jī)中一個(gè)實(shí)際目錄掛在到Pod中脊阴,以供容器使用握侧,這樣的設(shè)計(jì)就可以保證Pod銷毀了,但是數(shù)據(jù)依據(jù)可以存在于Node主機(jī)上嘿期。
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
namespace: default
spec:
containers:
- name: web
image: nginx:1.14
volumeMounts:
- name: web-hostpath
mountPath: /usr/share/nginx/html
readOnly: true
volumes:
- name: web-hostpath
hostPath:
path: /data/web
type: DirectoryOrCreate
驗(yàn)證
[root@master volume]# kubectl get po pod-hostpath -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hostpath 1/1 Running 0 58s 10.244.1.134 node2 <none> <none>
[root@node2 ~]# echo myWeb_hostPath > /data/web/index.html
[root@master volume]# curl 10.244.1.134
myWeb_hostPath
關(guān)于type字段的說明:
DirectoryOrCreate 目錄存在就使用品擎,不存在就先創(chuàng)建后使用
Directory 目錄必須存在
FileOrCreate 文件存在就使用,不存在就先創(chuàng)建后使用
File 文件必須存在
Socket unix套接字必須存在
CharDevice 字符設(shè)備必須存在
BlockDevice 塊設(shè)備必須存在
3秽五、第三方存儲(chǔ)卷配置
emptyDir和hostPath的數(shù)據(jù)并不能真正意義上保存孽查,如果真正意義上保存還需要使用第三方存儲(chǔ)。k8s支持的第三方后端存儲(chǔ)有awsElasticBlockStore坦喘、azureDisk盲再、cephfs西设、glusterfs、cinder答朋、fc贷揽、iscsi、nfs梦碗、rbd禽绪、scaleIO等
具體支持的第三方設(shè)備及其配置參數(shù)可查看官方文檔https://kubernetes.io/docs/concepts/storage/volumes/
以nfs為例
[root@master volume]# vim /etc/exports
/data/volume1 192.168.1.0/24(rw,root_squash,sync)
kind: Pod
metadata:
name: pod-nfs
namespace: default
spec:
containers:
- name: web
image: nginx:1.14
volumeMounts:
- name: web-nfs
mountPath: /usr/share/nginx/html
readOnly: true
volumes:
- name: web-nfs
nfs:
path: /data/volume1
server: 192.168.1.51
驗(yàn)證
[root@master volume]# kubectl get po pod-nfs -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nfs 1/1 Running 0 18s 10.244.2.124 node1 <none> <none>
[root@master volume]# echo test-nfs-volume > /data/volume1/index.html
[root@master volume]# curl 10.244.2.124
test-nfs-volume
4、PV洪规,PVC
管理存儲(chǔ)是管理計(jì)算的一個(gè)明顯問題印屁。該P(yáng)ersistentVolume子系統(tǒng)為用戶和管理員提供了一個(gè)API,用于抽象如何根據(jù)消費(fèi)方式提供存儲(chǔ)的詳細(xì)信息斩例。為此雄人,我們引入了兩個(gè)新的API資源:PersistentVolume和PersistentVolumeClaim
PersistentVolume(PV)是集群中由管理員配置的一段網(wǎng)絡(luò)存儲(chǔ)。 它是集群中的資源念赶,就像節(jié)點(diǎn)是集群資源一樣础钠。 PV是容量插件,如Volumes叉谜,但其生命周期獨(dú)立于使用PV的任何單個(gè)pod旗吁。 此API對(duì)象捕獲存儲(chǔ)實(shí)現(xiàn)的詳細(xì)信息,包括NFS停局,iSCSI或特定于云提供程序的存儲(chǔ)系統(tǒng)很钓。
PersistentVolumeClaim(PVC)是由用戶進(jìn)行存儲(chǔ)的請(qǐng)求。 它類似于pod翻具。 Pod消耗節(jié)點(diǎn)資源履怯,PVC消耗PV資源。Pod可以請(qǐng)求特定級(jí)別的資源(CPU和內(nèi)存)裆泳。聲明可以請(qǐng)求特定的大小和訪問模式(例如,可以一次讀/寫或多次只讀)柠硕。
4.1PV創(chuàng)建
[root@master volume]# vim /etc/exports
/data/volume1 192.168.1.0/24(rw,root_squash,sync)
/data/volume2 192.168.1.0/24(rw,root_squash,sync)
/data/volume3 192.168.1.0/24(rw,root_squash,sync)
以nfs為例
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv-volume1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/volume1
server: 192.168.1.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv-volume2
spec:
accessModes:
- ReadOnlyMany
capacity:
storage: 5Gi
nfs:
path: /data/volume2
server: 192.168.1.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv-volume3
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 3Gi
nfs:
path: /data/volume3
server: 192.168.1.51
驗(yàn)證
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-pv-volume1 10Gi RWO Retain Available 28s
test-pv-volume2 5Gi ROX Retain Available 55s
test-pv-volume3 3Gi RWX Retain Available 7s
- 存儲(chǔ)類型
底層實(shí)際存儲(chǔ)的類型工禾,kubernetes支持多種存儲(chǔ)類型,每種存儲(chǔ)類型的配置都有所差異- 存儲(chǔ)能力(capacity)
用于存儲(chǔ)空間的設(shè)置- 訪問模式(accessModes)
用于描述用戶應(yīng)用對(duì)存儲(chǔ)資源的訪問權(quán)限蝗柔,訪問權(quán)限包括下面幾種方式:- ReadWriteOnce(RWO):讀寫權(quán)限闻葵,但是只能被單個(gè)節(jié)點(diǎn)掛載
- ReadOnlyMany(ROX): 只讀權(quán)限,可以被多個(gè)節(jié)點(diǎn)掛載
- ReadWriteMany(RWX):讀寫權(quán)限癣丧,可以被多個(gè)節(jié)點(diǎn)掛載
需要注意的是槽畔,底層不同的存儲(chǔ)類型可能支持的訪問模式不同
- 回收策略(persistentVolumeReclaimPolicy)
當(dāng)PV不再被使用了之后,對(duì)其的處理方式胁编。目前支持三種策略:- Retain (保留) 保留數(shù)據(jù)厢钧,需要管理員手工清理數(shù)據(jù)
- Recycle(回收) 清除 PV 中的數(shù)據(jù)鳞尔,效果相當(dāng)于執(zhí)行 rm -rf /thevolume/*
- Delete (刪除) 與 PV 相連的后端存儲(chǔ)完成 volume 的刪除操作,當(dāng)然這常見于云服務(wù)商的存儲(chǔ)服務(wù)
需要注意的是早直,底層不同的存儲(chǔ)類型可能支持的回收策略不同
- 存儲(chǔ)類別
PV可以通過storageClassName參數(shù)指定一個(gè)存儲(chǔ)類別- 具有特定類別的PV只能與請(qǐng)求了該類別的PVC進(jìn)行綁定
- 未設(shè)定類別的PV則只能與不請(qǐng)求任何類別的PVC進(jìn)行綁定
- 狀態(tài)(status)
一個(gè) PV 的生命周期中寥假,可能會(huì)處于4中不同的階段:- Available(可用): 表示可用狀態(tài),還未被任何 PVC 綁定
- Bound(已綁定): 表示 PV 已經(jīng)被 PVC 綁定
- Released(已釋放): 表示 PVC 被刪除霞扬,但是資源還未被集群重新聲明
- Failed(失敻馊汀): 表示該 PV 的自動(dòng)回收失敗
4.2PVC創(chuàng)建
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test1-volume
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
驗(yàn)證
[root@master volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-pv-volume1 10Gi RWO Retain Available 14m
test-pv-volume2 5Gi ROX Retain Available 14m
test-pv-volume3 3Gi RWX Retain Bound default/test1-volume 13m
[root@master volume]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test1-volume Bound test-pv-volume3 3Gi RWX 23s
4.3pod使用
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc
namespace: default
spec:
containers:
- name: web
image: nginx:1.14
volumeMounts:
- name: test1-volume
mountPath: /usr/share/nginx/html
volumes:
- name: test1-volume
persistentVolumeClaim:
claimName: test1-volume
readOnly: false
驗(yàn)證
[root@master volume]# echo test1-pvc > /data/volume3/index.html
[root@master volume]# kubectl get po pod-pvc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-pvc 1/1 Running 0 94s 10.244.2.126 node1 <none> <none>
[root@master volume]# curl 10.244.2.126
test1-pvc
5、configMap
ConfigMap是一種比較特殊的存儲(chǔ)卷喻圃,它的主要作用是用來存儲(chǔ)配置信息的萤彩。
[root@master volume]# kubectl create cm wordpress --from-literal=wordpress-db-host=wordpress-mysql
configmap/wordpress created
[root@master volume]# kubectl get cm wordpress
NAME DATA AGE
wordpress 1 4m15s
6、secret
在kubernetes中斧拍,還存在一種和ConfigMap非常類似的對(duì)象雀扶,稱為Secret對(duì)象。它主要用于存儲(chǔ)敏感信息饮焦,例如密碼怕吴、秘鑰、證書等等县踢。
[root@master volume]# kubectl create secret generic wordpress --from-literal=wordpress-db-password=wordpresspwd --from-literal=mysql-root-password=wordpresspwd
[root@master volume]# kubectl get secret wordpress
NAME TYPE DATA AGE
wordpress Opaque 2 69s