關(guān)于 Kubernetes中Volume的一些筆記(二)
707
2025-03-31
容器中的文件在磁盤(pán)上是臨時(shí)存放的,當(dāng)容器重建時(shí),容器中的文件將會(huì)丟失,另外當(dāng)在一個(gè)Pod中同時(shí)運(yùn)行多個(gè)容器時(shí),常常需要在這些容器之間共享文件,這也是容器不好解決的問(wèn)題。 Kubernetes抽象出了Volume來(lái)解決這兩個(gè)問(wèn)題,也就是存儲(chǔ)卷,Kubernetes的Volume是Pod的一部分,Volume不是單獨(dú)的對(duì)象,不能獨(dú)立創(chuàng)建,只能在Pod中定義。
Pod中的所有容器都可以訪問(wèn)Volume,但必須要掛載,且可以?huà)燧d到容器中任何目錄。
實(shí)際中使用容器存儲(chǔ)如下圖所示,將容器的內(nèi)容掛載到Volume中,通過(guò)Volume兩個(gè)容器間實(shí)現(xiàn)了存儲(chǔ)共享。
Volume的生命周期與掛載它的Pod相同,但是Volume里面的文件可能在Volume消失后仍然存在,這取決于Volume的類(lèi)型。
Kubernetes的Volume有非常多的類(lèi)型,在實(shí)際使用中使用最多的類(lèi)型如下。
emptyDir:一種簡(jiǎn)單的空目錄,主要用于臨時(shí)存儲(chǔ)。
hostPath:將主機(jī)某個(gè)目錄掛載到容器中。
ConfigMap、Secret:特殊類(lèi)型,將Kubernetes特定的對(duì)象類(lèi)型掛載到Pod,在ConfigMap和Secret章節(jié)介紹過(guò)如何將ConfigMap和Secret掛載到Volume中。
persistentVolumeClaim:Kubernetes的持久化存儲(chǔ)類(lèi)型,詳細(xì)介紹請(qǐng)參考PV、PVC和StorageClass中會(huì)詳細(xì)介紹。
EmptyDir是最簡(jiǎn)單的一種Volume類(lèi)型,根據(jù)名字就能看出,這個(gè)Volume掛載后就是一個(gè)空目錄,應(yīng)用程序可以在里面讀寫(xiě)文件,emptyDir Volume的生命周期與Pod相同,Pod刪除后Volume的數(shù)據(jù)也同時(shí)刪除掉。
emptyDir的一些用途:
緩存空間,例如基于磁盤(pán)的歸并排序。
為耗時(shí)較長(zhǎng)的計(jì)算任務(wù)提供檢查點(diǎn),以便任務(wù)能從崩潰前狀態(tài)恢復(fù)執(zhí)行。
emptyDir配置示例如下。
apiVersion:?v1 kind:?Pod metadata: ??name:?nginx spec: ??containers: ??-?image:?nginx:alpine ????name:?test-container ????volumeMounts: ????-?mountPath:?/cache ??????name:?cache-volume ??volumes: ??-?name:?cache-volume????emptyDir:?{}
emptyDir實(shí)際是將Volume的內(nèi)容寫(xiě)在Pod所在節(jié)點(diǎn)的磁盤(pán)上,另外emptyDir也可以設(shè)置存儲(chǔ)介質(zhì)為內(nèi)存,如下所示,medium設(shè)置為Memory。
volumes: ??-?name:?html ????emptyDir: ??????medium:?Memory
HostPath是一種持久化存儲(chǔ),emptyDir里面的內(nèi)容會(huì)隨著Pod的刪除而消失,但HostPath不會(huì),如果對(duì)應(yīng)的Pod刪除,HostPath Volume里面的內(nèi)容依然存在于節(jié)點(diǎn)的目錄中,如果后續(xù)重新創(chuàng)建Pod并調(diào)度到同一個(gè)節(jié)點(diǎn),掛載后依然可以讀取到之前Pod寫(xiě)的內(nèi)容。
HostPath存儲(chǔ)的內(nèi)容與節(jié)點(diǎn)相關(guān),所以它不適合像數(shù)據(jù)庫(kù)這類(lèi)的應(yīng)用,想象下如果數(shù)據(jù)庫(kù)的Pod被調(diào)度到別的節(jié)點(diǎn)了,那讀取的內(nèi)容就完全不一樣了。
記住永遠(yuǎn)不要使用HostPath存儲(chǔ)跨Pod的數(shù)據(jù),一定要把HostPath的使用范圍限制在讀取節(jié)點(diǎn)文件上,這是因?yàn)镻od被重建后不確定會(huì)調(diào)度哪個(gè)節(jié)點(diǎn)上,寫(xiě)文件可能會(huì)導(dǎo)致前后不一致。
apiVersion:?v1 kind:?Pod metadata: ??name:?test-hostpath spec: ??containers: ??-?image:?nginx:alpine ????name:?hostpath-container ????volumeMounts: ????-?mountPath:?/test-pd ??????name:?test-volume ??volumes: ??-?name:?test-volume????hostPath: ??????path:?/data
了解更多Kubernetes集群相關(guān)知識(shí)和使用方法請(qǐng)猛擊這里。
Kubernetes
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。