解决方案
通常遇到"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
让配置快速生效