容器磁盤上的文件的生命周期是短暫的,這就使得在容器中運行重要應用時會出現一些問題。首先,當容器崩潰 時,kubelet 會重啟它,但是容器中的文件將丟失——容器以干凈的狀態(鏡像最初的狀態)重新啟動。其次,在 Pod 中同時運行多個容器時,這些容器之間通常需要共享文件。Kubernetes 中的 Volume 抽象就很好的解決了 這些問題
背景
Kubernetes 中的卷有明確的壽命 —— 與封裝它的 Pod 相同。所f以,卷的生命比 Pod 中的所有容器都長,當這 個容器重啟時數據仍然得以保存。當然,當 Pod 不再存在時,卷也將不復存在。也許更重要的是,Kubernetes 支持多種類型的卷,Pod 可以同時使用任意數量的卷

卷的類型
Kubernetes 支持以下類型的卷:
- awsElasticBlockStore azureDisk azureFile cephfs csi downwardAPI emptyDir
- fc flocker gcePersistentDisk gitRepo glusterfs hostPath iscsi local nfs
- persistentVolumeClaim projected portworxVolume quobyte rbd scaleIO secret
- storageos vsphereVolume
emptyDir
當 Pod 被分配給節點時,首先創建 emptyDir 卷,並且只要該 Pod 在該節點上運行,該卷就會存在。正如卷的名 字所述,它最初是空的。Pod 中的容器可以讀取和寫入 emptyDir 卷中的相同文件,盡管該卷可以掛載到每個容 器中的相同或不同路徑上。當出於任何原因從節點中刪除 Pod 時, emptyDir 中的數據將被永久刪除
emptyDir 的用法有:
- 暫存空間,例如用於基於磁盤的合並排序
- 用作長時間計算崩潰恢復時的檢查點
- Web服務器容器提供數據時,保存內容管理器容器提取的文件
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: wangyanglinux/myapp:v1
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
可以添加文件,實現不同容器共享,不同路徑掛載。
hostPath
hostPath 卷將主機節點的文件系統中的文件或目錄掛載到集群中
hostPath 的用途如下:
- 運行需要訪問 Docker 內部的容器;使用 /var/lib/docker 的 hostPath
- 在容器中運行 cAdvisor;使用 /dev/cgroups 的 hostPath
- 允許 pod 指定給定的 hostPath 是否應該在 pod 運行之前存在,是否應該創建,以及它應該以什么形式存在
除了所需的 path 屬性之外,用戶還可以為 hostPath 卷指定 type
使用這種卷類型是請注意,因為:
- 由於每個節點上的文件都不同,具有相同配置(例如從 podTemplate 創建的)的 pod 在不同節點上的行為可能會有所不同
- 當 Kubernetes 按照計划添加資源感知調度時,將無法考慮 hostPath 使用的資源
- 在底層主機上創建的文件或目錄只能由 root 寫入。您需要在特權容器中以 root 身份運行進程,或修改主機上的文件權限以便寫入 hostPath 卷
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: wangyanglinux/myapp:v1
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