kubernetes系列(十三) - 存儲之Volume


1. Volume簡介

volume(存儲卷)是pod中能夠被多個容器訪問的共享目錄

1.1 k8s的volume和docker的volume區別

  1. Kubernete中的volume被定義在pod上,然后被一個pod的多個容器掛載到具體的文件目錄下
  2. Kubernetes中的volume和pod的生命周期相同,但與容器的生命周期不相關
    • 即容器重啟volume不會丟失
    • 但是pod重啟volume卷會丟失
      • 注意:這里的volume卷丟失不代表volume對應的實際地址會丟失,而是spec.volumes的定義丟失。
  3. kubernetes支持多種類型的volume

1.2 kubernetes支持的volume類型

以下列舉一些常見或者需要了解的volume類型:

  1. emptyDir
    • 初始內容是空的的卷
  2. hostPath
    • hostpath為在Pod上掛載宿主機上的文件或者目錄
  3. secret
    • 使用一個secret volume為pod提供加密信息
  4. configMap
    • 使用一個configMap為pod提供配置信息
  5. gitRepo
    • 通過掛載一個空目錄,並且從gitclone一個repository以供pod使用
  6. glusterfs
    • 使用開源的glusterfs網絡文件系統的目錄掛載到pod
  7. awsElasticBlockStore
    • 對接aws雲提供volume,了解即可
  8. gcePersistentDisk
    • 對接谷歌雲提供的volume,了解即可
  9. azureDisk & azureFile
    • 對接微軟Azure提供的volume,了解即可

2. 重點的volume類型

2.1 emptyDir

2.1.1 emptyDir簡介

當Pod 被分配給節點時,首先創建emptyDir 卷,並且只要該 Pod 在該節點上運行,該卷就會存在。正如卷的名字所述,它最初是空的。Pod中的容器可以讀取和寫入emptyDir卷中的相同文件

  • 該卷可以掛載到每個容器中的相同或不同路徑上
  • 容器崩潰不會從節點中移除 pod,因此 emptyDir卷中的數據在容器崩潰時是安全的
  • Pod被移除時,emptyDir中的數據將被永久刪除。

2.1.2 emptyDir常見用途

  • 臨時空間。例如用於某些應用程序運行時所需的臨時目錄,且無需永久保存
  • 長時間任務的中間過程checkPoint的臨時保存目錄
  • 同一個pod下,一個容器需要從另一個容器中獲取數據的目錄(多容器共享目錄)

2.1.3 emptyDir的具體使用方式

如下,此時容器c1下的/path1容器c2下的/path2是對應的同一個目錄。

apiVersion: v1 
kind: Pod 
metadata:
  name: test-pd 
spec:
  containers:
  - image: lzw5399/tocgenerator
    name: c1
    # 把定義的cache-volume掛在到該容器c1下的/path1路徑
    volumeMounts:
    - mountPath: /path1 
      name: cache-volume
  - image: lzw5399/codepie
    name: c2
    # 把定義的cache-volume掛在到該容器c2下的/path2路徑
    volumeMounts:
    - mountPath: /path2
      name: cache-volume
  # 定義一個emptyDir的volume
  volumes:
  - name: cache-volume 
    emptyDir: {}

2.2 hostPath

2.2.1 hostPath簡介

hostPath卷將主機節點的文件系統中的文件或目錄掛載到集群中

2.2.2 hostPath用途

  1. 運行需要訪問Docker 內部的容器;使用 /var/lib/dockerhostPath
  2. 在容器中運行cAdvisor;使用/dev/cgroupshostPath
  3. 允許pod指定給定的hostPath是否應該在 pod運行之前存在,是否應該創建,以及它應該以什么形式存在

除了所需的path屬性之外,用戶還可以為hostPath卷制定type:

行為
  空字符串 (也是默認的行為)用於向后兼容,這意味着在掛載 hostPath 卷之前不會執行任何檢查。
DirectoryOrCreate 如果在給定的路徑上沒有任何東西存在,那么將根據需要在那里創建一個空目錄,權限設置為0755,與Kubelet 具有相同的組和所有權。
Directory 給定的路徑下必須存在目錄
FileOrCreate 如果在給定的路徑上沒有任何東西存在,那么會根據需要創建一個空文件,權限設置為0644,與Kubelet具有相同的組和所有權。
File 給定的路徑下必須存在文件
Socket 給定的路徑下必須存在UNIX套接字
CharDevice 給定的路徑下必須存在字符設備
BlockDevice 給定的路徑下必須存在塊設備

2.2.3 使用hostPath的注意事項

  1. .由於每個節點上的文件都不同,具有相同配置(例如從podTemplate創建的)的pod在不同節點上的行為可能會有所不同
  2. Kubernetes按照計划添加資源感知調度時,將無法考慮hostPath使用的資源
  3. 在底層主機上創建的文件或目錄只能由 root寫入。您需要在特權容器中以 root身份運行進程,或修改主機上的文件權限以便寫入hostPath

2.2.4 hostPath的具體定義方式

apiVersion: v1 
kind: Pod 
metadata:
  name: test-pd 
spec:
  containers:
  - image: k8s.gcr.io/test-webserver 
    name: test-container 
    volumeMounts:
    - mountPath: /test-pd 
      name: test-volum
  # 定義一個hostPath類型的volume
  volumes:
  - name: test-volume 
    hostPath:
      # 路徑掛載到宿主機的/data下
      path: /data 
      # (可選) 指定類型,見上面的表
      type: Directory


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM