1、kubernetes存儲卷
(1)存儲卷
Kubernetes提供的存儲卷屬於pod資源級別,共享於Pod內的所有容器,可用於在容器的文件系統之外存儲應用存儲的相關數據,也可獨立pod生命週期之外實現數據的持久化。
(2)kubernetes支持的存儲卷類型
Kubernetes支持非常豐富的出處卷類型,包括本地儲存及各種網絡存儲,同時還支持Secret和ConfigMap這樣的特殊存儲資源。
由於網絡存儲配置使用複雜,對此,kubernetes設計了一種集羣級別的資源PersistentVolume(PV)並由管理員配置存儲系統,然後通過persistentVolumeClain(PVC)存儲卷直接申請使用的機制簡化了存儲的使用配置過程。
(3)存儲卷的使用方式
在pod中定義配置存儲卷由兩部分組成,一是通過pod.spec.volumes字段定義在Pod之上的存儲卷列表;然後通過pod.spec.containers.volumeMount字段在容器上定義存儲卷掛載列表,在容器中只能掛載在當前Pod資源中定義的具體存儲卷。
在容器中定義掛載卷時的主要字段:
name:必選字段,指定要掛載的存儲的名稱,
mountPath:必選字段,掛載路徑,即掛載容器的那個路徑下
readOnly:是否掛載爲只讀卷
subPath:掛載存儲卷時時使用的子路徑
2、臨時存儲卷
(1)emptyDir
emptyDir是pod生命週期中的一個臨時目錄,生命週期跟隨pod的生命週期;emptyDir存儲卷通過pod.spec.volumes.emptyDir字段定義,主要的字段如下:
medium:存儲介質的類型,值有”default”和“memory”,默認爲default。
SizeLimit:當前存儲卷的空間限額,默認值爲nil,不限制。
# 定義一個自助式pod,定義一個emptyDir存儲,定義兩個容器並共享存儲
[root@master01 volumes]# cat test-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-emptydir-dir
spec:
volumes:
- name: html
emptyDir: {}
containers:
- name: nginx
image: nginx:1.12
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
- name: busybox
image: busybox
volumeMounts:
- name: html
mountPath: /html
command: ["/bin/sh", "-c"]
args:
- echo $(date) >> /html/index.html
(2)gitRepo存儲卷
gitRepo存儲卷可以看作是emptyDir存儲卷的一種實際應用,但是該存儲卷從kubernetes1.12開始已經被廢棄。在創建使用gitRepo存儲卷的pod時,首先會創建一個空目錄(emptyDir)並克隆一份指定的git倉庫中的數據至該目錄下,然後再創建容器並掛載該存儲卷。
創建gitRepo類型的存儲卷時,主要的字段如下:
repository:必選字段,爲Git倉庫的URL
directory:目標目錄的名稱
revision:特定revision的提交哈希碼
3、節點存儲卷
hostPath類型的存儲卷是指將工作節點上的某文件系統的目錄或文件掛載於Pod中的一種存儲卷,它可獨立於Pod資源的生命週期,因而具有持久性,但是它是工作在本地節點的存儲空間,僅適用於特定情況下的存儲卷使用要求。
定義配置hostPath類型的存儲卷時,主要是通過pod.spec.volumes.hostPath字段嵌套的path(用於指定工作節點上的目錄路徑)字段及type(用於指定存儲卷的類型)字段來定義的,type值有:
DirectoryOrCreate:指定的路徑不存在時自動創建
Directory:必須存在的目錄路徑
FileOrCreate:指定的路徑不存在時自動將其創建爲空文件
File:必須存在的文件路徑
Socket:必須存在的Socket文件路徑
CharDevice:必須存在的字符設備文件路徑
BlockDevice:必須存在的塊設備文件路徑
# 定義一個使用hostpath存儲卷的自助式pod
[root@master01 volumes]# cat test-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-hostpath-vol
spec:
volumes:
- name: html
hostPath:
path: /data/test/html
type: DirectoryOrCreate
containers:
- name: nginx
image: nginx:1.12
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
# 創建並查看該pod的詳細信息
[root@master01 volumes]# kubectl apply -f test-hostpath.yaml
pod/test-hostpath-vol created
[root@master01 volumes]# kubectl get pods -o wide test-hostpath-vol
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-hostpath-vol 1/1 Running 0 2m49s 10.244.2.46 node02.dayi123.com <none> <none>
# 在該pod所在的節點上創建測試文件並測試
[root@node02 ~]# echo "$(date +%F-%T) test-volumes-hostpath" > /data/test/html/index.html
[root@node02 ~]# curl 10.244.2.46
2019-01-24-00:51:00 test-volumes-hostpath
4、網絡存儲器
Kubernetes支持衆多類型的網絡存儲卷,包括傳統的NAS或SAN設備(如NFS、Iscsi、fc)、分佈式存儲(如RDB、GlusterFS)、雲端存儲(如cinder、awsElasticBlockStore、azureDisk)及構建在各類存儲系統之上的抽象管理層。
(1)NFS存儲卷
Kubernetes的NFS存儲卷用於將某實現存放的NFS服務器上的存儲空間掛載到Pod中以供容器使用,NFS存儲卷在pod對象終止後會被卸載並不會被刪除。
NFS存儲卷的定義是通過pod.spec.volumes.nfs地段定義,主要的嵌套字段有:
server:NFS服務器的IP地址或主機名
path:NFS服務器導出的文件系統路徑
readOnly:是否以制度方式掛載
在使用nfs存儲卷之前首先得有一個nfs服務器;先搭建一個nfs服務器,IP地址爲192.168.17.195,主機名爲nfs01.dayi123.com,並在各節點主機hosts文件中做解析。
# 安裝nfs服務
[root@nfs01 ~]# yum install nfs-utils
# 配置nfs服務
[root@nfs01 ~]# cat /etc/exports
/data/volums/data01 192.168.17.0/24(rw,no_root_squass)
# 創建nfs掛載目錄
[root@nfs01 ~]# mkdir /data/volums/data01/ -p
# 啓動服務
[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl enable rpcbind
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl enable nfs
# 查看nfs狀態
[root@nfs01 ~]# showmount -e 192.168.17.195
Export list for 192.168.17.195:
/data/volums/data01 192.168.17.0/24
存在nfs網絡文件系統後,就可以在各pod中使用nfs存儲卷,nfs是文件系統級的共享服務,它支持同時存在的多路徑掛載請求,但在使用nfs時需要在各節點安裝nfs客戶端工具(只需安裝nfs-utils,不需要啓動)
# 創建一個使用nfs存儲卷的自助式運行nginx的pod
[root@master01 volumes]# cat test-nginx-nfsvol.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-nginx-nfsvol
spec:
volumes:
- name: html
nfs:
server: nfs01.dayi123.com
path: /data/volums/data01
readOnly: false
containers:
- name: nginx
image: nginx:1.12
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
# 創建並查看pod的詳細信息
[root@master01 volumes]# kubectl apply -f test-nfs-vol.yaml
[root@master01 volumes]# kubectl get pods test-nginx-nfsvol -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-nginx-nfsvol 1/1 Running 0 14m 10.244.2.52 node02.dayi123.com <none> <none>
# 在nfs服務掛載的目錄上寫入數據通過nginx測試
[root@master01 volumes]# kubectl exec -it test-nginx-nfsvol -- /bin/sh
# echo "$(date +%F-%T) $(hostname) - TEST-NGINX-NFSVOLMS" >/usr/share/nginx/html/index.html
[root@master01 volumes]# curl 10.244.2.52
2019-01-24-07:45:46 test-nginx-nfsvol - TEST-NGINX-NFSVOLMS
由於nfs存儲卷保存的數據是永久性的,所以刪除使用nfs存儲卷的pod重新創建後數據不會丟失。
# 刪除並重新創建該pod並進行測試
[root@master01 volumes]# kubectl delete -f test-nginx-nfsvol.yaml
[root@master01 volumes]# kubectl apply -f test-nginx-nfsvol.yaml
[root@master01 volumes]# kubectl get pods test-nginx-nfsvol -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-nginx-nfsvol 1/1 Running 0 16s 10.244.2.53 node02.dayi123.com <none> <none>
[root@master01 volumes]# curl 10.244.2.53
2019-01-24-07:45:46 test-nginx-nfsvol - TEST-NGINX-NFSVOLMS
(2)RBD存儲卷的使用
Kubernetes支持通過RBD卷類型使用ceph存儲系統爲Pod提供存儲卷,要配置Pod資源使用RBD存儲卷,需要滿足以下的條件:
1)存在可用的ceph集羣
2)需要在ceph rbd集羣中創建一個能滿足Pod資源需求數據存儲需要的存儲映像
3)在kubernetes集羣內的各節點上安裝ceph客戶端程序包
RBD類型的存儲卷是通過explain pod.spec.volumes.rbd字段定義的,主要的內嵌字段有:
monitors:必選字段,爲ceph存儲監視器,使用逗號分隔的字符串列表
image:必選字段,爲rados image的名稱
pool:rados存儲池的名稱,默認爲RBD
user:rados用戶名,默認爲admin
keyring:RBD用戶認證時使用的keyring文件路徑,默認爲/etc/ceph/keyring
secretRef:RBD用戶認證時使用的保存有相應認證信息的Secret對象,會覆蓋由keyring字段提供的祕鑰信息
readOnly:是否以只讀方式進行訪問
fsType:要掛載的存儲卷的文件系統類型
5、持久存儲卷
直接使用自助式pod直接連接存儲的方式與kubernetes向用戶和開發隱藏底層架構的目標相背離;對此,kubernetes使用PersistentVolume(簡稱PV)子系統在系統和管理員之間添加一個自系統,解決了這種問題。
PersistentVolume是由集羣管理員配置提供的某存儲系統上的一段存儲空間,是對底層共享存儲的抽象,將共享存儲作爲一種可由用戶申請使用的資源。用戶對pv資源的使用是通過PersistentVolumeClaim(簡稱PVC)提出使用申請來完成綁定,它向PV申請特定大小的空間及訪問模式,從而創建出PVC存儲卷,再由pod資源通過PVC存儲卷關聯使用。
(1)PV的創建
PV對存儲系統的創建可通過插件來實現,kubernetes可支持的插件可通過” kubectl explain PersistentVolume.spec”命令查看。Pv的資源定義清單中PersistentVolume.spec字段除了定義存儲插件外,還可以定義的通用字段有:
1)Capacity:當前pv的容量
2)accessModes:定義訪問模式,常用的值有:ReadWriteOnce(僅可被單個節點讀寫掛載,簡寫爲RWO)、 ReadOnlyMany(可被多個節點制度掛載,簡寫爲ROX)、ReadWriteMany(可悲多個節點只讀掛載,簡寫爲RWX)
3)persistentVolumeReclaimPolicy:PV空間被釋放時的處理機制,選項有Retain(默認值,由管理員手動回收)、Recycle(空間回收,刪除存儲卷下所有文件,目前僅NFS和hostPath支持)、Delete(刪除從存儲卷)
4)volumeMode:卷模型,用於此卷可被用作文件系統還是塊設備,默認爲filesystem
5)storageClassName:當前pv所屬的StorageClass的名稱,默認空值。
6)mountOptions:掛載選項組成的列表,值有ro、soft、hard等
# 在創建愛你pv資源之前,查看可掛載的nfs存儲目錄
[root@master01 volumes]# showmount -e nfs01.dayi123.com
Export list for nfs01.dayi123.com:
/data/volums/vol03 192.168.17.0/24
/data/volums/vol02 192.168.17.0/24
/data/volums/vol01 192.168.17.0/24
/data/volums/data01 192.168.17.0/24
# 定義pv資源配置清單
[root@master01 volumes]# cat test-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv01
labels:
name: pv01
spec:
nfs:
server: nfs01.dayi123.com
path: /data/volums/vol01
accessModes: ["ReadWriteMany"]
capacity:
storage: 2Gi
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv02
labels:
name: pv02
spec:
nfs:
server: nfs01.dayi123.com
path: /data/volums/vol02
accessModes: ["ReadWriteOnce"]
capacity:
storage: 5Gi
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv03
labels:
name: pv03
spec:
nfs:
server: nfs01.dayi123.com
path: /data/volums/vol03
accessModes: ["ReadWriteMany","ReadWriteMany"]
capacity:
storage: 10Gi
volumeMode: Filesystem
# 創建並查看pv
[root@master01 volumes]# kubectl apply -f test-pv.yaml
[root@master01 volumes]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-pv01 2Gi RWX Retain Available 5s
test-pv02 5Gi RWO Retain Available 5s
test-pv03 10Gi RWX Retain Available 5s
(2)創建PVC
PVC是存儲卷類型的資源,它通過申請佔用某個pv而創建,它與pv是一對一的關係,創建pvc申請pv時用戶需要指定目標空間大小,訪問模式,pv標籤選擇器和StoreClass等信息,pvc的spec字段嵌套的字段有:
accessMode:當前pvc的訪問模式,可用模式與PV相同
resources:當前PVC存儲卷需要佔用的資源量的最小值
selector:綁定時對PV應用的標籤選擇器或匹配條件表達式,用於挑選要綁定的pv
storageClassVolume:所依賴的存儲類的名稱
volumeMode:卷模型,默認爲Filesystem
volumeName:用於直接指定要綁定的PV的卷名
# 定義一個pvc資源,讓它自動找合適的pv綁定
[root@master01 volumes]# cat test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc01
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 5Gi
# 創建並查看創建的PVC
[root@master01 volumes]# kubectl apply -f test-pvc.yaml
[root@master01 volumes]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-pvc01 Bound test-pv03 10Gi RWX 85s
# 查看pv的綁定狀態
[root@master01 volumes]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-pv01 2Gi RWX Retain Available 38m
test-pv02 5Gi RWO Retain Available 38m
test-pv03 10Gi RWX Retain Bound default/test-pvc01 38m
(3)在pod中使用PVC
創建好PVC資源後,可在Pod中通過” pod.spec.volumes.persistentVolumeClaim”字段去調用PVC,調用pvc時只要有以下的嵌套字段:
claimName:要調用的PVC的存儲卷的名稱,pvc要與pod在同一名稱空間中
readOnly:是否將存儲卷強制掛載爲制度模式,默認爲false。
# 定義一個pod資源調用pvc存儲
[root@master01 volumes]# cat test-pod-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod-pvc
spec:
containers:
- name: pvc-nginx
image: nginx:1.12
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: test-pvc01
(4)存儲類
Storage class(存儲類)是kubernetes資源類型的一種,是由管理員爲管理PV之便而按需創建的類別(邏輯組)。存儲類支持PV的動態創建,當用戶用到持久性存儲時,需要創建pvc來綁定匹配的pv,當管理員手動創建的pv無法滿足pvc的所有需求時,系統會按pvc的需求標準動態創建適配的pv。
1)存儲類的創建
存儲類資源的定義除了名稱外,還需要定義的以下的三個關鍵字:
provisioner(供給方):提供給存儲資源的存儲系統
parameters:存儲類使用參數描述要關聯到的存儲卷,不同的provisioner可用的參數各不相同
reclaimPolicy:爲當前存儲類活動動態創建的PV指定回收策略,可用值爲Delete(默認值)和Retain
volumeBindingMode:定義如何爲PVC完成供給和綁定
mountOptions:由當前類動態創建的PV的掛載選項列表
2)動態pv的供給
存儲類創建完成後,在PVC的定義中指定使用的存儲類資源的方式有兩種,一是通過spec.storageClassName字段定義,另一種是使用volume.beta.kubernetes.io/storage-class註解信息。