我們知道容器和 pod 可能會被頻繁地銷毀和創(chuàng)建束铭,在銷毀的時候廓块,容器內(nèi)部的數(shù)據(jù)也會被清除掉。這對于需要讀寫容器內(nèi)部數(shù)據(jù)的應(yīng)用來說就是一個很大的問題契沫。其次带猴,有一些場景,可能一個 pod 里面的多個容器需要共享數(shù)據(jù)懈万。怎么來解決呢拴清?
volume 的生命周期與 pod 相同,當(dāng) volume 被 mount 到一個 pod 上時会通,pod 中的所有容器都可以訪問這個 volume口予,容器的創(chuàng)建和銷毀并不會影響 volume。但是涕侈,當(dāng) pod 被銷毀時沪停,volume 也就不復(fù)存在了。 那數(shù)據(jù)是不是也丟了嗎裳涛?
其實(shí) volume 只是一個目錄木张,至于這個 volume 是如何創(chuàng)建的,它的內(nèi)容是什么等等端三,實(shí)際上是取決于所使用的 volume 類型舷礼。常見的類型包括 emptyDir、hostPath技肩、nfs且轨、Ceph 等浮声,完整列表可以參考官網(wǎng)說明:
https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes
接下來我們來看看最簡單的 emptyDir 類型虚婿。
emptyDir
emptyDir volume 類型,實(shí)際上是主機(jī)上的一個臨時空目錄泳挥。臨時就是說當(dāng) pod 被刪除時然痊,這個空目錄也會跟著被刪除,里面的數(shù)據(jù)也就不存在了屉符。但是對于容器來說剧浸,只要 pod 還在锹引,即使容器被銷毀,數(shù)據(jù)還是存在的唆香。
常見的使用場景:
- 用于一個 pod 內(nèi)多個容器共享臨時數(shù)據(jù)(如日志收集)
下面通過例子來使用 emptyDir 模擬日志收集嫌变。
創(chuàng)建 app.yaml 文件:
apiVersion: v1
kind: Pod
metadata:
name: emptydir
spec:
containers:
- image: busybox
name: app
volumeMounts:
- mountPath: /logs
name: shared-dir
args:
- /bin/sh
- -c
- echo `date '+%H:%M:%S'` >> /logs/app.log; sleep 60000
- image: busybox
name: log-collector
volumeMounts:
- mountPath: /app_logs
name: shared-dir
args:
- /bin/sh
- -c
- cat /app_logs/app.log; sleep 60000
volumes:
- name: shared-dir
emptyDir: {}
創(chuàng)建 pod:
$ kubectl create -f app.yaml
pod "emptydir" created
pod 中有兩個容器,一個是 app(對應(yīng)實(shí)際場景中的應(yīng)用)躬它,另一個是 log-collector(對應(yīng)實(shí)際場景中的日志收集)腾啥。app負(fù)責(zé)把日志寫到日志文件中,而 log-collector 則從日志文件中讀取日志冯吓。
看看模擬的效果倘待。
查看日志文件內(nèi)容:
$ kubectl exec emptydir -c log-collector cat /app_logs/app.log
12:36:51
說明通過 emptyDir volume 可以實(shí)現(xiàn) pod 內(nèi)容器之間的數(shù)據(jù)共享。
接下來把 pod 刪除再重新創(chuàng)建:
$ kubectl delete -f app.yaml
pod "emptydir" deleted
$ kubectl create -f app.yaml
pod "emptydir" created
再次查看日志文件內(nèi)容:
$ kubectl exec emptydir -c log-collector cat /app_logs/app.log
12:38:45
可見當(dāng) pod 被刪除之后组贺,之前的數(shù)據(jù)已經(jīng)被清除了凸舵。
所以記住一點(diǎn),emptyDir volume 實(shí)際就是一個臨時共享目錄失尖。
臨時:指的是生命周期和pod一樣啊奄,數(shù)據(jù)隨pod的銷毀而銷毀。
共享:指的是同一個 pod 內(nèi)掀潮,多個容器可以使用同一個目錄進(jìn)行數(shù)據(jù)的共享增热。
hostPath
hostPath 類型的 volume,是將主機(jī)上的目錄 mount 給 pod 的容器胧辽。與 emptyDir 不同的是峻仇,即使 pod 被銷毀了,hostPath 對應(yīng)的目錄數(shù)據(jù)也還會被保留邑商。
常見的有兩種場景:
- 用于同一主機(jī)上 pod 之間的數(shù)據(jù)共享摄咆;
- 某些固定在節(jié)點(diǎn)上,且需要數(shù)據(jù)持久化的應(yīng)用(如使用 DaemonSet 的應(yīng)用)人断。
大部分應(yīng)用都不會直接使用 hostPath volume吭从,因?yàn)檫@會增加了 pod 與節(jié)點(diǎn)的耦合,應(yīng)用難以伸縮和調(diào)度恶迈,所以很少會使用第一種場景涩金。
簡單介紹完 emptyDir 和 hostPath,其他類型的 volume 可以參考
官網(wǎng)說明暇仲。大家根據(jù)實(shí)際的需要去選擇步做,比如在公有云上,可以使用公有云提供的云盤奈附∪龋或者使用分布式存儲,如Ceph斥滤、GlusterFS等将鸵。