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
他來了,他來了,他活過來了,不用跑路的感覺,真好