【K8S】Volume類型-EmptyDir與HostPath的區別
我們知道,一個運行中的容器,默認情況下,對文件系統的寫入,都是發生在其分層文件系統的可寫層的,一旦容器運行結束,所有寫入都會被丟棄。因此需要支持容器數據的持久化。
k8s中通過Volume來提供對容器存儲的支持。
Volume類型
volume是kubernetes Pod中多個容器訪問的共享目錄。volume被定義在pod上,被這個pod的多個容器掛載到相同或不同的路徑下。volume的生命周期與pod的生命周期相同,pod內的容器停止和重啟時一般不會影響volume中的數據。所以一般volume被用於持久化pod產生的數據。
Kubernetes提供了眾多的volume類型,現在列出一部分,具體可以參考官方文檔。
- emptyDir
- hostPath
- gcePersistentDisk
- awsElasticBlockStore
- nfs
- iscsi
- flocker
- glusterfs
- rbd
- cephfs
- gitRepo
- secret
- persistentVolumeClaim
- downwardAPI
- azureFileVolume
- azureDisk
- vsphereVolume
- Quobyte
本篇文章我們簡單說下emptyDir和hostPath。
emptyDir
emptyDir的生命周期與所屬的pod相同。pod刪除時,其emptyDir中的數據也會被刪除。
emptyDir類型的volume在pod分配到node上時被創建,kubernetes會在node上自動分配 一個目錄,因此無需指定宿主機node上對應的目錄文件。
emptyDir Volume主要用於某些應用程序無需永久保存的臨時目錄,多個容器的共享目錄等。
下面是一個pod掛載emptyDir的示例:
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: test-pod
-
spec:
-
containers:
-
- image: test-webserver
-
name: test-container
-
volumeMounts:
-
- name: cache-volume
-
mountPath: /cache
-
volumes:
-
- name: cache-volume
-
emptyDir: {}
hostPath
pod刪除或者是調度到另外一個Node,原先Node上的存儲卷還在。
hostPath Volume為pod掛載宿主機上的目錄或文件,使得容器可以使用宿主機的文件系統進行存儲。缺點是,在k8s中,pod都是動態在各node節點上調度。當一個pod在當前node節點上啟動並通過hostPath存儲了文件到本地以后,下次調度到另一個節點上啟動時,就無法使用在之前節點上存儲的文件。
hostPath使用示例:
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: test-pod
-
spec:
-
containers:
-
- image: test-webserver
-
name: test-container
-
volumeMounts:
-
- name: test-volume
-
mountPath: /www
-
volumes:
-
- name: test-volume
-
hostPath:
-
path: /data
當然也可以為 hostPath
卷指定 type:
值 |
行為 |
|
空字符串(默認)用於向后兼容,在掛載 hostPath 卷之前不會執行任何檢查 |
DirectoryOrCreate |
將根據需要在那里創建一個空目錄,權限設置為 0755,與 Kubelet 具有相同的組和權限 |
Directory |
給定的路徑下必須存在目錄 |
FileOrCreate |
會根據需要創建一個空文件,權限設置為 0644,與 Kubelet 具有相同的組和權限 |
File |
給定的路徑下必須存在文件 |
Socket |
給定的路徑下必須存在 UNIX 套接字 |
CharDevice |
給定的路徑下必須存在字符設備 |
BlockDevice |
給定的路徑下必須存在塊設備 |
更多詳細的內容: