kubernetes集群etcd空间配额2G的坑优化
如果按照网上自动化部署kubernetes 没有对etcd优化的,可能当你集群到达一定规模时候etcd的空间配额就满了。
mvcc: database space exceeded
查看etcd状态
TCDCTL_API=3 etcdctl –endpoints=https://192.168.111:2379,https://192.168.111:2379,https://192.11.181:2379 \
–cacert=/etc/kubernetes/ssl/kube-ca.pem \
–cert=/etc/kubernetes/ssl/kube-etcd-192-168-2-44.pem \
–key=/etc/kubernetes/ssl/kube-etcd-192-168-2-44-key.pem \
endpoint statu \
–write-out table
+----------------------------+------------------+---------+---------+-----------+-----------+------------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+----------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://192.168.2.44:2379 | 775a857c06ad7d7 | 3.2.24 | 236 MB | true | 25 | 36769138 |
| https://192.168.2.230:2379 | ab7e6d08ecffd5eb | 3.2.24 | 237 MB | false | 25 | 36769138 |
| https://192.168.2.187:2379 | 77620e37b3288cba | 3.2.24 | 237 MB | false | 25 | 36769138 |
+----------------------------+------------------+---------+---------+-----------+-----------+------------+
修改空间配额大小默认是2G –quota-backend-bytes=6442450944
磁盘碎片整理
auto-compaction-retention=240 #(单位小时)
通过auto-compaction-retention
对历史数据压缩后,后端数据库可能会出现内部碎片。内部碎片是指空闲状态的,能被后端使用但是仍然消耗存储空间,碎片整理过程将此存储空间释放回文件系统。
要对etcd进行碎片整理,需手动在etcd容器中执行以下命令:
etcdctl defrag
Finished defragmenting etcd member[127.0.0.1:2379]
数据压缩
etcd 默认不会自动进行数据压缩,etcd保存了keys的历史信息,数据频繁的改动会导致数据版本越来越多,相对应的数据库就会越来越大。etcd数据库大小默认2GB,当在etcd容器出现以下日志时,说明数据库空间占满,需要进行数据压缩腾出空间。
Error from server: etcdserver: mvcc: database space exceeded
释放空间
登录etcd容器
在etcd主机上,执行以下命令登录etcd容器
docker exec -ti etcd sh
etcdctl endpoint status --write-out table
+----------------+-----------------+---------+---------+-----------+-----------+------------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+----------------+-----------------+---------+---------+-----------+-----------+------------+
| 127.0.0.1:2379 | 775a857c06ad7d7 | 3.2.24 | 236 MB | true | 25 | 36773068 |
+----------------+-----------------+---------+---------+-----------+-----------+------------+
获取历史版本号:
在etcd容器执行以下命令
ver=$(etcdctl endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')
压缩旧版本
etcdctl compact $ver
etcd进行碎片整理
etcdctl defrag