问题描述: 在安装erda的时候.三台机器的iowait 激增, 每个cpu的iowait 都达到了99% . 导致k8s组件宕机.
节点配置
节点名称
cpu
内存
磁盘大小
ip
master/node1
4
12G
20GB
192.168.1.221
node2
4
12G
20GB
192.168.1.222
node3
4
12G
20GB
192.168.1.223
问题排查
使用pidstat , vmstat 观察机器状况, 观察是否存在IO激增的情况. 或者过多的中断和上下文切换.
排查下来, 机器的cpu 和, 文件读写非常的正常. 无果.
观察容器.
docker ps -a , 发现容器已经都exit 了. 怀疑资源不够,或者异常的api server 访问. 导致etcd 和apisever 挂掉. 抓包, 监听端口. 一样没有什么问题. 无果
检查kubelet
使用如下命令,查看kubelet日志.
1 2 journalctl -u kubelet -f -n 1000
发现如下信息.
1 I0714 18 :03 :20.883489 51179 image_gc_manager.go:300 ] [imageGCManager ]: Disk usage on image filesystem is at 86 % which is over the high threshold (85 %). Trying to free 72470076620 bytes down to the low threshold (1 %).
得到结果. 是helm 启动erda的时候在拉取erda镜像. 然后我们剥离helm 中所有的erda镜像,观测镜像的总容量大小.如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 set -ux images=( registry.erda.cloud/erda/addon-cassandra :3.11 .10 registry.erda.cloud/erda/addon-elasticsearch :6.2 .4 registry.erda.cloud/erda/addon-kafka :1.1 .0 -20210323 -be01a9b registry.erda.cloud/erda/addon-kms :1.3 .0 -alpha -20210903152500 -a3196f34 registry.erda.cloud/erda/addon-redis :3.2 .12 registry.erda.cloud/erda/addon-registry :2.7 .1 registry.erda.cloud/erda/addon-sonar :8.4 .2 registry.erda.cloud/erda/addon-zookeeper :3.4 .13 -monitor registry.erda.cloud/erda/cassandra-bootstrap :0.1 .8 registry.erda.cloud/erda/cassandra-operator :v1.1.3 -release registry.erda.cloud/erda/cluster-agent :1.4 .0 -beta -20211116024920 -02583bd registry.erda.cloud/erda/dice-operator :1.4 -20211112 -d62460f registry.erda.cloud/erda/erda-analyzer -alert :1.4 .0 -beta -20211112020036 -634eb50 registry.erda.cloud/erda/erda-analyzer -error -insight :1.4 .0 -beta -20211112020033 -634eb50 registry.erda.cloud/erda/erda-analyzer -metrics :1.4 .0 -beta -20211112020033 -634eb50 registry.erda.cloud/erda/erda-analyzer -tracing :1.4 .0 -beta -20211112020036 -634eb50 registry.erda.cloud/erda/erda-etcd :3.3 .15 -0 registry.erda.cloud/erda/erda-filebeat :1.4 .0 -stable -20211112020101 -dc879c8 registry.erda.cloud/erda/erda-mysql :5.7 .34 registry.erda.cloud/erda/erda-telegraf :1.4 .0 -beta -20211109113637 -5ba162c registry.erda.cloud/erda/erda:1.4 .0 -beta -20211116024928 -02583bd registry.erda.cloud/erda/etcd_ssl_gen:20210903 -4e40b2f registry.erda.cloud/erda/init-image :1.4 .0 -20211116 registry.erda.cloud/erda/instaclustr-icarus :1.0 .9 registry.erda.cloud/erda/kubedb-busybox :1.0 .0 registry.erda.cloud/erda/redis-operator :1.0 .0 -20200723 -1a7a9f14 registry.erda.cloud/erda/uc:dice-1 .1 -20210630 -f4d63b99 registry.erda.cloud/erda/ui-ce :1.4 .0 -beta -20211116062633 -f08ddf0 registry.erda.cloud/erda/volume-provisioner :1.0 .0 -20210416 -1a3758f ) for imageName in $ {images[@ ]}; do docker pull $ {imageName} done
Kubelet 垃圾回收(Garbage Collection)是一个非常有用的功能,它负责自动清理节点上的无用镜像和容器。Kubelet 每隔 1 分钟进行一次容器清理,每隔 5 分钟进行一次镜像清理(截止到 v1.15 版本,垃圾回收间隔时间还都是在源码中固化的,不可自定义配置)。如果节点上已经运行了 Kubelet,不建议再额外运行其它的垃圾回收工具,因为这些工具可能错误地清理掉 Kubelet 认为本应保留的镜像或容器,从而可能造成不可预知的问题。
erda 镜像总体积大小为14G , 加上 系统2G, 以及kubernetes 组件镜像的大小. 已经超过20G的85%
, 所以被kubelet的垃圾回收机制导致了回收. 当 kubelet 注意到某个资源耗尽时,它会继续回收该资源,直到回收到你所指定的数量为止。然后重复的docker pull 导致iowait 飚高.
至于docker pull 做了什么,看这里
https://blog.csdn.net/Max_Cong/article/details/102664791
为了验证此类情况, 先进行镜像预热, 问题解决.
解决方案 还能干啥,20G够干啥. 只能扩容了.