etcdserver: mvcc: database space exceeded


 

 

k8sapiserver組件重啟失敗,通過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

他來了,他來了,他活過來了,不用跑路的感覺,真好


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM