在節點在創建時會默認創建一塊數據盤,供容器運行時和Kubelet組件使用,詳情請參見數據盤空間分配說明。由于容器運行時和Kubelet組件使用的數據盤不可被卸載,且默認大小為100G,出于使用成本考慮,您可手動調整該數據盤容量,最小支持下調至20G,節點上掛載的普通數據盤支持下調至10G。
須知
調整容器運行時和Kubelet組件使用的數據盤大小存在一些風險,根據本文提供的預估方法,建議綜合評估后再做實際調整。
- 過小的數據盤容量可能會頻繁出現磁盤空間不足,導致鏡像拉取失敗的問題。如果節點上需要頻繁拉取不同的鏡像,不建議將數據盤容量調小。
- 集群升級預檢查會檢查數據盤使用量是否超過95%,磁盤壓力較大時可能會影響集群升級。
- Device Mapper類型比較容易出現空間不足的問題,建議使用OverlayFS類型操作系統,或者選擇較大數據盤。
- 從日志轉儲的角度,應用的日志應單獨掛盤存儲,以免dockersys分區存儲空間不足,影響業務運行。
- 調小數據盤容量后,建議您的集群安裝npd插件,用于檢測可能出現的節點磁盤壓力問題,以便您及時感知。如出現節點磁盤壓力問題,可根據數據盤空間不足時如何解決進行解決。
約束與限制
- 僅1.19及以上集群支持調小容器運行時和Kubelet組件使用的數據盤容量。
- 調整數據盤大小功能只支持云硬盤,不支持本地盤(本地盤僅在節點規格為“磁盤增強型”或“超高I/O型”時可選)。
如何選擇合適的數據盤
在選擇合適的數據盤大小時,需要結合以下考慮綜合計算:
- 在拉取鏡像過程中,會先從鏡像倉庫中下載鏡像tar包然后解壓,最后刪除tar包保留鏡像文件。在tar包的解壓過程中,tar包和解壓出來的鏡像文件會同時存在,占用額外的存儲空間,需要在計算所需的數據盤大小時額外注意。
- 在集群創建過程中,節點上可能會部署必裝插件(如Everest插件、coredns插件等),這些插件會占用一定的空間,在計算數據盤大小時,需要為其預留大約2G的空間。
- 在應用運行過程中會產生日志,占用一定的空間,為保證業務正常運行,需要為每個Pod預留大約1G的空間。
OverlayFS類型
OverlayFS類型節點上的容器引擎和容器鏡像空間默認占數據盤空間的90%(建議維持此值),這些容量全部用于dockersys分區,計算公式如下:
- 容器引擎和容器鏡像空間:默認占數據盤空間的90%,其空間大小 = 數據盤空間 * 90%
dockersys分區(/var/lib/docker路徑):容器引擎和容器鏡像空間(默認占90%)都在/var/lib/docker目錄下,其空間大小 = 數據盤空間 * 90%
- Kubelet組件和EmptyDir臨時存儲:占數據盤空間的10%,其空間大小 = 數據盤空間 * 10%
在OverlayFS類型的節點上,由于拉取鏡像時,下載tar包后會存在解壓過程,該過程中tar包和解壓出來的鏡像文件會同時存在于dockersys空間,會占用約2倍的鏡像實際容量大小,等待解壓完成后tar包會被刪除。因此,在實際鏡像拉取過程中,除去系統插件鏡像占用的空間后,需要保證dockersys分區的剩余空間大于2倍的鏡像實際容量。為保證容器能夠正常運行,還需要在dockersys分區預留出相應的Pod容器空間,用于存放容器日志等相關文件。
因此在選擇合適的數據盤時,需滿足以下公式:
dockersys分區容量 > 2*鏡像實際總容量 + 系統插件鏡像總容量(約2G) + 容器數量 * 單個容器空間(每個容器需預留約1G日志空間)
說明
當容器日志選擇默認的json.log形式輸出時,會占用dockersys分區,若容器日志單獨設置持久化存儲,則不會占用dockersys空間,請根據實際情況估算單個容器空間。
例如:假設節點的存儲類型是OverlayFS,節點數據盤大小為20G。根據上述計算公式,默認的容器引擎和容器鏡像空間比例為90%,則dockersys分區盤占用:20G*90% = 18G,且在創建集群時集群必裝插件可能會占用2G左右的空間。倘若此時您需要部署10G的鏡像tar包,但是由于解壓tar包時大約會占用20G的dockersys空間,再加上必裝插件占用的空間,超出了dockersys剩余的空間大小,極有可能導致鏡像拉取失敗。
Device Mapper類型
Device Mapper類型節點上的容器引擎和容器鏡像空間默認占數據盤空間的90%(建議維持此值),這些容量又分為dockersys分區和thinpool空間,計算公式如下:
- 容器引擎和容器鏡像空間:默認占數據盤空間的90%,其空間大小 = 數據盤空間 * 90%
dockersys分區(/var/lib/docker路徑):默認占比20%,其空間大小 = 數據盤空間 * 90% * 20%
thinpool空間:默認占比為80%,其空間大小 = 數據盤空間 * 90% * 80%
- Kubelet組件和EmptyDir臨時存儲:占數據盤空間的10%,其空間大小 = 數據盤空間 * 10%
在Device Mapper類型的節點上,拉取鏡像時tar包會在dockersys分區臨時存放,等tar包解壓后會把實際鏡像文件存放在thinpool空間,最后dockersys空間的tar包會被刪除。因此,在實際鏡像拉取過程中,需要保證dockersys分區的空間大小和thinpool空間大小均有剩余。由于dockersys空間比thinpool空間小,因此在計算數據盤空間大小時,需要額外注意。為保證容器能夠正常運行,還需要在dockersys分區預留出相應的Pod容器空間,用于存放容器日志等相關文件。
因此在選擇合適的數據盤時,需同時滿足以下公式:
- dockersys分區容量 > tar包臨時存儲(約等于鏡像實際總容量) + 容器數量 * 單個容器空間(每個容器需預留約1G日志空間)
- thinpool空間 > 鏡像實際總容量 + 系統插件鏡像總容量(約2G)
說明
當容器日志選擇默認的json.log形式輸出時,會占用dockersys分區,若容器日志單獨設置持久化存儲,則不會占用dockersys空間,請根據實際情況估算單個容器空間。
例如:假設節點的存儲類型是Device Mapper,節點數據盤大小為20G。根據上述計算公式,默認的容器引擎和容器鏡像空間比例為90%,則dockersys分區盤占用:20G*90%*20% = 3.6G,且在創建集群時集群必裝插件可能會占用2G左右的dockersys空間,所以剩余1.6G左右。倘若此時您需要部署大于1.6G的鏡像tar包,雖然thinpool空間足夠,但是由于解壓tar包時dockersys分區空間不足,極有可能導致鏡像拉取失敗。
數據盤空間不足時如何解決
方案一:清理鏡像
您可以執行以下命令清理未使用的Docker鏡像:
docker system prune -a
說明
該命令會把暫時沒有用到的Docker鏡像都刪除,執行命令前請確認。
方案二:擴容磁盤
步驟 1 在EVS界面擴容數據盤。
步驟 2 登錄CCE控制臺,進入集群,在左側選擇“節點管理”,單擊節點后的“同步云服務器”。
步驟 3 登錄目標節點。
步驟 4 使用lsblk命令查看節點塊設備信息。
這里存在兩種情況,根據容器存儲Rootfs而不同。
- Overlayfs,沒有單獨劃分thinpool,在dockersys空間下統一存儲鏡像相關數據。
#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 50G 0 disk└─sda1 ???????????????8:1 ???0 ??50G ?0 part /sdb 8:16 0 200G 0 disk├─vgpaas-dockersys ?253:0 ???0 ??90G ?0 lvm ?/var/lib/docker ?????
docker使用的空間
└─vgpaas-kubernetes 253:1 ???0 ??10G ?0 lvm ?/mnt/paas/kubernetes/kubelet ?# kubernetes使用的空間
在節點上執行如下命令,將新增的磁盤容量加到dockersys盤上。
pvresize /dev/sdblvextend -l+100%FREE -n vgpaas/dockersysresize2fs /dev/vgpaas/dockersys
- Devicemapper,單獨劃分了thinpool存儲鏡像相關數據。
#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 50G 0 disk└─sda1 ???????????????????????????????8:1 ???0 ??50G ?0 part /sdb 8:16 0 200G 0 disk├─vgpaas-dockersys ?????????????????253:0 ???0 ??18G ?0 lvm ?/var/lib/docker ???├─vgpaas-thinpool_tmeta ????????????253:1 ???0 ???3G ?0 lvm ??????????????????│ └─vgpaas-thinpool ????????????????253:3 ???0 ??67G ?0 lvm ???
thinpool空間
│ ??...├─vgpaas-thinpool_tdata ????????????253:2 ???0 ??67G ?0 lvm ?│ └─vgpaas-thinpool ????????????????253:3 ???0 ??67G ?0 lvm ?│ ??...└─vgpaas-kubernetes ????????????????253:4 ???0 ??10G ?0 lvm ?/mnt/paas/kubernetes/kubelet
在節點上執行如下命令,將新增的磁盤容量加到thinpool盤上。
pvresize /dev/sdblvextend -l+100%FREE -n vgpaas/thinpool
在節點上執行如下命令,將新增的磁盤容量加到dockersys盤上。
- pvresize /dev/sdb
- lvextend -l+100%FREE -n vgpaas/dockersys
- resize2fs /dev/vgpaas/dockersys