Volumes基本概念
Container(容器)中的磁盤文件是短暫的,當容器崩潰時,kubelet會重新啟動容器,但最初的文件將丟失,Container會以最干凈的狀態啟動。另外,當一個Pod運行多個Container時,各個容器可能需要共享一些文件。Kubernetes Volume可以解決這兩個問題。
emptyDir(一個pod中多個容器之間共享數據)
和上述volume不同的是,如果刪除Pod,emptyDir卷中的數據也將被刪除,一般emptyDir卷用于Pod中的不同Container共享數據。它可以被掛載到相同或不同的路徑上。
默認情況下,emptyDir卷支持節點上的任何介質,可能是SSD、磁盤或網絡存儲,具體取決于自身的環境。可以將emptyDir.medium字段設置為Memory,讓Kubernetes使用tmpfs(內存支持的文件系統),雖然tmpfs非常快,但是tmpfs在節點重啟時,數據同樣會被清除,并且設置的大小會被計入到Container的內存限制當中。
使用emptyDir卷的示例,直接指定emptyDir為{}即可:
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(掛載宿主機文件到容器中)
hostPath卷可將節點上的文件或目錄掛載到Pod上,用于Pod自定義日志輸出或訪問Docker內部的容器等。
使用hostPath卷的示例。將主機的/data目錄掛載到Pod的/test-pd目錄:
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
hostPath卷常用的type(類型)如下:
?type為空字符串:默認選項,意味著掛載hostPath卷之前不會執行任何檢查。
?DirectoryOrCreate:如果給定的path不存在任何東西,那么將根據需要創建一個權限為0755的空目錄,和Kubelet具有相同的組和權限。
?Directory:目錄必須存在于給定的路徑下。
?FileOrCreate:如果給定的路徑不存儲任何內容,則會根據需要創建一個空文件,權限設置為0644,和Kubelet具有相同的組和所有權。
?File:文件,必須存在于給定路徑中。
?Socket:UNIX套接字,必須存在于給定路徑中。
?CharDevice:字符設備,必須存在于給定路徑中。
?BlockDevice:塊設備,必須存在于給定路徑中。
總結:
volumes:
- name: share-volume
emptyDir: {}
#medium: Memory
- name: timezone
hostPath:
path: /etc/timezone
type: File
- name: nfs-volume
nfs:
server: 192.168.0.204
path: /data/nfs/test-dp