前言
在k8s跑了一段时间后,发现不可用,查找问题发现是etcd 2g满了,不可写问题导致。需要压缩历史版本。
实际上解决不可写有三种方法,一是更改2g限制;二是压缩历史版本;三是设置自动压缩。
但是,这个2g是为了在保留性能的同时,etcd的最大存储,不能随意设置,是个问题。由此,查看了相关etcd使用文档,记录下,方便以后查看补充。
etcd使用中注意问题
-
--auto-compaction-retention
由于etcd存储多版本数据,随着写入主键增加,历史版本增加,需要定时清理,默认的历史数据是不做清理的,在数据到达2g的时候,就无法继续写入数据,必须手动清理压缩数据才能继续写入。
--auto-compaction-retention=1
表示每1小时进行一次数据压缩。根据业务需求,在上生产环境之前就提前确定,历史数据多长时间压缩一次,笔者参考文档中,默认一小时压缩一次数据。这样可以极大的保证集群稳定,减少内存和磁盘占用。
-
--max-request-bytes
etcd Raft消息最大字节数,默认值是1.5M,但是,很多业务场景发现同步数据的时候1.5M完全没法满足要求,提前确定初始值很重要。
笔者参考文档中把该值修改为默认32M,但是官方推荐的是10M,大家可以根据业务情况自己调整。
-
``–quota-backend-bytes
手动执行etcd磁盘清理
- 显示etcd空间配额:
ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt endpoint status --write-out="table"
- 查看告警:
ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt alarm list
- 获取当前etcd数据的修订版本(revision):
$ rev=$(ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*') $ echo $rev
-
整合压缩旧版本数据:
ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt compact $rev
- 执行碎片整理:
ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt defrag
- 解除告警:
ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt alarm disarm
- 查看配额:
ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt endpoint status --write-out="table"