1. 程式人生 > 實用技巧 >Kubernetes-13:Volume介紹及使用

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