K8S-磁碟配額管理-整理
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管理的是容器相關的目錄路徑下的磁碟大小,自己顯式掛載的定製化路徑無法控制磁碟空間
4. 參考文件
- https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
- https://blog.csdn.net/sdmei/article/details/101017405(總結的非常好)