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: {}

相关推荐
晚霞的不甘5 分钟前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位24 分钟前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
海奥华227 分钟前
mysql索引
数据库·mysql
2601_949593651 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__1 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102162 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light2 小时前
MySQL相关问题
数据库·mysql
蜡笔小炘2 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长2 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
liux35283 小时前
基于kubeadm部署Kubernetes 1.26.4 集群指南
云原生·容器·kubernetes