etcd集群数据定时备份以及恢复

7 篇文章 0 订阅

1.etcd集群备份

ETCDCTL_API=3 etcdctl \
--endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
snapshot save /data/kubernetes/etcd/datas_bak/mysnapshot.db

在这里插入图片描述

--endpoints 集群所有节点的ip地址:2379,端口不变
/data/k8s/etcd/data_bak/mysnapshot.db为备份的文件路径

注:
我们这里使用的是etcd 3.0的api,故备份的数据也只备份了使用3.0添加的数据,2.0添加的数据是没有做备份的。

2.etcd集群恢复

2.1 数据恢复

需要在每个节点上执行,可以先将备份文件分发到各个节点上面。
恢复数据之前需要先将etcd的旧工作目录清空,例如/data/kubernetes/etcd/datas文件夹跟/data/kubernetes/etcd/wals文件夹,如果不清空这两个文件夹,可能会导致恢复失败
注意需要修改相关参数(下面的图片中已经用箭头指出来需要更改的地方)

ETCDCTL_API=3 etcdctl \
--name=node01 \
--endpoints="https://192.168.137.231:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
--initial-cluster-token=etcd-cluster-0 \
--initial-advertise-peer-urls=https://192.168.137.231:2380 \
--initial-cluster=node01=https://192.168.137.231:2380,node02=https://192.168.137.232:2380,node03=https://192.168.137.233:2380 \
--data-dir=/data/kubernetes/etcd/datas \
--wal-dir=/data/kubernetes/etcd/wals \
snapshot restore /data/kubernetes/etcd/datas_bak/mysnapshot.db

在这里插入图片描述
--name 该节点的名称
--endpoints 该节点的ip地址:2379,端口不变
--initial-cluster-token 固定的etcd-cluster-0
--initial-advertise-peer-urls 所有集群节点的ip地址:2380,端口固定不变
/data/kubernetes/etcd/datas_bak/mysnapshot.db 备份文件的路径

2.2 重启etcd服务

systemctl start etcd

2.3 查看etcd状态

systemctl status etcd

在这里插入图片描述

2.4 重启flanneld服务

此时如果重启flanneld服务会发现重启失败。错误信息如下:

11月 22 10:01:30 node01 flanneld[2869]: timed out
11月 22 10:01:30 node01 flanneld[2869]: E1122 10:01:30.669515    2869 main.go:382] Couldn't fetch network config: 100: Key not found (/k8s) [7]

在这里插入图片描述

Key not found (/k8s) 

这个错误说明此时etcd的数据中没有/k8s这个key,这个key是做什么用的呢。我们回想到之前创建k8s集群时的操作:向 etcd 写入集群 Pod 网段信息
在这里插入图片描述
然后因为flanneld的网段信息是使用etcd2.0的api添加的,我们没做备份,所以要重新添加。

该步骤中${FLANNEL_ETCD_PREFIX}/config的值我们查看配置文件:
在这里插入图片描述
可以知道他的值就是/k8s/network/config,说明flanneld启动时报的错误就是缺少了这个部分。我们现在向etcd集群中重新加入这个数据。

向 etcd 写入集群 Pod 网段信息

source /opt/kubernetes/bin/environment.sh
etcdctl \
  --endpoints=${ETCD_ENDPOINTS} \
  --ca-file=/opt/kubernetes/work/ca.pem \
  --cert-file=/opt/kubernetes/work/flanneld.pem \
  --key-file=/opt/kubernetes/work/flanneld-key.pem \
  mk ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 21, "Backend": {"Type": "vxlan"}}'

在这里插入图片描述

mk命令跟put命令是相似的。他是创建一个新key并写入value
在这里插入图片描述
此时再重启 flanneld 服务就可以成功了。

2.5 重启其他相关服务

systemctl restart kube-proxy kube-apiserver

2.6 查看k8s集群信息

kubectl get node

在这里插入图片描述

3.常用命令

3.1 写入数据

ETCDCTL_API=3 etcdctl \
--endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
put /test/1 1111

在这里插入图片描述

3.2 读取数据

ETCDCTL_API=3 etcdctl \
--endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
get /test/1

在这里插入图片描述

3.3 查看key

ETCDCTL_API=3 etcdctl \
--endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
get /test --prefix --keys-only

在这里插入图片描述
get /为查询所有key
--prefix 指前缀匹配
--keys-only 指仅打印key,不打印value

3.4 删除key

ETCDCTL_API=3 etcdctl \
--endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
del "/test/1" --prefix

在这里插入图片描述
del "" 为删除所有key
--prefix 指开启前缀匹配

3.5 查看集群成员

ETCDCTL_API=3 etcdctl \
--endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
member list --write-out=table

在这里插入图片描述

3.6 查看集群健康状态

ETCDCTL_API=3 etcdctl \
--endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
endpoint health

在这里插入图片描述

3.7 查看节点状态

ETCDCTL_API=3 etcdctl \
--endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379" \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--cacert=/etc/kubernetes/ssl/ca.pem \
endpoint status --write-out=table

在这里插入图片描述

4. 定时备份

4.1创建备份的脚本

vim /opt/kubernetes/work/etcd-backup.sh

#!/bin/bash
#时间戳,用来区分不同备份
timestamp=`date +%Y%m%d-%H%M%S`
#备份到哪个文件夹
back_dir="/data/kubernetes/etcd/datas_bak"
#etcd集群列表
endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379"
#etcd证书路径
cert_file="/etc/etcd/ssl/etcd.pem"
#etcd证书的key路径
key_file="/etc/etcd/ssl/etcd-key.pem"
#ca证书路径
cacert_file="/etc/kubernetes/ssl/ca.pem"

mkdir -p $back_dir
ETCDCTL_API=3 etcdctl \
--endpoints="${endpoints}" \
--cert=$cert_file \
--key=$key_file \
--cacert=$cacert_file \
snapshot save $back_dir/snapshot_$timestamp.db

赋予可执行权限:

chmod +x /opt/kubernetes/work/etcd-backup.sh

4.2 测试执行脚本

/opt/kubernetes/work/etcd-backup.sh

在这里插入图片描述
显示已经保存到指定目录下。

4.3 加入定时任务

注:
crond默认不会加载该用户的.profile和.bashrc文件,它的执行环境只能有一些最基本的环境变量

修改脚本文件

我们需要修改下/opt/kubernetes/work/etcd-backup.sh脚本文件

vim /opt/kubernetes/work/etcd-backup.sh

#!/bin/bash
#时间戳,用来区分不同备份
timestamp=`date +%Y%m%d-%H%M%S`
#备份到哪个文件夹
back_dir="/data/kubernetes/etcd/datas_bak"
#etcd集群列表
endpoints="https://192.168.137.231:2379,https://192.168.137.232:2379,https://192.168.137.233:2379"
#etcd证书路径
cert_file="/etc/etcd/ssl/etcd.pem"
#etcd证书的key路径
key_file="/etc/etcd/ssl/etcd-key.pem"
#ca证书路径
cacert_file="/etc/kubernetes/ssl/ca.pem"

mkdir -p $back_dir
ETCDCTL_API=3 /opt/kubernetes/bin/etcdctl \
--endpoints="${endpoints}" \
--cert=$cert_file \
--key=$key_file \
--cacert=$cacert_file \
snapshot save $back_dir/snapshot_$timestamp.db

ETCDCTL_API=3 etcdctl修改为ETCDCTL_API=3 /opt/kubernetes/bin/etcdctl,即修改成etcdctl的执行文件全路径。

加入crontab

crontab -e

新增一行:

*/1 * * * * sh /opt/kubernetes/work/etcd-backup.sh

这行命令让**/opt/kubernetes/work/etcd-backup.sh**脚本在每分钟执行一次

启动crond服务并查看状态

service crond start && service crond status

如果出现如下错误:

11月 22 11:32:01 node01 crond[3080]: sendmail: fatal: parameter inet_interfaces: no local interface found for ::1

则需要修改/etc/postfix/main.cf文件

vim /etc/postfix/main.cf

修改:inet_interfaces = all
在这里插入图片描述

重启postfix服务

service postfix restart

这时候crond服务可以正常使用。

4.4 查看是否备份成功

ll /data/kubernetes/etcd/datas_bak/

可以看到每分钟都有新的备份文件出现。
在这里插入图片描述
当我们需要投入使用的时候,可以更改定时策略,将每分钟改成适当的时间。crond语法可以自行百度。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Kubernetes(k8s集群中,etcd是一个关键组件,它存储了整个集群的配置信息、状态信息和元数据。对于生产环境中的 k8s 集群备份恢复 etcd 数据是非常重要的,以确保集群的可用性和数据的完整性。 以下是备份恢复 etcd 数据的步骤: 备份 etcd 数据: 1. 连接到 etcd 集群中的任意一个节点。 2. 运行以下命令备份 etcd 数据: ``` ETCDCTL_API=3 etcdctl --endpoints=<etcd-endpoint> snapshot save <backup-file> ``` 其中,`<etcd-endpoint>` 是 etcd 集群的地址,`<backup-file>` 是备份文件的路径和名称。 3. 备份完成后,将备份文件复制到安全的位置进行存储。 恢复 etcd 数据: 1. 连接到新的 etcd 集群中的任意一个节点。 2. 运行以下命令恢复 etcd 数据: ``` ETCDCTL_API=3 etcdctl snapshot restore <backup-file> \ --name <name> \ --initial-cluster <initial-cluster> \ --initial-cluster-token <initial-token> \ --initial-advertise-peer-urls <peer-url> ``` 其中,`<backup-file>` 是备份文件的路径和名称,`<name>` 是新的 etcd 集群名称,`<initial-cluster>` 是新的 etcd 集群成员列表,`<initial-token>` 是新的 etcd 集群令牌,`<peer-url>` 是新的 etcd 集群成员的地址。 3. 恢复完成后,重启 etcd 服务,以使其使用新的数据。 需要注意的是,备份恢复 etcd 数据需要谨慎操作,以免造成数据丢失或不一致。建议在进行备份恢复操作前先进行测试,并确保备份文件的存储位置安全可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值