【kubernetes】持久化儲存之emptyDirHostPathNFS

使用過docker的同學應該都知道,docker只有容器層是可讀寫的,如果不將容器提交為映象,當容器被刪除後,可讀寫層的資料也會被刪除,無法保留。在docker的解決方案中,我們一般使用 -v 引數將一個目錄掛載容器中,實現資料持久化儲存。

而在kubernetes中,資料持久化儲存的解決方案更加豐富,今天主要是學習以下emptydir和hostpath這兩種本地儲存和網路儲存nfs。

【kubernetes】持久化儲存之emptyDirHostPathNFS

01 emptyDir

emptyDir是一個空目錄,不需要提前建立相關目錄,他的宣告週期和Pod是完全一致的,Pod被刪除時,emptyDir也會被刪除。emptyDir主要是用於同一個Pod內不同的容器之間共享工作過程中產生的檔案。

比如以下這種模型,busybox每隔1s向index。html寫入當前時間,當用戶不同的時間訪問nginx提供的index。html時,就會產生不同的結果。再比如同個pod內有一個container產生臨時資料,另一個container對資料進行分析並儲存的場景,也可以使用emptyDir。

【kubernetes】持久化儲存之emptyDirHostPathNFS

準備emptydir。yaml檔案

mptydir除了預設支援的目錄以外,還可以支援Menory和HugePages,提供快的訪問速率。

應用資源

檢視pod和svc

測試:

登入容器所在node節點,檢視掛載資訊:

可以看出兩個容器掛載的是同一個目錄,而且這個目錄是自動建立的。

重啟pod,檢視目錄內容是否會被清空

再次檢視掛載資訊,很明顯可以看到重啟前後的目錄不一樣了,而且檢視重啟前的目錄,已經不存在。—— 所以emptyDir和pod的生命週期是一致的。

02 HostPath

與emptyDir相比,Hostpath的資料是獨立於pod生命週期的。

HostPath可以將node的目錄/檔案/socket/dev等檔案掛載到pod中。比如jenkins將harbor倉庫主機的docker的sock檔案掛載到了pod內,實現映象自動打包上傳等場景會使用到HostPath。

【kubernetes】持久化儲存之emptyDirHostPathNFS

事實上HostPath比較少用,因為我們無法保證叢集內每個主機都有相同的目錄,目錄中都有相同的內容,如果這都不能保證,那容器一次打包到處執行的特點就無法體現了。

本地資源的HostPath實驗:

在一個節點上建立/data/html目錄,並生成index。html檔案,透過HostPath掛載給pod。

【kubernetes】持久化儲存之emptyDirHostPathNFS

資源配置清單:

準備目錄:

應用:

檢視pod

很不幸,我只在host22上準備了/data/html資源,而pod被排程到了host21上,導致pod無法正常執行。—— 如果無法保證叢集內所有節點都有該目錄且內容相同,建議不要使用本地資源hostpath。

【kubernetes】持久化儲存之emptyDirHostPathNFS

在host21上也建立相同的目錄和內容

再檢視相關資源

測試:

刪除pod,再檢視資料是否被清除 —— 可以看到資料依舊還保留著。

HostPath補充:

支援的type:

【kubernetes】持久化儲存之emptyDirHostPathNFS

支援掛載模式:

【kubernetes】持久化儲存之emptyDirHostPathNFS

03 NFS

在節點網路與NFS Server網路互通的情況下,使用nfs儲存可以保證container一次打包,叢集內任意節點執行,和hostpath一樣,nfs資料獨立於pod的生命週期。

  nfs實驗:

【kubernetes】持久化儲存之emptyDirHostPathNFS

host200上準備nfs資源 —— 略

資源配置清單

應用和測試:

——-太晚了,就寫到這吧,再見。

TAG: Pod目錄HostPath掛載容器