摘要:Kubernetes是Google開源的容器集群管理系統(tǒng),構(gòu)建于Docker之上,為容器化的應(yīng)用提供資源調(diào)度、部署運(yùn)行、服務(wù)發(fā)現(xiàn)、擴(kuò)容縮容等功能。本文描述了Kubernetes中Volumes的使用情況,Volume是一個能夠被容器訪問的目錄。
Volumes
本文描述了Kubernetes中Volumes的使用情況,建議在閱讀本文前,首先熟悉pods。
Volume是一個能夠被容器訪問的目錄,它可能還會包含一些數(shù)據(jù)。Kubernetes Volumes與Docker Volumes類似,但并不完全相同。
一個Pod會在它的ContainerManifest 屬性中指明其容器需要哪些Volumes。
容器中的進(jìn)程可見的文件系統(tǒng)視圖由兩個源組成:一個單獨(dú)的Docker image和零個或多個Volumes。Docker image位于文件層次結(jié)構(gòu)的根部。所有的Volumes都掛載在Docker image的節(jié)點(diǎn)上。Volumes不能掛載在其他的Volumes上,也沒有連接其他Volumes的硬鏈接。Pod中的每個容器都單獨(dú)地指明了其image掛載的Volume。這會通過VolumeMount屬性來確定。
資源
Volume的存儲介質(zhì)(如硬盤、固態(tài)硬盤或內(nèi)存)是由保存kubelet根目錄(一般為/var/lib/kubelet)的文件系統(tǒng)的存儲介質(zhì)決定的。一個EmptyDir或者PersistentDir類型的Volume可以使用多少空間是沒有限制的,同時在容器或者pods間也不存在隔離。
將來,我們預(yù)計(jì)一個Volume將能夠通過使用資源規(guī)范來請求一個確定大小的空間;同時,對于包含多種存儲介質(zhì)的集群,將可以選擇Volume使用的介質(zhì)類型。
Volumes的類型
Kubernetes現(xiàn)在支持三種類型的Volumes,但將來會支持更多的類型。
EmptyDir
一個EmptyDir Volume是在Pod綁定到Node時創(chuàng)建的。當(dāng)條容器命令啟動時,它的初始狀態(tài)為空。在同一個Pod上的容器可以讀寫EmptyDir中的相同文件。當(dāng)一個Pod被解綁,在EmptyDir中的數(shù)據(jù)將永久性刪除。
EmptyDir的一些用途如下:
暫存空間,例如用于基于磁盤的歸并排序或者長計(jì)算的檢查點(diǎn);
一個目錄,由一個內(nèi)容管理容器填充數(shù)據(jù),同時由一個網(wǎng)絡(luò)服務(wù)器容器供應(yīng)數(shù)據(jù)。
目前,用戶無法控制EmptyDir使用的介質(zhì)種類。如果Kubelet的配置是使用硬盤,那么所有的EmptyDirectories都將創(chuàng)建在該硬盤上。將來,可以預(yù)料的是Pods將可以控制EmptyDir是位于硬盤、固態(tài)硬盤還是基于內(nèi)存的tmpfs上。
HostDir
一個HostDir的Volume將可以訪問當(dāng)前宿主機(jī)節(jié)點(diǎn)上的文件。
HostDir的一些用途如下:
運(yùn)行一個需要訪問Docker內(nèi)部結(jié)構(gòu)的容器;可以訪問/var/lib/docker這個HostDir;
在容器中運(yùn)行cAdvisor;可以訪問/dev/cgroups這個HostDir。
當(dāng)使用該類型的Volume時,需要格外小心,因?yàn)椋?/p>
具有相同配置的pods(例如由同一個podTemplate創(chuàng)建的pods)可能在不同宿主節(jié)點(diǎn)上由于宿主機(jī)上的目錄和文件不同而有著不同的訪問結(jié)果;
當(dāng)Kubernetes增加資源敏感調(diào)度,按其計(jì)劃,它將不能考慮到HostDir使用的資源。
GCEPersistentDisk
重要提示:必須創(chuàng)建并格式化一個永久磁盤(PD)才能使用GCEPersistentDisk。
擁有GCEPersistentDisk的Volume可以訪問谷歌計(jì)算引擎(Google Compute Engine, GCE)的永久磁盤上的文件。
使用GCEPersistentDisk時,有一些限制條件:
節(jié)點(diǎn)(運(yùn)行kubelet的節(jié)點(diǎn))需要是GCE虛擬機(jī);
這些虛擬機(jī)需要在相同的GCE項(xiàng)目中,同時被劃作PD;
避免使用相同Volume來創(chuàng)建多個pods
如果多個pods引用相同的Volume,并且都部署在同一臺機(jī)器上,不論它們是只讀還是可讀寫的,那么第二個pod的部署都將失敗;
只有使用只讀加載的文件系統(tǒng)的pod才能創(chuàng)建復(fù)制控制器。
創(chuàng)建一個PD
在你能夠在pod上使用GCE PD前,你需要先創(chuàng)建并格式化它。
我們正在積極努力得使這個過程更加精簡容易。
DISK_NAME=my-data-disk
DISK_SIZE=500GB
ZONE=us-central1-a
gcloud compute disks create --size=$DISK_SIZE --zone=$ZONE $DISK_NAME
gcloud compute instances attach-disk --zone=$ZONE --disk=$DISK_NAME --device-name temp-data kubernetes-master
gcloud compute ssh --zone=$ZONE kubernetes-master \
--command "sudo mkdir /mnt/tmp && sudo /usr/share//safe_format_and_mount /dev/disk/by-id/-temp-data /mnt/tmp"
gcloud compute instances detach-disk --zone=$ZONE --disk $DISK_NAME kubernetes-master
GCE PD的配置實(shí)例:
apiVersion: v1beta1
desiredState:
manifest:
containers:
- image: kubernetes/pause
name: testpd
volumeMounts:
- mountPath: "/testpd"
name: "testpd"
id: testpd
version: v1beta1
volumes:
- name: testpd
source:
persistentDisk:
# This GCE PD must already exist and be formatted ext4
pdName: test
fsType: ext4
id: testpd
kind: Pod
Kubernetes的Volumes使用實(shí)例-Walkthrough
對于永久存儲,首先,我們知道容器的文件系統(tǒng)與容器有著同等的生命周期,所以,我們還需要有永久存儲。為了實(shí)現(xiàn)這個目的,你需要聲明一個Volume,把它作為Pod的一部分,同時將它掛載到一個容器上。
apiVersion: v1beta1
kind: Pod
id: storage
desiredState:
manifest:
version: v1beta1
id: storage
containers:
- name: redis
image: dockerfile/redis
volumeMounts:
# name must match the volume name below
- name: redis-persistent-storage
# mount path within the container
mountPath: /data/redis
volumes:
- name: redis-persistent-storage
source:
emptyDir: {}
那么,我們該如何做呢?我們?yōu)镻od增加一個Volume:
...
volumes:
- name: redis-persistent-storage
source:
emptyDir: {}
...
然后,我們?yōu)樵揤olume在容器中增加一個對應(yīng)的掛載路徑:
...
volumeMounts:
# name must match the volume name below
- name: redis-persistent-storage
# mount path within the container
mountPath: /data/redis
...
在Kubernetes中, EmptyDir Volumes在Pod的生命周期內(nèi)一直可用,該周期比任何一個容器的生命周期都長,所以即使容器失效并重啟,我們的永久存儲將仍然可用。
如果你希望掛載一個已經(jīng)存在于文件系統(tǒng)的目錄(例如/var/logs),你可以直接使用HostDir。
原文鏈接:Kubernetes Volumes(編譯/仇臣 審校/張磊 責(zé)編/周小璐)
相關(guān)鏈接:Google Kubernetes設(shè)計(jì)文檔之安全篇
Google Kubernetes設(shè)計(jì)文檔之Pod篇
Google Kubernetes設(shè)計(jì)文檔之服務(wù)篇
Google Kubernetes設(shè)計(jì)文檔之網(wǎng)絡(luò)
譯者簡介:仇臣,浙江大學(xué)SEL實(shí)驗(yàn)室碩士研究生,目前在云平臺團(tuán)隊(duì)從事科研和開發(fā)工作。浙大團(tuán)隊(duì)對PaaS,Docker,大數(shù)據(jù)和主流開源云計(jì)算技術(shù)有深入的研究和二次開發(fā)經(jīng)驗(yàn),團(tuán)隊(duì)現(xiàn)將部分技術(shù)文章貢獻(xiàn)出來,希望能對讀者有所幫助。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個個人學(xué)習(xí)交流的平臺,網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請及時聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。