1. Volume簡介
volume
(儲存卷)是pod中能夠被多個容器訪問的共享目錄
1.1 k8s的volume和docker的volume區別
- Kubernete中的
volume
被定義在pod上,然後被一個pod的多個容器掛載到具體的檔案目錄下 - Kubernetes中的
volume
和pod的生命週期相同,但與容器的生命週期不相關- 即容器重啟volume不會丟失
- 但是pod重啟volume卷會丟失
- 注意:這裡的volume卷丟失不代表volume對應的實際地址會丟失,而是
spec.volumes
的定義丟失。
- 注意:這裡的volume卷丟失不代表volume對應的實際地址會丟失,而是
- kubernetes支援多種型別的volume
1.2 kubernetes支援的volume型別
以下列舉一些常見或者需要了解的volume型別:
- emptyDir
- 初始內容是空的的卷
- hostPath
hostpath
為在Pod上掛載宿主機上的檔案或者目錄
- secret
- 使用一個
secret volume
為pod提供加密資訊
- 使用一個
- configMap
- 使用一個
configMap
為pod提供配置資訊
- 使用一個
- gitRepo
- 通過掛載一個空目錄,並且從
git
庫clone
一個repository
以供pod
使用
- 通過掛載一個空目錄,並且從
- glusterfs
- 使用開源的
glusterfs
網路檔案系統的目錄掛載到pod
- 使用開源的
- awsElasticBlockStore
- 對接
aws
雲提供volume
,瞭解即可
- 對接
- gcePersistentDisk
- 對接谷歌雲提供的
volume
,瞭解即可
- 對接谷歌雲提供的
- 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用途
- 執行需要訪問Docker 內部的容器;使用
/var/lib/docker
的hostPath
- 在容器中執行
cAdvisor
;使用/dev/cgroups
的hostPath
- 允許pod指定給定的
hostPath
是否應該在 pod執行之前存在,是否應該建立,以及它應該以什麼形式存在
除了所需的path屬性之外,使用者還可以為hostPath卷制定type:
值 | 行為 |
---|---|
空字串 (也是預設的行為 )用於向後相容,這意味著在掛載 hostPath 卷之前不會執行任何檢查。 |
|
DirectoryOrCreate | 如果在給定的路徑上沒有任何東西存在,那麼將根據需要在那裡建立一個空目錄,許可權設定為0755,與Kubelet 具有相同的組和所有權。 |
Directory | 給定的路徑下必須存在目錄 |
FileOrCreate | 如果在給定的路徑上沒有任何東西存在,那麼會根據需要建立一個空檔案,許可權設定為0644,與Kubelet具有相同的組和所有權。 |
File | 給定的路徑下必須存在檔案 |
Socket | 給定的路徑下必須存在UNIX套接字 |
CharDevice | 給定的路徑下必須存在字元裝置 |
BlockDevice | 給定的路徑下必須存在塊裝置 |
2.2.3 使用hostPath的注意事項
- .由於每個節點上的檔案都不同,具有相同配置(例如從
podTemplate
建立的)的pod在不同節點上的行為可能會有所不同 - 當
Kubernetes
按照計劃新增資源感知排程時,將無法考慮hostPath
使用的資源 - 在底層主機上建立的檔案或目錄只能由 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