k8s 持久化存儲(chǔ)
我們繼續(xù)來查看 k8s 的卷,上一次我們分享了將磁盤掛載到容器中,empyDir 和 gitRepo 都是會(huì)隨著 pod 的啟動(dòng)而創(chuàng)建,隨著 pod 的刪除而銷毀
那么我們或許會(huì)有這樣的需求,期望在 pod 上面讀取節(jié)點(diǎn)的文件或者使用節(jié)點(diǎn)的文件系統(tǒng)來訪問節(jié)點(diǎn)的設(shè)備
這個(gè)時(shí)候,我們就可以讓 hostPath 出馬了
hostPath
咱們來看圖說話

hostPath 卷會(huì)指向節(jié)點(diǎn)文件系統(tǒng)上的特定文件或者目錄,我們同時(shí)在一個(gè)節(jié)點(diǎn)上運(yùn)行并在 hostPath 卷中使用相同的路徑的 pod ,就可以看到相同的文件了
使用 hostPath 卷的時(shí)候,哪怕我們刪除 pod ,hostPath 卷的內(nèi)容也不會(huì)被刪除,若現(xiàn)在啟動(dòng)了一個(gè) pod,也會(huì)發(fā)現(xiàn)之前被刪除 pod 留下來的數(shù)據(jù)(這里必須是在同一個(gè)工作節(jié)點(diǎn)上的 pod)
發(fā)現(xiàn)問題
通過上面的 hostPath 的介紹,我們知道 hostPath 卷的數(shù)據(jù)是放在工作節(jié)點(diǎn)上的,若是節(jié)點(diǎn) A 上的 pod 被重啟,重啟后的 pod 跑到 節(jié)點(diǎn) B 去了,那么新的 pod 是沒有版本訪問到之前 pod 產(chǎn)生或者是掛載的數(shù)據(jù)的
因此,我們使用 hostPath 卷的時(shí)候,要慎重考慮,因此 hostPath 卷對節(jié)點(diǎn)真的是非常敏感的。
一般 hostPath卷使用的都是一些系統(tǒng)級別的 Pod ,例如在 kube-system 命名空間下面 被 DaemonSet 管控的一些系統(tǒng)級別的 pod,會(huì)使用 hostPath
這些 pod 被 DaemonSet ?管控,每一個(gè)節(jié)點(diǎn)只會(huì)有 1 個(gè)副本,若節(jié)點(diǎn)上的副本發(fā)生異常,那么會(huì)馬上在當(dāng)前節(jié)點(diǎn)立刻創(chuàng)建一個(gè) 新的 pod ,因此,新的 pod ,自然就能夠正常的訪問到 上一個(gè) pod 留下來的數(shù)據(jù)了,自然就可以接著上一個(gè) pod 的運(yùn)行狀態(tài)運(yùn)行下去了
持久化存儲(chǔ)
就上面的這個(gè)問題,如果我們的 pod 無論跑到那個(gè)節(jié)點(diǎn)上的時(shí)候,都需要每個(gè)節(jié)點(diǎn)都有相同的數(shù)據(jù)可以使用,這個(gè)時(shí)候我們可以如何處理呢?
我們可以創(chuàng)建一個(gè) pod,里面跑一個(gè)帶有持久卷 hostPath 的數(shù)據(jù)庫,可以是 mongodb
mongodb-pod-hostpath.yaml
apiVersion:?v1
kind:?Pod
metadata:
??name:?xmt-mongodb
spec:
??volumes:
??-?name:?mongodb-data
????hostPath:
??????path:?/tmp/mongodb
??containers:
??-?image:?mongo
????name:?mongodb
????volumeMounts:
????-?name:?mongodb-data
??????mountPath:?/data/db
????ports:
????-?containerPort:?27017
??????protocol:?TCP
寫一個(gè) pod 的清單,hostPath 卷設(shè)置 ?
/tmp/mongodb
創(chuàng)建的容器,使用 mongo, 容器掛載的路徑是
/data/db
容器端口設(shè)置 mongodb 的默認(rèn)端口 27017
kubectl create -f ?mongodb-pod-hostpath.yaml 創(chuàng)建 pod 后查看效果

我們的思路是,進(jìn)入到 mongodb ?Pod 中 ,完成如下 2 步驟
第一步驟:
創(chuàng)建一個(gè)數(shù)據(jù)庫,mytest
創(chuàng)建一張表命名為 test
插入一條數(shù)據(jù),數(shù)據(jù)為 name:’xiaomotong888’
第二步驟:
然后刪除這個(gè) mongodb Pod 后,重新啟動(dòng)一個(gè)一模一樣的 mongodb Pod
查看剛才插入的數(shù)據(jù)是否還在,若在,說明 hostPath 的卷的內(nèi)容不會(huì)隨著 pod 的刪除而被銷毀掉
第一步:

?use?mytest
switched?to?db?mytest
?db.test.insert({name:'xiaomotong888'})
WriteResult({?"nInserted"?:?1?})
?db.test.find()
{?"_id"?:?ObjectId("61ed74f43c34bef84d2f5a4c"),?"name"?:?"xiaomotong888"?}
第二步:


通過上圖已經(jīng)證實(shí)了我們上述的想法,這是符合預(yù)期的,哪怕 pod 被刪除后重建,持久化存儲(chǔ)的磁盤中仍然有 pod 實(shí)例中持久化的數(shù)據(jù)
另外一個(gè)持久化存儲(chǔ)卷
還記得之前我們列的一堆卷類型,emptyDir,gitRepo,hostPath 都說了,現(xiàn)在就差 NFS 卷了
NFS 卷
NFS 卷是啥呢?
顧名思義,網(wǎng)絡(luò)文件系統(tǒng)的卷,這個(gè)卷用起來就比較方便了,寫清單的時(shí)候也是非常容易的,我們只需要指定 NFS 的 server 地址 和路徑即可
例如可以這樣:
。。。
volumes:
??-?name:?mongodbxxxx
????nfs:
??????server:?x.x.x.x
??????path:?/xx/xx/xx/xx
。。。
這個(gè)用起來就沒有那么多幺蛾子,數(shù)據(jù)掛載了別的地方,這些數(shù)據(jù)都是持久化的,跟 pod 的啟動(dòng),刪除,就沒有什么關(guān)系了
今天就到這里,學(xué)習(xí)所得,若有偏差,還請斧正
歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

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