Kubernetes-13:Volume介紹及使用
Volume介紹
Volume存在的意義
容器磁碟上的檔案的生命週期是短暫的,這就使得在容器中執行重要應用時會出現一些問題,首先,當容器崩潰時,kubelet會重啟它,但是容器中的檔案將丟失——容器以乾淨的狀態(映象最初的狀態)重新啟動。其次,在Pod中執行多個容器時,這些容器之間通常需要共享檔案。kubernetes中的Volume抽象就很好的解決了這些問題
背景
kubernetes中的卷有明確的壽命 —— 與封裝它的Pod相同。所以,卷的生命比Pod中所有的容器要長,當這個容器重啟時資料仍然得以儲存。當然,當Pod不再存在,卷也就不復存在。也許,更重要的是kubernetes支援多種型別的卷,Pod可以同時使用任意數量的卷
卷的型別
Kubernetes常用卷型別:
- 非永續性儲存
- emptyDir
- hostPath
- 網路連線性儲存
- SAN:iSCSI
- NFS:nfs,cfs
- 分散式儲存
- glusterfs、rbd、cephfs
- 雲端儲存
- EBS、Azure、Disk、阿里雲、gieRepo
kubectl explain pod.spec.volumes #查詢k8s支援的所有volume型別
常用卷演示
1、emptyDir
當Pod被分配到節點時,首先建立 emptyDir 卷,並且只要該Pod在該節點執行,改卷就會存在,正如名字所述,它最初是空的,Pod中的容器可以讀取和寫入 emptyDir 中的檔案,儘管該卷可以掛在到每個容器相同或者不同的路徑上,當Pod在該節點被刪除後,emptyDir 中的資料也將會被永久刪除
注意:容器崩潰不會將Pod在此節點移除,所有資料不會丟失
示例:
建立帶有 emptyDir 的 Pod
vim emptydir.yaml ... apiVersion: v1 kind: Pod metadata: name: emptydir namespace: default spec: containers: - name: em-container-1 image: hub.vfancloud.com/test/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /test1 # 掛載到/test1下 name: em-volume - name: enecontainer-2 image: mysql:master imagePullPolicy: IfNotPresent command: ['/bin/sh','-c','sleep 666666'] volumeMounts: - mountPath: /test2 # 掛載到/test2下 name: em-volume volumes: - name: em-volume emptyDir: {} ... kubectl create -f emptydir.yaml ## 進入容器內,是空目錄 [root@Centos8 volume]# kubectl exec -it emptydir -c em-container-1 -- /bin/sh / # cd test1/ /test1 # ls ## 建立一個檔案 /test1 # date > index.html /test1 # cat index.html Fri Jun 5 09:58:21 UTC 2020 ## 進入第二個容器內,前往掛載的目錄檢視是否同步此檔案 [root@Centos8 volume]# kubectl exec -it emptydir -c enecontainer-2 -- /bin/sh # cd /test2 # ls index.html # cat index.html Fri Jun 5 09:58:21 UTC 2020 ## 同時 再新增一條資訊到檔案中 # date >> index.html # cat index.html Fri Jun 5 09:58:21 UTC 2020 Fri Jun 5 17:59:30 CST 2020 ## 此時再返回第一個容器中,檢視是否同步檔案內容 /test1 # cat index.html Fri Jun 5 09:58:21 UTC 2020 Fri Jun 5 17:59:30 CST 2020
2、hostPath
hostPath 卷將主機節點的檔案系統中的檔案或目錄掛載到叢集中
hostPath的用途如下:
執行需要訪問Docker內部的容器;使用 /var/lib/docker 的 hostPath
在容器中執行cAdvisor;使用 /dev/cgroups 的 hostPath
除了所需的 Path 屬性之外;使用者還可以為 hostPath 卷指定 type
值 |
行為 |
|
空字串(預設)用於向後相容,這意味著在掛載hostPath卷之前不會進行任何檢查 |
DirectoryOrCreate |
如果給定的路徑沒有任何東西存在,那將根據需要在此建立一個空目錄,許可權設定為0755,與kubelet擁有相同的使用者與組 |
Directory |
指定路徑下必須存在此目錄 |
FileOrCreate |
如果給定的路徑沒有任何東西存在,那將根據需要在此建立一個空檔案,許可權設定為0644,與kubelet擁有相同的使用者與組 |
File |
給定的路徑下必須存在檔案 |
Socket |
給定的路徑下必須存在Unix套接字 |
CharDevice |
給定的路徑下必須存在字元裝置 |
BlockDevice |
給定的路徑下必須存在塊裝置 |
使用這種卷型別時請注意:
- 由於每個節點上的檔案不同,具有相同配置(例如從 podTemplate建立的)的pod在不同節點上的行為可能會有所不同
- 當Kubernetes按照計劃新增資源感知排程時,將無法考慮hostPath使用的資源
- 在底層主機上建立的檔案或目錄只能由root寫入。必須在特權容器中以root身份執行程序,或修改主機上檔案許可權以便寫入 hostPath 卷
vim dir-volume.yaml ... apiVersion: v1 kind: Pod metadata: name: hostpath-volume namespace: default spec: containers: - name: hostpath-container image: hub.vfancloud.com/test/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /test-volume name: dir-volume volumes: - name: dir-volume hostPath: path: /opt type: Directory # volume型別 ... kubectl create -f dir-volume.yaml ### 進入容器內檢視,可以看到,pod的node節點下/opt的所有檔案及目錄已掛載 [root@Centos8 volume]# kubectl exec -it hostpath-volume -- /bin/sh / # ls /test-volume/ cni containerd es-data es-log metricbeat rh