一、现象
创建k8s集群集群创建失败,部署节点提示错误:
{"error":"etcdserver: mvcc: database space exceeded"}



二、排查过程
登录对应节点上查看etcd状态
/ # ETCDCTL_API=3 etcdctl --write-out=table endpoint status
+----------------+------------------+---------+---------+-----------+-----------+------------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+----------------+------------------+---------+---------+-----------+-----------+------------+
| 127.0.0.1:2379 | 6498a916c4220b9a | 3.3.8 | 2.1 GB | true | 7 | 12567 |
+----------------+------------------+---------+---------+-----------+-----------+------------+
/ #
发现 DB SIZE为2.1GB 已经超过默认限制(默认限制 2G),所以导致出现上述异常,需要手动去清理并释放空间。
注:存储空间配额可以理解为 ETCD 数据库大小,默认限制 2G(推荐最大 8G)。当数据写入耗尽存储空间时,ETCD 会引发整个集群范围的警告,导致集群切换为维护模式( 仅接受键值读取和删除,不支持写入)。所以,在创建集群时候建议修改配额大小在主机内存的 60% - 70%。
三、解决方案
手动释放配额空间后重发订单
1、获取当前的版本
$ rev=$(ETCDCTL_API=3 etcdctl --endpoints=:2379 endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')
2、压缩当前版本之前的所有记录
$ ETCDCTL_API=3 etcdctl compact $rev
compacted revision 1516
3、清理多余的碎片空间
$ ETCDCTL_API=3 etcdctl defrag
Finished defragmenting etcd member[127.0.0.1:2379]
4、解除警告
$ ETCDCTL_API=3 etcdctl alarm disarm
memberID:13803658152347727308 alarm:NOSPACE