使用過docker的同學應該都知道,docker只有容器層是可讀寫的,如果不將容器提交為映象,當容器被刪除後,可讀寫層的資料也會被刪除,無法保留。在docker的解決方案中,我們一般使用 -v 引數將一個目錄掛載容器中,實現資料持久化儲存。
而在kubernetes中,資料持久化儲存的解決方案更加豐富,今天主要是學習以下emptydir和hostpath這兩種本地儲存和網路儲存nfs。
01 emptyDir
emptyDir是一個空目錄,不需要提前建立相關目錄,他的宣告週期和Pod是完全一致的,Pod被刪除時,emptyDir也會被刪除。emptyDir主要是用於同一個Pod內不同的容器之間共享工作過程中產生的檔案。
比如以下這種模型,busybox每隔1s向index。html寫入當前時間,當用戶不同的時間訪問nginx提供的index。html時,就會產生不同的結果。再比如同個pod內有一個container產生臨時資料,另一個container對資料進行分析並儲存的場景,也可以使用emptyDir。
準備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。
事實上HostPath比較少用,因為我們無法保證叢集內每個主機都有相同的目錄,目錄中都有相同的內容,如果這都不能保證,那容器一次打包到處執行的特點就無法體現了。
本地資源的HostPath實驗:
在一個節點上建立/data/html目錄,並生成index。html檔案,透過HostPath掛載給pod。
資源配置清單:
準備目錄:
應用:
檢視pod
很不幸,我只在host22上準備了/data/html資源,而pod被排程到了host21上,導致pod無法正常執行。—— 如果無法保證叢集內所有節點都有該目錄且內容相同,建議不要使用本地資源hostpath。
在host21上也建立相同的目錄和內容
再檢視相關資源
測試:
刪除pod,再檢視資料是否被清除 —— 可以看到資料依舊還保留著。
HostPath補充:
支援的type:
支援掛載模式:
03 NFS
在節點網路與NFS Server網路互通的情況下,使用nfs儲存可以保證container一次打包,叢集內任意節點執行,和hostpath一樣,nfs資料獨立於pod的生命週期。
nfs實驗:
host200上準備nfs資源 —— 略
資源配置清單
應用和測試:
——-太晚了,就寫到這吧,再見。