1. ephemeral-storage介紹
Kubernetes在1.8的版本中引入了一種相似於CPU,RAM的新的資源模式:ephemeral-storage屬性(直譯爲臨時存儲),而且在1.10的版本kubelet默認啓用了這個特性。node
ephemeral-storage實現了對Pod應用存儲資源的管理,能夠有效的下降Pod應用失控消耗完 node磁盤空間的風險。官網中對該屬性的描述以下:docker
(https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/):ubuntu
從上述官網介紹,總結以下:bash
- 臨時存儲:臨時的含義是指容器內的數據未作持久化處理,生命週期和容器一致。
- 做用對象:容器日誌(/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 磁盤app
2) 分區:/var/lib/docker、/var/lib/kubelet/和/var/log全在同一個系統分區上測試
- 測試容器鏡像
1) Dockerfilespa
FROM ubuntu:16.04 ADD start.sh /home/ RUN mkdir -p /lq/log/ ENTRYPOINT /home/start.sh
2) Start.sh.net
#!/bin/bash while true do dateString=`date` echo "$dateString==================================">> /lq/log/test.log done
- 集羣環境
1) Kuberneters版本:1.15.63d
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管理的是容器相關的目錄路徑下的磁盤大小,本身顯式掛載的定製化路徑沒法控制磁盤空間