Kubernetes之容器數據寫滿磁盤解決方法(docker 日誌滾動)

https://blog.csdn.net/qq_24794401/article/details/105963839
磁盤寫滿引發的後果
容器數據磁盤寫滿造成的後果:

Pod 不能刪除 (一直 Terminating)

Pod 不能被創建 (一直 ContainerCreating)

磁盤寫滿分兩種情況:

磁盤空間全部使用完

系統盤被佔滿

$ df -Th

文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/vda1 ext4 50G 50G 0G 100% /
/dev/vdb1 ext4 100G 10G 90G 10% /data
磁盤 Inode 全部使用完

數據盤 Inode 被佔滿

$ df -i

文件系統 Inode 已用(I) 可用(I) 已用(I)% 掛載點
/dev/vda1 3276800 3276800 0 100% /
判斷磁盤寫滿方法
下面命令能快速的排查磁盤佔滿原因:

docker info | grep 'Docker Root Dir' # 檢查 Docker 存儲目錄

docker system df # 查看容器磁盤使用情況

df -hT # 檢查宿主機 磁盤空間 使用情況

df -i # 檢查宿主機 Inode 使用情況

解決方法
PS:保證業務能正常使用爲第一原則解決問題

標記 Node 爲不可調度

$ kubectl drain ${node-name}
查找那個容器輸出日誌佔用最大

$ for name in $(docker ps -a | awk '{print $1}' | grep -v CONTAINER); do docker inspect $name | grep LogPath | awk '{print $NF}' | tr -d '",' |xargs du -sh;done

5G /var/lib/docker/containers/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a-json.log
清空容器日誌文件

注意:如果需要重啓 docker服務,首先騰出一點磁盤空間,不然重啓 docker 會失敗。不能直接使用 rm 刪除日誌文件,這樣磁盤空間是不會釋放的。不小心這樣操作,那隻能通過 systemctl restart docker 重啓 Docker 服務釋放磁盤空間,如果磁盤還是沒有釋放,可以通過 lsof | grep -i delete 查找已刪除的文件進程,找到後直接 kill掉。

通過 echo 命令 清空日誌文件

$ echo > /var/lib/docker/containers/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a-json.log
清理節點不用的 images,釋放磁盤空間

查看 docker 鏡像

$ docker images

刪除不用的鏡像

$ docker rmi ${images_id}
上面步驟操作完後(上面清理日誌方法,可能對於收集日誌程序會丟失一些日誌,但一般情況能接受),可以選擇驅趕節點上所有pod(kubectl drain ${node-name} )再優化Docker配置。也可以不驅趕節點上pod,在現基礎上優化容器日誌方法,優化配置後重啓 Docker,這會導致節點上pod中斷一會,如果前端反向代理具備重試機制一般不會影響業務正常訪問。

優化完 Docker配置後,把節點加入到k8s集羣中,正常服務。

取消不可調度的標記

$ kubectl uncordon ${node-name}
定位問題根本原因及解決思路
日誌輸出量大,導致磁盤寫滿

減少日誌輸出,調整應用日誌輸出級別

增大磁盤空間

日誌輸出到統一日誌收集中心

容器鏡像佔滿磁盤

配置k8s垃圾回收策略

節點運行 images 定時清理腳本

可寫層量大導致磁盤寫滿: 優化程序邏輯,不寫文件到容器內或控制寫入文件的大小與數量

具體優化方法
配置 Docker日誌輪轉,數據目錄不要存放在系統盤

$ vim /etc/docker/daemon.json

{"registry-mirrors": ["https://4xr1qpsp.mirror.aliyuncs.com"], "graph": "/data/docker", "log-opts": {"max-size":"500m", "max-file":"3"}}
配置解釋:

配置完,重啓 docker才能生效,日誌輪轉只對以後新創建的容器有效。

registry-mirrors 鏡像加速配置

graph 定義數據存儲目錄

max-size=500m 意味着一個容器日誌大小上限是500M

max-file=3,意味着一個容器有三個日誌,分別是id+.json、id+1.json、id+2.json

清理 docker images

定時清理腳本

$ vim docker_delete_image.sh
#!/usr/bin/env bash

for images_id in docker images | grep 'harbor.example.com' | awk '{print $3}'
do
docker rmi $images_id
done

清理 <none> images

for images_id_1 in docker images | awk '$2 ~ "&lt;none&gt;"{print $3}'
do
docker rmi $images_id_1
done
kubernetes 垃圾回收配置,這裏不在細講,具體參考官方配置文檔 https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/

參考鏈接
https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/

https://mp.weixin.qq.com/s/IolydydvQoRh1okI7aWuiA
————————————————
版權聲明:本文爲CSDN博主「YP小站」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_24794401/java/article/details/105963839

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章