我們繼續(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 卷對(duì)節(jié)點(diǎn)真的是非常敏感的。
一般 hostPath卷使用的都是一些系統(tǒng)級(jí)別的 Pod ,例如在 kube-system 命名空間下面 被 DaemonSet 管控的一些系統(tǒng)級(jí)別的 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í)所得,若有偏差,還請(qǐng)斧正
歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力
好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點(diǎn)贊關(guān)注收藏,下次見~文章來源:http://www.zghlxwxcb.cn/news/detail-561698.html
更多的可以查看 零聲每晚八點(diǎn)直播:https://ke.qq.com/course/417774文章來源地址http://www.zghlxwxcb.cn/news/detail-561698.html
到了這里,關(guān)于k8s 持久化存儲(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!