0x0034's Blog.

记一次kubernetes iowait激增导致的宕机

字数统计: 905阅读时长: 4 min
2022/01/16

问题描述: 在安装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

问题排查

  1. 使用pidstat , vmstat 观察机器状况, 观察是否存在IO激增的情况. 或者过多的中断和上下文切换.

排查下来, 机器的cpu 和, 文件读写非常的正常. 无果.

  1. 观察容器.

docker ps -a , 发现容器已经都exit 了. 怀疑资源不够,或者异常的api server 访问. 导致etcd 和apisever 挂掉. 抓包, 监听端口. 一样没有什么问题. 无果

  1. 检查kubelet

使用如下命令,查看kubelet日志.

1
2
# 查看节点kubelet 日志
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够干啥. 只能扩容了.

CATALOG
  1. 1. 节点配置
  2. 2. 问题排查
  3. 3. 解决方案