k8s的数据库etcd报 etcdserver: mvcc: database space exceeded的处理办法

一.问题现象

公司的k8s集群的etcd配置是默认配置,其磁盘配置为2GB的配额,目前出现了数据写入失败的情况,报错Error: etcdserver: mvcc: database space exceeded。

二.处理思路

当etcd的磁盘使用达到2G后,可能会触发维护模式,此时集群将仅接受键值读取和删除操作,不支持写入。即使清理了部分数据,如果未正确处理etcd的存储配额和压缩机制,仍然可能无法写入

1.备份数据

在做操作之前,做好etcd的备份,这是一个好习惯。

2.启用或者优化压缩机制

etcd v3是一个MVCC数据库,保存了key的历史版本。如果没有配置压缩策略,随着数据的不断写入,db大小会不断增大。可以通过配置 --auto-compaction-retention参数来启用自动压缩机制,并设置保留的历史版本数量。例如,设置为1表示只保留最新的一个版本。注意,自动压缩只会做碎片整理,不会实际减少空间大小。如果需要减少空间大小,还需要使用 etcdctl compact 和 etcdctl defrag 命令手动压缩和整理空间。

检查并清理旧的修订版本:使用etcdctl endpoint status命令查看当前的修订版本和数据库大小。使用etcdctl compact命令压缩旧的修订版本。压缩后,etcd将不再保留被压缩版本之前的所有历史版本。执行压缩后,还需要使用etcdctl defrag命令来整理etcd存储的碎片空间

3.清除告警

检查并解除NO SPACE告警:使用 etcdctl alarm list 命令检查是否存在NO SPACE告警。如果存在告警,使用 etcdctl alarm disarm 命令解除告警

4.增加存储配额

修改etcd的配置文件,增加 --quota-backend-bytes 参数的值,以设置更高的存储配额。例如,将其设置为8GB(8589934592字节)。重启etcd服务以使配置生效。

5.验证写入操作

可使用etcdctl put /test/key "test kubernetes" 写入

使用etcdctl get /test/key查询

三.处理步骤

以下排查路径涉及到的证书,根据自己的实际情况指定。

1.查看etcd的endpoint

复制代码
 etcdctl --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/rke2/server/tls/etcd/client.crt --key=/var/lib/rancher/rke2/server/tls/etcd/client.key --endpoints=https://10.20.12.101:2379,https://10.20.12.102:2379,https://10.20.12.103:2379 endpoint status  -w table

2.备份数据

复制代码
 etcdctl --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/rke2/server/tls/etcd/client.crt --key=/var/lib/rancher/rke2/server/tls/etcd/client.key --endpoints=https://10.20.12.101:2379,https://10.20.12.102:2379,https://10.20.12.103:2379 snapshot save /var/lib/etcd/my-snapshot.db

3.获取当前版本

复制代码
 etcdctl --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/rke2/server/tls/etcd/client.crt --key=/var/lib/rancher/rke2/server/tls/etcd/client.key --endpoints={$endpoints} endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9]*')

4.压缩所有旧版本

复制代码
 etcdctl --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/rke2/server/tls/etcd/client.crt --key=/var/lib/rancher/rke2/server/tls/etcd/client.key --endpoints={$endpoints} compact $rev 

4.执行碎片清理

复制代码
 etcdctl --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/rke2/server/tls/etcd/client.crt --key=/var/lib/rancher/rke2/server/tls/etcd/client.key --endpoints=https://10.20.12.101:2379,https://10.20.12.102:2379,https://10.20.12.103:2379 defrag

5.解除告警

复制代码
 etcdctl --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/rke2/server/tls/etcd/client.crt --key=/var/lib/rancher/rke2/server/tls/etcd/client.key --endpoints={$endpoints} alarm disarm 

以上操作可以减少etcd的数据文件大小,解决mvcc: database space exceeded。但etcd的磁盘配额的大小还是2G。修改etcd磁盘配额的方式如下:

在etcd配置文件中找到或添加--quota-backend-bytes参数,其值设置为:8589934592,这是8GB的字节数。

比如通过kubeadm安装的k8s,其etcd的配置文件在/etc/kubernetes/manifests/etcd.yaml,添加- --quota-backend-bytes=8589934592,添加之后重启服务

apiVersion: v1

kind: Pod

metadata:

creationTimestamp: null

labels:

component: etcd

tier: control-plane

name: etcd

namespace: kube-system

spec:

containers:

image: k8s.gcr.io/etcd:3.3.10

imagePullPolicy: IfNotPresent

livenessProbe:

exec:

command:

  • /bin/sh

  • -ec

  • ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt

--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key

get foo

failureThreshold: 8

initialDelaySeconds: 15

timeoutSeconds: 15

name: etcd

resources: {}

volumeMounts:

  • mountPath: /var/lib/etcd

name: etcd-data

  • mountPath: /etc/kubernetes/pki/etcd

name: etcd-certs

hostNetwork: true

priorityClassName: system-cluster-critical

volumes:

  • hostPath:

path: /etc/kubernetes/pki/etcd

type: DirectoryOrCreate

name: etcd-certs

  • hostPath:

path: /var/lib/etcd

type: DirectoryOrCreate

name: etcd-data

status: {}

相关推荐
weixin199701080164 分钟前
《深入浅出:图解淘宝分布式数据库TDDL(及开源替代方案)》
数据库·分布式·开源
数据库小组23 分钟前
Oracle 上云 / 替代场景下,NineData 完成到 PostgreSQL 的低风险迁移
大数据·数据库·mysql·postgresql·oracle·数据一致性·数据库迁移
Ricky_Theseus31 分钟前
SQL Server 2008 四种排序函数
数据库
柚子+35 分钟前
Appium+python+雷电模拟器自动化测试入门
数据库·python·appium
云边有个稻草人37 分钟前
SQL调优实战手册:索引、并行、参数调优一站式解决方案
数据库
数安3000天38 分钟前
数据脱敏产品需要关注哪些因素?
数据库
杰克尼39 分钟前
知识点总结--day05( 数据库)
数据库
代码派1 小时前
SQL 审核解决了部分问题,另一部分是慢 SQL 治理
数据库·sql·mysql·数据库管理工具·ninedata·sql审核·sql治理
wei_shuo1 小时前
新型电力系统应该用什么数据库?源网荷储四侧的时序数据库选型与落地实战
数据库·时序数据库
SadSunset2 小时前
第四章:Redis 数据结构与命令
数据结构·数据库·redis