Volumes基本概念
Container(容器)中的磁盤文件是短暫的,當(dāng)容器崩潰時,kubelet會重新啟動容器,但最初的文件將丟失,Container會以最干凈的狀態(tài)啟動。另外,當(dāng)一個Pod運行多個Container時,各個容器可能需要共享一些文件。Kubernetes Volume可以解決這兩個問題。
emptyDir(一個pod中多個容器之間共享數(shù)據(jù))
和上述volume不同的是,如果刪除Pod,emptyDir卷中的數(shù)據(jù)也將被刪除,一般emptyDir卷用于Pod中的不同Container共享數(shù)據(jù)。它可以被掛載到相同或不同的路徑上。
默認情況下,emptyDir卷支持節(jié)點上的任何介質(zhì),可能是SSD、磁盤或網(wǎng)絡(luò)存儲,具體取決于自身的環(huán)境??梢詫mptyDir.medium字段設(shè)置為Memory,讓Kubernetes使用tmpfs(內(nèi)存支持的文件系統(tǒng)),雖然tmpfs非???,但是tmpfs在節(jié)點重啟時,數(shù)據(jù)同樣會被清除,并且設(shè)置的大小會被計入到Container的內(nèi)存限制當(dāng)中。
使用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卷可將節(jié)點上的文件或目錄掛載到Pod上,用于Pod自定義日志輸出或訪問Docker內(nèi)部的容器等。
使用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卷之前不會執(zhí)行任何檢查。
?DirectoryOrCreate:如果給定的path不存在任何東西,那么將根據(jù)需要創(chuàng)建一個權(quán)限為0755的空目錄,和Kubelet具有相同的組和權(quán)限。
?Directory:目錄必須存在于給定的路徑下。
?FileOrCreate:如果給定的路徑不存儲任何內(nèi)容,則會根據(jù)需要創(chuàng)建一個空文件,權(quán)限設(shè)置為0644,和Kubelet具有相同的組和所有權(quán)。
?File:文件,必須存在于給定路徑中。
?Socket:UNIX套接字,必須存在于給定路徑中。
?CharDevice:字符設(shè)備,必須存在于給定路徑中。
?BlockDevice:塊設(shè)備,必須存在于給定路徑中。
總結(jié):
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