Volumes
容器中的文件在磁盤上是臨時存放的,這給容器中運行的特殊應用程序帶來一些問題。 首先,當容器崩潰時,kubelet 將重新啟動容器,容器中的文件將會丟失——因為容器會以干凈的狀態重建。 其次,當在一個 Pod 中同時運行多個容器時,常常需要在這些容器之間共享文件。 Kubernetes 抽象出 Volume 對象來解決這兩個問題。
參考官方
常用卷及使用場景
configmap
configMap 資源提供了向 Pod 注入配置數據的方法。 ConfigMap 對象中存儲的數據可以被 configMap 類型的卷引用,然后被應用到 Pod 中運行的容器化應用。
emptyDir
當 Pod 指定到某個節點上時,首先創建的是一個 emptyDir 卷,並且只要 Pod 在該節點上運行,卷就一直存在。 就像它的名稱表示的那樣,卷最初是空的。 盡管 Pod 中的容器掛載 emptyDir 卷的路徑可能相同也可能不同,但是這些容器都可以讀寫 emptyDir 卷中相同的文件。 當 Pod 因為某些原因被從節點上刪除時,emptyDir 卷中的數據也會永久刪除。
容器崩潰並不會導致 Pod 被從節點上移除,因此容器崩潰時
emptyDir
卷中的數據是安全的。
emptyDir 的一些用途:
- 緩存空間,例如基於磁盤的歸並排序。
- 為耗時較長的計算任務提供檢查點,以便任務能方便地從崩潰前狀態恢復執行。
- 在 Web 服務器容器服務數據時,保存內容管理器容器獲取的文件
默認情況下, emptyDir 卷存儲在支持該節點所使用的介質上;這里的介質可以是磁盤或 SSD 或網絡存儲,這取決於您的環境。 但是,您可以將 emptyDir.medium 字段設置為 "Memory",以告訴 Kubernetes 為您安裝 tmpfs(基於 RAM 的文件系統)。 雖然 tmpfs 速度非常快,但是要注意它與磁盤不同。 tmpfs 在節點重啟時會被清除,並且您所寫入的所有文件都會計入容器的內存消耗,受容器內存限制約束
常做臨時存儲
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
hostPath
卷能將主機節點文件系統上的文件或目錄掛載到您的 Pod 中。 雖然這不是大多數 Pod 需要的,但是它為一些應用程序提供了強大的逃生艙。
hostPath 的一些用法有:
- 運行一個需要訪問 Docker 引擎內部機制的容器;請使用 hostPath 掛載 /var/lib/docker 路徑。
- 在容器中運行 cAdvisor 時,以 hostPath 方式掛載 /sys。
- 允許 Pod 指定給定的 hostPath 在運行 Pod 之前是否應該存在,是否應該創建以及應該以什么方式存在。
除了必需的 path 屬性之外,用戶可以選擇性地為 hostPath 卷指定 type。
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-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
- 場景一:某個job服務需要每天ftp拉取第三方日志,進行讀取解析
ftp shell程序設置在特定node,拉取日志於node目錄假設為/opt/case,指定pod部署在這一node(通過。。。),指定hostPath為日志路徑掛載到容器目錄中(注意是掛載),程序讀取目錄日志解析。
- 場景二:job服務執行會記錄日志
指定特定node,hostPath指定node目錄,volume掛載pod容器,程序執行,記錄到node上,及時pod銷毀,也不會擔心丟失,方便排查問題。