Kuboard 故障: Etcd 空间爆满问题
问题
突然出现kuboard
无法访问错误,通过查看日志,出现大量以下错误:etcdserver: mvcc: database space exceeded
,emmm这又是之前的错误问题,https://199604.com/3155
之前已遇到过,又是etcd
空间不足导致,
etcd 默认空间配额机制
etcd
作为Kubernetes
集群的核心组件,其数据库默认磁盘空间配额为 2GB。
当集群数据量超过此限制时,etcd
会拒绝新的写入请求,进而导致 Kuboard 等应用异常,页面返回 500 错误,日志中出现类似以下信息:level=error msg="Storage health check failed: create auth request: etcdserver: mvcc: database space exceeded"
解决操作
临时操作:压缩与碎片整理
参考:https://199604.com/3155
之前的临时处理步骤。
# 进入容器内部
docker exec -it kuboard /bin/sh
# 查看 etcd 当前状态
ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" --write-out=table endpoint status
#ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 endpoint status --write-out="json"
# 获取当前revision
rev=$(ETCDCTL_API=3 etcdctl--endpoints="http://127.0.0.1:2379"endpointstatus--write-out="json"|egrep-o'"revision":[0-9]*'|egrep-o'[0-9].*')
# echo $rev
6078532
# 以$rev为基准,压缩历史数据:
ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" compact $rev
# 清理多余的碎片空间
ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" defrag
#ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" --command-timeout=180s defrag
# 解除报警
ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" alarm disarm
注意:在
defrag
前,可以尝试延长超时时间,如加上--command-timeout=180s
参数,以防defrag
过程因超时而失败。
优化操作:调整参数
扩大存储配额
默认情况下,etcd
的存储限制为 2GB。如果你需要存储更多数据,可以增大存储限制(仅适用于 etcd v3.4+):
进入容器执行:
etcd --quota-backend-bytes=<BYTES>
例如,将配额增加到 8GB:
etcd --quota-backend-bytes=$((8*1024*1024*1024))
开启自动压缩
保留最近 1 个版本,每小时自动压缩
etcd --auto-compaction-retention=1
etcd --auto-compaction-retention=1 --quota-backend-bytes=8388608000
总结
当 Kuboard
出现etcd
空间满错误时,可通过 压缩 + 碎片整理
快速恢复服务.
为避免问题复现,需长期调整 etcd 存储配额与自动压缩策略
。
建议定期监控 etcd
空间使用情况,结合集群规模合理配置参数,以保障 Kuboard
稳定运行。