etcdserver: mvcc: database space exceeded
k8s
的apiserver
组件重启失败,通过journalctl -xeu kube-apiserver
命令查看日志,找到了如下的报错
etcdserver: mvcc: database space exceeded
查看节点状态
这里,我们需要用到
etcdctl
工具,一般二进制部署的k8s,都会带有这个工具,如果没有,可以去github下载指定版本的etcd二进制文件即可通过
etcdctl version
查看当前API
版本,以下的命令,需要使用API 3
版本,如果不是API 3
版本,需要在执行etcdctl
前加上参数,示例:ETCDCTL_API=3 etcdctl endpoint status
如果
etcd
的--listen-client-urls
参数有配置http://127.0.0.1:2379
,以下的命令可以不加上--endpoints
参数,如果需要加上--endpoints
参数,就需要加上指定的证书路径通过
systemctl status etcd -l
可以看到etcd启动时所带的参数,可以找到指定的证书路径,下面的证书路径,以自己实际的为准,不要纯复制黏贴
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/kubernetes/cert/etcd.pem \
--key=/etc/kubernetes/cert/etcd-key.pem \
--endpoints=https://172.31.243.179:2379 \
endpoint status --write-out="table"
--write-out="table"
是输出的格式,可以是json,可以是table,默认是simple,这个参数可以不加
ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
---|---|---|---|---|---|---|---|---|---|
https://172.31.243.179:2379 | f0a399bcc03bea5f | 3.4.12 | 6.4GB | true | false | 5 | 29659523 | 29659523 |
可以看到,这里的
db size
已经达到6.4G,在etcd启动的时候,如果没有配置--quota-backend-bytes
的大小,默认只有2G,因此,导致了apiserver无法写入etcd
获取旧版本号
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/kubernetes/cert/etcd.pem \
--key=/etc/kubernetes/cert/etcd-key.pem \
--endpoints=https://172.31.243.179:2379 \
endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9]*'
15151255
得到的这个数据值,就是当前的版本号,当我们压缩的时候,他就变成旧版本号了
压缩旧版本
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/kubernetes/cert/etcd.pem \
--key=/etc/kubernetes/cert/etcd-key.pem \
--endpoints=https://172.31.243.179:2379 \
compact 15151255
清理碎片
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/kubernetes/cert/etcd.pem \
--key=/etc/kubernetes/cert/etcd-key.pem \
--endpoints=https://172.31.243.179:2379 \
defrag
再次查看节点状态
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/kubernetes/cert/etcd.pem \
--key=/etc/kubernetes/cert/etcd-key.pem \
--endpoints=https://172.31.243.179:2379 \
endpoint status
https://172.31.243.179:2379, f0a399bcc03bea5f, 3.4.12, 1.0 MB, true, false, 5, 29659523, 29659523,
db size这一块,变成了1.0MB了
清楚告警
查看告警
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/kubernetes/cert/etcd.pem \
--key=/etc/kubernetes/cert/etcd-key.pem \
--endpoints=https://172.31.243.179:2379 \
alarm list
memberID:f0a399bcc03bea5f alarm:NOSPACE
清楚告警
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/kubernetes/cert/etcd.pem \
--key=/etc/kubernetes/cert/etcd-key.pem \
--endpoints=https://172.31.243.179:2379 \
alarm disarm
然后再次重启我的apiserver
他来了,他来了,他活过来了,不用跑路的感觉,真好