k8s 中的卷
前面的文章我們分享了 pod ,RC,RS,DaemonSet,CJ,Service 等各種資源
今天我們來分享一波如何將磁盤掛載到容器中,在 docker 里面這種技術(shù)叫做 數(shù)據(jù)卷,感興趣的小伙伴可以查看一下文章:【Docker 系列】docker 學(xué)習(xí)六,探究一下數(shù)據(jù)卷容器
對(duì)于一個(gè) pod ,他有自己的 CPU,RAM,網(wǎng)絡(luò)接口等資源都是可以被 pod 里面的容器共享的,但是每一個(gè)容器是有自己獨(dú)立的文件系統(tǒng)的,那么在我們平時(shí)使用需要使用給到文件系統(tǒng)的時(shí)候就會(huì)出現(xiàn)這個(gè)問題
舉個(gè)例子
當(dāng)前 pod1 運(yùn)行著,產(chǎn)生了一些數(shù)據(jù),由于某種原因,該 pod 被重啟了(刪除該 pod1 ,重新啟動(dòng)一個(gè) pod2),新的 pod2 若期望繼續(xù)使用前一個(gè) pod1 產(chǎn)生的數(shù)據(jù),那么這種情況是不行的
因此,卷就有了用處
卷是什么呢?

這里的卷就是指的數(shù)據(jù)卷,他并不是 k8s 里面的一類資源,他只是被定義為 pod 的一部分,他在 k8s 中也不是獨(dú)立的對(duì)象,他是 pod 的一個(gè)組成部分,我們在寫 pod 清單的時(shí)候,就可以使用關(guān)鍵字 volume 來指定卷
我們知道,一個(gè) pod 里面可以定義多個(gè)容器,pod 里面的卷也可以被這這里面的多個(gè)容器共享,對(duì)于 pod 里面的卷,也并不是每一個(gè)容器都要使用,這些都是可以按照自己的需求進(jìn)行配置的
看圖說話:

一個(gè) pod 里面有 3 個(gè)容器,2 個(gè)卷,可以按照自己的需求去配置
卷的多種類型
卷的類型多種多樣,不同的需求會(huì)用到不同的卷,有如下這些類型
emptyDIr
gitRepo
hostPath
nfs
云服務(wù)商特定的存儲(chǔ)類型等等
特殊類型的卷
此處說的特殊類型的卷,指的是 configMap,secret,downloadApi 等類型的卷
本次分享主要是前 4 種類型的應(yīng)用場景和使用方式
emptyDir ,gitRepo
emptyDir
emptyDir ,根據(jù)名稱我們大概知道這是一個(gè)空目錄,也就是卷是從一個(gè)空的目錄開始的,咱們 pod 里面的多個(gè)容器都可以對(duì)他進(jìn)行寫入數(shù)據(jù),寫入一下臨時(shí)的大量數(shù)據(jù)也是可行的
但是有一點(diǎn)我們需要注意:
emptyDir 類型的卷,會(huì)隨著 pod 的啟動(dòng)而生成,隨著 pod 的刪除而消失
小案例
我們可以來模擬一下 pod 中,多個(gè)容器共享一個(gè)掛載的小案例
創(chuàng)建一個(gè)在卷中寫數(shù)據(jù)的鏡像,和創(chuàng)建一個(gè)從卷中讀取數(shù)據(jù)的鏡像
echo_uuid.sh
~/bin/bash
mkdir?/var/testuuid
while?:
do
??STR=`cat?/proc/sys/kernel/random/uuid`
??echo?${STR}?>?/var/testuuid/info.txt
??echo?uuid?-?${STR}
??sleep?5
done
主要功能是每隔 5 秒鐘在就會(huì)輸入一個(gè) uuid 到 文件/var/testuuid/info.txt
Dockerfile
FROM?ubuntu:latest
ADD?echo_uuid.sh?/bin/echo_uuid.sh
ENTRYPOINT?/bin/echo_uuid.sh
制作鏡像 echo_uuid
此處的 DockerHub 的賬號(hào),可以修改成讀者你自己的,記得需要在環(huán)境中登錄 docker 賬號(hào)
docker?build?-t?xiaomotong888/echo_uuid?.
docker?push?xiaomotong888/echo_uuid
query_uuid.sh
~/bin/bash
while?:
do
??echo?queryuuid:
??cat?/var/testuuid/info.txt
??sleep?5
done
主要功能就是每隔 5 秒鐘就會(huì)讀取一下文件 /var/testuuid/info.txt
的內(nèi)容
Dockerfile
FROM?ubuntu:latest
ADD?query_uuid.sh?/bin/query_uuid.sh
ENTRYPOINT?/bin/query_uuid.sh
制作鏡像 query_uuid
docker?build?-t?xiaomotong888/query_uuid?.
docker?push?xiaomotong888/query_uuid
編寫 yaml 文件:emptyDir_test.yaml
apiVersion:?v1
kind:?Pod
metadata:
??name:?testuuiddemo
spec:
??containers:
??-?image:?xiaomotong888/echo_uuid
????name:?echo-uuid
????volumeMounts:
????-?name:?uuid
??????mountPath:?/var/testuuid
??-?image:?xiaomotong888/query_uuid
????name:?query-uuid
????volumeMounts:
????-?name:?uuid
??????mountPath:?/var/testuuid
??????readOnly:?true
??volumes:
??-?name:?uuid
????emptyDir:?{}
上述編寫一個(gè) Pod 的清單,里面有 2 個(gè)容器,拉取的鏡像分別是 xiaomotong888/echo_uuid
, ?xiaomotong888/query_uuid
,且都掛載到 名為 uuid ,掛載路徑為 /var/testuuid ,
這里還需要注意一點(diǎn)的是,query-uuid 容器 對(duì)于上述掛載路徑是只讀的
通過 kubectl create -f emptyDir_test.yaml 之后我們可以看到效果:

查看 echo-uuid 容器的日志,在 pod 里面有多個(gè)容器的時(shí)候,查看日志的方式是
kubectl?logs?-f?podName?containerName

查看 query-uuid 容器的日志

通過上述例子我們就明確了,一個(gè) pod 里面的多個(gè)容器可以共享掛載的內(nèi)容
gitRepo
gitRepo 卷,其實(shí)和 emptyDir 類似,只不過 gitRepo 卷會(huì)克隆 Git 倉庫并在 pod 啟用的時(shí)候檢出特定的版本來填充數(shù)據(jù),就多了這么一個(gè)步驟
簡單來說就是:
上面的例子是,我們自己在指定的卷上面輸出數(shù)據(jù),而 gitRepo 就是在pod 啟動(dòng)的時(shí)候,去 git 倉庫拉取最新的 master 分支的最新版本,放到我們掛載的目錄下,如下圖所示:

用戶會(huì)先創(chuàng)建一個(gè)帶有 gitRepo 卷的 Pod
k8s 會(huì)創(chuàng)建一個(gè)空目錄,然后立即從 git 倉庫中拉取最新的 master 版本的數(shù)據(jù) , 通過這一點(diǎn),我們就知道,gitRepo 其實(shí) 和 emptyDir 沒啥區(qū)別
拉取 git 版本后,容器便啟動(dòng)完畢,這是卷已經(jīng)掛在掛載路徑上了
通過上述步驟,細(xì)心的朋友就可以看到,gitRepo 卷從 git 倉庫拉取的動(dòng)作,是在 pod 啟動(dòng)的時(shí)候,那么 pod 在運(yùn)行狀態(tài)的時(shí)候,若修改了 git 倉庫里面的內(nèi)容,那么 pod 里面的容器是不會(huì)同步數(shù)據(jù)的
必須是一個(gè)新的 pod 才會(huì)去拉取最新的 git 最新版本內(nèi)容
關(guān)于創(chuàng)建 pod ,配置上 gitRepo 倉庫我們可以簡單說一下:
apiVersion:?v1
kind:?Pod
metadata:
??name:?testuuiddemo
spec:
??containers:
??-?image:?xiaomotong888/echo_uuid
????name:?echo-uuid
????volumeMounts:
????-?name:?uuid
??????mountPath:?/var/testuuid
??volumes:
??-?name:?uuid
????gitRepo:
??????repository:?https://xxxxxxx.git
??????revision:?master
??????directory:?.
通過清單查看到,清單定義的前半部分內(nèi)容都是一致的,主要是后面 volumes 處 的區(qū)別

上面這倆都是比較簡單,比較基礎(chǔ)的卷,下一篇我們分享一下持久化的存儲(chǔ)涉及的卷
今天就到這里,學(xué)習(xí)所得,若有偏差,還請(qǐng)斧正
歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點(diǎn)贊關(guān)注收藏,下次見~