解决Kuboard etcd 空间超过2G报:etcdserver: mvcc: database space exceeded。无法访问

解决Kuboard etcd 空间超过2G后无法访问问题

Kuboard突然无法访问,使用kubernetes运行的kuboard

参考:

https://github.com/eip-work/kuboard-press/issues/526

https://blog.csdn.net/wdy_2099/article/details/133203698

排查问题

查看日志信息

通过查看pod日志看到错误信息为:etcdserver: mvcc: database space exceeded。

查看etcd的官方指导,etcd默认的空间配额限制为2G,超出空间配额限制就会影响服务。

kuboard会自己创建一个基于eipwork/etcd-host镜像的etcd DaemonSet。

查看数据映射的空间大小

查看kuboard下的etcd映射的存储路径,默认在/usr/share/kuboard/etcd

[root@master1 snap]# cd /usr/share/kuboard/etcd/member/snap
[root@master1 snap]# ls -lrth
总用量 2.1G
-rw-r--r-- 1 root root  11K 9月  26 20:16 000000000000000b-0000000000a1c264.snap
-rw-r--r-- 1 root root  11K 9月  27 08:11 000000000000000b-0000000000a1e975.snap
-rw-r--r-- 1 root root  11K 9月  27 20:06 000000000000000b-0000000000a21086.snap
-rw-r--r-- 1 root root  11K 9月  28 08:01 000000000000000b-0000000000a23797.snap
-rw-r--r-- 1 root root  11K 9月  28 19:56 000000000000000b-0000000000a25ea8.snap
-rw------- 1 root root 2.1G 9月  29 14:32 db

可以看到文件已经达到2.1G,基本可以确定是因为达到空间配额限制,无法正常启动。

临时解决方案

进入etcd容器,执行压缩命令,整理多余空间,取消告警信息

此时etcd容器因存活检测一直在重启,修改存活检测时长

kubectl edit daemonsets.apps -n kuboard kuboard-etcd
# 将 initialDelaySeconds 修改为3000
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /health
              port: 2381
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
# 在master节点通过命令进入etcd容器,pod名称替换成自己的
kubectl -n kuboard exec -it kuboard-etcd-6x8jf sh

# 端口自行查看 (不建议使用 127.0.0.1 使用 master 的网卡IP地址)
# 查看etcd的状态
ETCDCTL_API=3 etcdctl --endpoints="192.168.2.81:2381" --write-out=table endpoint status
# 可以看到error信息中有一条警告信息:alarm:NOSPACE

# 压缩旧版本
ETCDCTL_API=3 etcdctl --endpoints="192.168.2.81:2381" compact $(ETCDCTL_API=3 etcdctl --endpoints="192.168.2.81:2381" endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')

# 整理多余的空间
ETCDCTL_API=3 etcdctl --endpoints="192.168.2.81:2381" defrag

# 取消告警信息(之前有nospace的告警)
ETCDCTL_API=3 etcdctl --endpoints="192.168.2.81:2381" alarm disarm

# 重新查看etcd的状态(发现ERROR字段已为空)
ETCDCTL_API=3 etcdctl --endpoints="192.168.2.81:2381" --write-out=table endpoint status
# ERROR信息为空,且DB SIZE 已小于2G则表示成功

手动构建镜像

找到etcd镜像的github地址,通过手动构建镜像时修改DockerFile文件中的启动命令

# 表示每隔一个小时自动压缩一次
--auto-compaction-retention=1
# 磁盘空间调整为 8G,官方建议最大 8G(单位是字节)
--quota-backend-bytes=8388608000
posted @ 2024-09-29 15:07  yg0070  阅读(275)  评论(0编辑  收藏  举报