一、场景描述
用户无法正常访问部署在k8s上的服务和使用我们的PaaS平台。
二、问题描述
某环境的etcd集群全部挂掉,导致k8s集群部署的服务都无法正常提供使用,查看etcd状态和报错日志,如图所示
图中报错显示etcd成员的空间不足
三、问题处理过程描述
当时根据etcd的报错日志,先到对应的主机查看了下磁盘和内存的使用情况,发现etcd所在的主机资源都是充足的,然后一起重启了下三台etcd,发现还是没能解决,看来万能的重启不能解决了,看看日志还是报etcd成员的空间不足,看了下etcd的官方文档;启动 etcd 时,–quota-backend-bytes 默认为 2G,查看我们etcd集群当前的存储使用情况:
发现etcd的当前存储使用情况已经是2.2G,已经大于2G了,空间配额etcd可确保群集以可靠的方式运行。如果没有空间配额,etcd如果使用空间过大,可能会导致性能不佳,或者可能仅会耗尽存储空间,从而导致不可预测的群集行为。如果任何成员的键空间的后端数据库超出空间配额,etcd则会引发整个群集范围的警报,该警报会将群集置于维护模式,该模式仅接受键读取和删除。只有在释放键空间中足够的空间并对后端数据库进行碎片整理以及清除空间配额警报之后,集群才能恢复正常运行。
这个时候只能通过删除过多的键空间数据并对后端数据库进行碎片整理将使群集重新回到配额限制内:
#get current revision
$ rev=$(ETCDCTL_API=3 etcdctl --endpoints=:2379 endpoint status --write-out=“json” | egrep -o ‘“revision”:[0-9]’ | egrep -o '[0-9].’)
#compact away all old revisions
$ ETCDCTL_API=3 etcdctl compact $rev
compacted revision 1516
#defragment away excessive space
$ ETCDCTL_API=3 etcdctl defrag
Finished defragmenting etcd member[127.0.0.1:2379]
#disarm alarm
$ ETCDCTL_API=3 etcdctl alarm disarm
memberID:13803658152347727308 alarm:NOSPACE
注:分别在三台etcd集群中执行。
执行完发现etcd的空间使用空间已经小于2G了,etcd集群恢复正常:
这个时候其实还没有结束,检查pod报错没有权限,发现集群中所有的node都是notready了,之前是好的:
查看之前的授权admin权限都是在的,重启所有节点的kubelet和proxy,节点全部都恢复正常,检查业务都ok,到此问题处理完成。
注:删除操作前记得对etcd进行快照的备份,etcd的配额大小可以进行配置,需要到etcd.service文件中添加如下参数:
ExecStart=/usr/bin/etcd --quota-backend-bytes ‘8589934592’(根据自己实际需求来改)
关于etcd的碎片清理和空间配额设置,可以参考etcd的官方文档:https://etcd.io/docs/v3.4/op-guide/maintenance/