1. 程式人生 > >kubernetes系列(十三) - 儲存之Volume

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

- [1. Volume簡介](#head1) - [1.1 k8s的volume和docker的volume區別](#head2) - [1.2 kubernetes支援的volume型別](#head3) - [2. 重點的volume型別](#head4) - [2.1 emptyDir](#head5) - [2.1.1 emptyDir簡介](#head6) - [2.1.2 emptyDir常見用途](#head7) - [2.1.3 emptyDir的具體使用方式](#head8) - [2.2 hostPath](#head9) - [2.2.1 hostPath簡介](#head10) - [2.2.2 hostPath用途](#head11) - [2.2.3 使用hostPath的注意事項](#head12) - [2.2.4 hostPath的具體定義方式](#head13) ## 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 - 通過掛載一個空目錄,並且從`git`庫`clone`一個`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`是對應的同一個目錄。 ```yaml 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/docker`的`hostPath` 2. 在容器中執行`cAdvisor`;使用`/dev/cgroups`的`hostPath` 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的具體定義方式 ```yaml 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: Direct