1. ephemeral-storage介紹
Kubernetes在1.8的版本中引入了一種類似於CPU,RAM的新的資源模式:ephemeral-storage屬性(直譯為臨時存儲),並且在1.10的版本kubelet默認啟用了這個特性。
ephemeral-storage實現了對Pod應用存儲資源的管理,可以有效的降低Pod應用失控消耗完 node磁盤空間的風險。官網中對該屬性的描述如下:
(https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/):
從上述官網介紹,總結如下:
- 臨時存儲:臨時的含義是指容器內的數據未做持久化處理,生命周期和容器一致。
- 作用對象:容器日志(/var/log)、EmptyDir類型的volume數據(/var/lib/kubelet)、鏡像層和容器可寫層(/var/lib/docker)。由此可見,基本覆蓋了Pod各個方面的磁盤消耗。
- 管理的文件系統:ephemeral-storage對kubelet的根目錄(默認是/var/lib/kubelet)所在的節點分區(文件系統)進行管理,即如果把/var/lib/docker獨立分區,ephemeral-storage將不對/var/lib/docker目錄進行管理。
- Pod調度流程:節點上的kubelet啟動的時候,kubelet會統計當前節點的kubelet分區的可分配的磁盤資源,或者你可以覆蓋節點上kubelet的配置來自定義可分配的資源。在創建Pod時會根據存儲需求調度到滿足存儲的節點,在Pod使用超過限制的存儲時會對其做驅逐的處理來保證不會耗盡節點上的磁盤空間。
2. ephemeral-storage功能驗證
2.1 環境准備
- 虛擬機配置
1) 規格:16 vCpu + 80 GB RAM + 1000 GB 磁盤
2) 分區:/var/lib/docker、/var/lib/kubelet/和/var/log全在同一個系統分區上
- 測試容器鏡像
1) Dockerfile
FROM ubuntu:16.04 ADD start.sh /home/ RUN mkdir -p /lq/log/ ENTRYPOINT /home/start.sh
2) Start.sh
#!/bin/bash while true do dateString=`date` echo "$dateString==================================">> /lq/log/test.log done
- 集群環境
1) Kuberneters版本:1.15.6
2) Docker版本:18.06
2.2 容器可寫層大小
- 容器的部署文件
說明:
1) 容器的啟動腳本start.sh會持續的向容器內路徑/lq/log下寫test.log日志
2) 該日志並未掛載出來,故日志文件在宿主機的容器可寫層目錄下
3) 該容器申請10Mi的磁盤空間,上限為20Mi
- 創建該Pod
使用kubectl apply -f xxxx.yaml,觀察可寫層日志大小情況以及Pod運行情況
很快可寫層的日志就達到了16Mi
- 繼續觀察Pod
Pod驅逐了(容器被殺掉,容器內數據全部丟失)
從上述Event事件可以看到,Pod可用磁盤空間被限制住了
2.3 EmptyDir日志
- 部署文件
說明:
1) 容器的啟動腳本start.sh會持續的向容器內路徑/lq/log下寫test.log日志
2) 該日志通過EmptyDir掛載出來,故日志文件在宿主機的/var/lib/kubelet目錄下
3) 該容器申請10Mi的磁盤空間,上限為100Mi,emptyDir路徑上限為40Mi
- 創建該Pod
使用kubectl apply -f xxxxxxxx.yaml
- 查詢日志路徑以及Pod運行情況
可以看到日志已經到了32Mi,目前Pod運行正常
- 繼續等待,觀察Pod情況
Pod被驅逐了(容器殺死,全部數據丟失)
- 查看Pod事件
可見該日志磁盤空間被限制了
2.4 /var/log目錄日志
一般Pod的啟動日志(k8s上的控制台日志)會記錄到宿主機的/var/log目錄下,並且根據前面介紹得知ephemeral-storage會對該目錄下的容器日志磁盤空間大小進行管理,但是由於我使用的測試鏡像並無啟動日志,故通過hostPath掛載的方式掛載到該路徑下,看看我們顯示指定掛載路徑的時候,ephemeral-storage還能否生效。
- 部署文件
- 創建該Pod
- 觀察Pod運行情況
可以看到,自己顯示掛載的路徑並做不到磁盤空間限制。
- 換一種思路
由於無啟動日志,故想書寫腳本向容器的啟動日志瘋狂輸出日志,觀測Pod運行情況
1) 修改start.sh
2) 修改部署文件
3) 創建該Pod
Docker logs查看,容器在瘋狂的輸出日志
4) 持續一段時間,觀察Pod運行狀態
Pod驅逐了
2.5 其他情況說明
- /var/lib/docker和/var/lib/docker分區文件系統不一致。未做截圖,但是已經實際驗證:/var/lib/docker的分區和kubelet分區不一致的時候,ephemeral-storage對/var/lib/docker目錄磁盤空間大小不做管控
3. 驗證結論
- 分區要一致,否則ephemeral-storage管理不到
- ephemeral-storage管理的是容器相關的目錄路徑下的磁盤大小,自己顯式掛載的定制化路徑無法控制磁盤空間