searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

kubernetes集群etcd数据库体积超出限额处理方法

2024-06-07 09:50:08
11
0

解决方案

通常遇到"mvcc: database space exceeded"故障时,解决问题的思路分四步:
1、检查etcd数据目录所在磁盘是否有足够的剩余空间
2、对etcd节点执行历史版本压缩、碎片整理和清除etcd告警操作
3、调整kubernetes关于etcd的磁盘空间配额

etcd数据目录磁盘空间检查

使用kubeadm安装的kubernetes集群,etcd集群节点位于master节点,每个master节点运行一个etcd节点.

etcd数据目录磁盘空间检查需要在每个master节点上进行,以下是检查步骤:

1、确定etcd数据目录

ps -ef|grep etcd|egrep -o 'data-dir=[^ ]*'

2、使用df -h指令查看etcd数据目录所在磁盘是否已经达到100%的上限

3、若磁盘空间已接近或达到100%,则mvcc: database space exceeded的错误可能因磁盘物理空间不足引发,先清理磁盘或进行空间扩容; 若磁盘尚有足够空间,则进入下一个处理步骤。

对etcd节点执行历史版本压缩、碎片整理和清除etcd告警操作

生产环境的etcd集群通常拥有3-5个节点,当觉察到mvcc: database space exceeded故障时,etcd集群通常有超过半数的节点已经数据库体积超出限额,比较好的局面下这些超出限额的etcd节点还存活,能使用etcdctl进行操作,而通常面临的情况是这些超限的节点上etcd pod已经无法拉起来。

对etcd节点执行历史版本压缩、碎片整理和清除etcd告警操作都是借助etcdctl指令执行的,大都要求etcd pod是存活的,能接收etcdctl指令

首先看比较理想的局面,出现磁盘空间限额的etcd节点还存活前提下的操作方法:

以下假定集群有三个master节点,每个master节点运行一个etcd pod

1、查找出现磁盘空间不足的节点

etcdctl --endpoints='https://<master1_ip>:2379, https://<master2_ip>:2379,https://<master3_ip>:2379' alarm list

有问题的节点通常会有类似: memberID:2340161756594109567 alarm:NOSPACE 这样的告警

2、依次登录到故障节点,使用etcdctl对故障etcd节点执行版本压缩、空间整理、清理告警的操作

这里要强调2点:
1)、登录到故障节点,使用127.0.0.1 endpoint对etcd节点进行操作
2)、依次执行,不要同时在多个节点上执行磁盘整理操作,因磁盘整理期间该节点不可读写

操作步骤:

1)、获取当前节点的revision版本

rev=$(etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --endpoints=http://127.0.0.1:2379 endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')

2)、执行压缩指令删除多余历史版本

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --endpoints=http://127.0.0.1:2379 compact $rev

3)、etcd磁盘空间整理,减少etcd数据库体积

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --endpoints=http://127.0.0.1:2379 defrag

4)、消除告警

etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --endpoints=http://127.0.0.1:2379 alarm disarm

3、所有节点处理完成后,通过下述指令查看etcd节点数据库体积是否成功减少

etcdctl --endpoints='https://<master1_ip>:2379, https://<master2_ip>:2379,https://<master3_ip>:2379' endpoint status -w table

另外,出现磁盘空间限额的etcd节点本身已经无法启动,无法通过etcdctl指令连接,这种情况下需要先设法让etcd节点启动,然后再做版本压缩、磁盘清理、告警消除操作。恢复此类故障etcd集群节点可采取以下步骤:

1)、编辑/etc/kubernetes/manifests/etcd.yaml文件, 给etcd启动项配置以下参数:

--auto-compaction-mode=periodic 
--auto-compaction-retention=72h
--quota-backend-bytes=8589934592

增加该参数后,etcd每7.2小时执行一次压缩,保留最近72小时的revision版本;数据库体积配额提升到8G

2)、重启kubelet重新拉起etcd pod

systemctl restart kubelet

3、使用etcdctl对节点执行版本压缩、磁盘清理、告警消除操作

调整kubernetes关于etcd的磁盘空间

为防止etcd再次因磁盘配额不足引发故障,建议对所有etcd进程的启动参数进行调整,调整需要在所有master节点上依次进行,调整的内容主要是修改/etc/kubernetes/manifests/etcd.yaml文件, 给etcd启动项配置以下参数:

--auto-compaction-mode=periodic 
--auto-compaction-retention=72h
--quota-backend-bytes=8589934592

调整完毕后可通过systemctl restart kubelet让配置快速生效

0条评论
0 / 1000