1、磁盘爆满
容器运行时使用的目录所在磁盘爆满
docker 默认使用的目录
/var/run/docker:用于存储容器运行状态,通过 dockerd 的--exec-root 参数指定。 /var/lib/docker:用于持久化容器相关的数据。例如,容器镜像、容器可写层数据、容器标准日志输出及通过 docker 创建的 volume 等。
故障现象
#pod启动过程事件
Warning FailedCreatePodSandBox 53m kubelet, 172.22.0.44 Failed create pod sandbox: rpc error: code = DeadlineExceeded desc = context deadline exceeded
Warning FailedCreatePodSandBox 2m (x4307 over 16h) kubelet, 10.179.80.31 (combined from similar events): Failed create pod sandbox: rpc error: code = Unknown desc = failed to create a sandbox for pod "apigateway-6dc48bf8b6-l8xrw": Error response from daemon: mkdir /var/lib/docker/aufs/mnt/1f09d6c1c9f24e8daaea5bf33a4230de7dbc758e3b22785e8ee21e3e3d921214-init: no space left on device
Warning Failed 5m1s (x3397 over 17h) kubelet, ip-10-0-151-35.us-west-2.compute.internal (combined from similar events): Error: container create failed: container_linux.go:336: starting container process caused "process_linux.go:399: container init caused \"rootfs_linux.go:58: mounting \\\"/sys\\\" to rootfs \\\"/var/lib/dockerd/storage/overlay/051e985771cc69f3f699895a1dada9ef6483e912b46a99e004af7bb4852183eb/merged\\\" at \\\"/var/lib/dockerd/storage/overlay/051e985771cc69f3f699895a1dada9ef6483e912b46a99e004af7bb4852183eb/merged/sys\\\" caused \\\"no space left on device\\\"\""
#pod删除过程事件
Normal Killing 39s (x735 over 15h) kubelet, 10.179.80.31 Killing container with id docker://apigateway:Need to kill Pod
2、kubelet使用的目录爆满
故障现象
Warning UnexpectedAdmissionError 44m kubelet, 172.22.0.44 Update plugin resources failed due to failed to write checkpoint file "kubelet_internal_checkpoint": write /var/lib/kubelet/device-plugins/.728425055: no space left on device, which is unexpected.
解决办法
手动删除 docker 的部分 log 文件或可写层文件。通常删除 log 文件,示例如下:
$ cd /var/lib/docker/containers
$ du -sh * # 找到比较大的目录
$ cd dda02c9a7491fa797ab730c1568ba06cba74cecd4e4a82e9d90d00fa11de743c
$ cat /dev/null > dda02c9a7491fa797ab730c1568ba06cba74cecd4e4a82e9d90d00fa11de743c-json.log.9 # 删除log文件
删除文件时,建议使用cat /dev/null > 方式进行删除,不建议使用rm。使用rm 方式删除的文件,不能够被 docker 进程释放掉,该文件所占用的空间也就不会被释放。 log 的后缀数字越大表示时间越久远,建议优先删除旧日志。
kubectl drain <node-name>
systemctl restart dockerd
# or systemctl restart docker
3、清理docker镜像
journalctl --vacuum-size=20M #设置journal 日志最大为20M不保留不必要日志。
docker image prune -a --filter "until=24h" # 清除超过创建时间超过24小时的镜像
docker container prune --filter "until=24h" #清除掉所有停掉的容器,但24内创建的除外
docker volume prune --filter "label!=keep" #除lable=keep外的volume外都清理掉(没有引用的volume)
docker system prune #清理everything:images ,containers,networks一次性清理操作可以通过docker system prune来搞定
4、k8s垃圾回收机制
镜像回收
--image-gc-high-threshold:磁盘使用率上限,有效范围 [0-100],默认 85
--image-gc-low-threshold:磁盘使用率下限,有效范围 [0-100],默认 80
--minimum-image-ttl-duration:镜像最短应该生存的年龄,默认 2 分钟
vim /etc/kubernetes kubelet.env
systemctl restart kubelet
systemctl status kubelet -fl
容器回收
MaxPerPodContainer 与 MaxContainers 的设置,按照 LRU 策略,从 Pod 的死亡容器列表删除一定数量的容器,直到满足配置需求;对于 sandbox 容器,按照每个 Pod 保留一个的原则清理多余的死亡 sandbox;对于日志目录,只要没有 Pod 与之关联了就将其删除。
Kubelet 的容器垃圾回收只针对 Pod 容器,非 Kubelet Pod 容器(比如通过 docker run 启动的容器)不会被主动清理。
影响容器垃圾回收的相关控制参数主要有三个:
--minimum-container-ttl-duration:从容器停止运行时起经过设置时间后,该容器标记为已过期将来可以被回收(只是标记,不是回收),默认值为1m0s # 1.22.5 不支持
--maximum-dead-containers-per-container:每个 pod 上可以留下运行结束之后的容器的个数,默认值为 2
--maximum-dead-containers:节点可保留的死亡容器的最大数量,默认值是 -1,这意味着节点没有限制死亡容器数量
【领取方式看这里】
扫描下方二维码~
备注:阿里实战笔记
100%免费领取
这份文档分为理论篇和实践篇两大部分,全文127页,内容丰富全面,图文并茂,可读性强,基于大厂实际生产环境的真实项目,实用性强。特别适合对K8S感兴趣的朋友们学习参考。
这份文档一共包含4大部分,实战总结一步到位,图文并茂,又想学习Docker和提升的朋友可以拿来学习参考。
资料源于网络,侵删
阿里爆款实战笔记
【配套PDF版资料】
免费领取,仅限前 100 名
扫描上方二维码~
备注:阿里实战笔记