K8s中 备份数据 检查验证(一)

本文介绍了一种针对Kubernetes环境中MySQL、MongoDB、Redis及Etcd数据库的备份验证脚本。该脚本运行于K8s的master节点,通过对比现运行数据与备份数据,确保备份的完整性和有效性。

对k8s中备份的数据进行验证,对比现k8s运行中的数据与备份的数据,检查是否备份异常。

脚本包括对K8s中的mysql,mongodb,redis及etcd四种数据库的现行状态及备份检查。

脚本运行在K8s中的master主机中。

bak 目录:里边的备份数据是从K8s中各个备份点 scp 或 rsync到此目录中。

dbtmp目录:验证过程中自动生成的验证的数据文件。

log目录:验证日志输出目录。

直接运行./check.sh就可以生成 .md格式的验证结果。

如下是check.sh代码:

#!/bin/bash

#运行目录
rundir=$(cd $(dirname $0); pwd)
#格式化当前日期
theday=`date +%F`

outmd=${rundir}/check-out-${theday}.md

echo "# 备份验证-${theday}" > ${outmd}

echo -e "\e[92m 开始iotplat-Mysql数据库检查... \e[0m" 

echo "## iotplat-Mysql" >> ${outmd}
echo "--------------------------" >> ${outmd}
echo "> 当前系统的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

#./status-mysql.sh mysql-0 -n default  >> ${outmd}
./status-mysql-iotplat.sh >> ${outmd}

echo " \`\`\` " >> ${outmd}

echo "> 备份的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

# ./mysql-check.sh /home/mysql-iotplat.tar.gz >> ${outmd}
./mysql-check-iotplat.sh  >> ${outmd}

echo " \`\`\` " >> ${outmd}

cat -n ${rundir}/check-out-${theday}.md
echo -e "\e[92m 开始s1plat-Mysql数据库检查... \e[0m"

echo "## s1plat-Mysql" >> ${outmd}
echo "--------------------------" >> ${outmd}
echo "> 当前系统的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

#./status-mysql.sh mysql-0 -n default  >> ${outmd}
./status-mysql-s1plat.sh >> ${outmd}

echo " \`\`\` " >> ${outmd}

echo "> 备份的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

# ./mysql-check.sh /home/mysql-s1plat.tar.gz >> ${outmd}
./mysql-check-s1plat.sh  >> ${outmd}

echo " \`\`\` " >> ${outmd}
echo "--------------------------" >> ${outmd}

cat -n ${rundir}/check-out-${theday}.md
echo -e "\e[92m 开始iotplat-Redis数据库检查... \e[0m"

echo "## iotplat-Redis" >> ${outmd}
echo "--------------------------" >> ${outmd}

echo "> 当前系统的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}
#./status-mysql.sh mysql-0 -n default  >> ${outmd}
./status-redis-iotplat.sh >> ${outmd}

echo " \`\`\` " >> ${outmd}

echo "> 备份的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

./redis-check-iotplat.sh  >> ${outmd}

echo " \`\`\` " >> ${outmd}


cat -n ${rundir}/check-out-${theday}.md
echo -e "\e[92m 开始s1plat-Redis数据库检查... \e[0m"

echo "## s1plat-Redis" >> ${outmd}
echo "--------------------------" >> ${outmd}

echo "> 当前系统的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}
#./status-mysql.sh mysql-0 -n default  >> ${outmd}
./status-redis-s1plat.sh >> ${outmd}

echo " \`\`\` " >> ${outmd}

echo "> 备份的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

# ./mysql-check.sh /home/mysql.tar.gz >> ${outmd}
./redis-check-s1plat.sh  >> ${outmd}

echo " \`\`\` " >> ${outmd}

echo "--------------------------" >> ${outmd}


cat -n ${rundir}/check-out-${theday}.md
echo -e "\e[92m 开始ehome-MongoDB数据库检查... \e[0m"

echo "## ehome-MongoDB" >> ${outmd}
echo "--------------------------" >> ${outmd}
echo "> 当前系统的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

#./status-mysql.sh mysql-0 -n default  >> ${outmd}
./status-mongodb.sh >> ${outmd}

echo " \`\`\` " >> ${outmd}

echo "> 备份的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

# ./mysql-check.sh /home/mysql.tar.gz >> ${outmd}
./mongodb-check.sh  >> ${outmd}

echo " \`\`\` " >> ${outmd}
echo "--------------------------" >> ${outmd}

cat -n ${rundir}/check-out-${theday}.md
echo -e "\e[92m 开始Etcd数据库检查... \e[0m"

echo "## Etcd" >> ${outmd}
echo "--------------------------" >> ${outmd}
echo "> 当前系统的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

./status-etcd.sh >> ${outmd}

echo " \`\`\` " >> ${outmd}

echo "> 备份的数据" >> ${outmd}
echo " " >> ${outmd}
echo " \`\`\` " >> ${outmd}

# ./mysql-check.sh /home/mysql.tar.gz >> ${outmd}
./etcd-check.sh  >> ${outmd}

echo " \`\`\` " >> ${outmd}
echo "--------------------------" >> ${outmd}
cat -n ${rundir}/check-out-${theday}.md

echo -e "\e[92m 检查完成! \e[0m"

运行后输出的结果.md如下:

 

<think> 我们正在讨论的是Kubernetes中etcd的数据备份与还原方法。根据用户提供的引用,特别是引用[5]提到了使用etcdctl进行备份的脚本示例。此外,etcd的备份与还原是维护Kubernetes集群稳定性的重要操作。 关键点: 1. 备份:使用etcdctl snapshot save命令创建快照。 2. 还原:使用etcdctl snapshot restore命令从快照还原。 3. 注意:在还原操作之前,需要停止etcd服务,并且还原后需要调整etcd的配置文件和数据目录。 步骤: 备份etcd数据 通常,我们使用etcdctl的snapshot save命令来创建快照。 例如:ETCDCTL_API=3 etcdctl --endpoints=<etcd节点地址> snapshot save snapshot.db 二、还原etcd数据 1. 停止所有etcd节点上的etcd服务。 2. 使用etcdctl snapshot restore命令还原快照,这会生成新的数据目录。 3. 修改etcd的配置文件,指向新的数据目录。 4. 重启etcd服务。 注意:在多节点etcd集群中,还原操作需要谨慎,通常需要还原整个集群的快照,并且还原后需要重新启动集群。 详细步骤: ### 1. 备份etcd数据 使用以下命令创建快照(假设etcd版本为v3,使用环境变量指定API版本): ```bash ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /path/to/snapshot.db ``` 说明: - `--endpoints`:指定etcd节点地址,多个地址用逗号分隔。 - `--cacert`:CA证书路径。 - `--cert`:客户端证书路径。 - `--key`:客户端密钥路径。 - `snapshot save`:保存快照到指定文件。 引用[5]中提供了备份脚本的例子,其中使用了`etcdctl backup`命令,但注意在etcd v3中,备份推荐使用`snapshot save`,而v2版本使用`backup`。因此,我们以v3为准。 ### 2. 还原etcd数据 还原操作需要在所有etcd节点上执行(如果是集群,每个节点都需要从同个快照还原,但注意还原命令会生成新的member数据,所以每个节点都要独立还原,并修改配置指向新的数据目录)。 步骤: 1. 停止etcd服务: ```bash systemctl stop etcd ``` 2. 使用快照文件还原,生成新的数据目录(例如:/var/lib/etcd-restored): ```bash ETCDCTL_API=3 etcdctl snapshot restore /path/to/snapshot.db \ --name node1 \ # 节点名称,根据实际节点修改 --initial-cluster "node1=https://node1-ip:2380,node2=https://node2-ip:2380" \ --initial-cluster-token etcd-cluster-1 \ --initial-advertise-peer-urls https://node1-ip:2380 \ --data-dir /var/lib/etcd-restored ``` 参数说明: - `--name`:当前节点的名称(与初始集群中的名称致)。 - `--initial-cluster`:初始集群配置,列出所有节点。 - `--initial-cluster-token`:集群的唯token,还原时使用个新的token(不同于备份时的token)以避免冲突。 - `--initial-advertise-peer-urls`:当前节点的peer URL。 - `--data-dir`:指定新的数据目录。 3. 修改etcd的配置文件(通常是/etc/etcd/etcd.conf),将`ETCD_DATA_DIR`指向新的数据目录(例如:/var/lib/etcd-restored)。 4. 启动etcd服务: ```bash systemctl start etcd ``` 5. 检查集群状态: ```bash ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=... --cert=... --key=... endpoint health ``` 注意:在还原多节点集群时,每个节点都需要从同个快照文件还原,并且使用相同的`--initial-cluster`配置(但每个节点运行还原命令时,`--name`和`--initial-advertise-peer-urls`要改为当前节点的信息)。同时,确保`--initial-cluster-token`相同,这样它们才能组成个集群。 引用[5]中的备份脚本使用的是旧版命令,但原理类似。为了确保正确性,我们使用etcd v3的snapshot命令。 此外,定期备份非常重要,可以设置定时任务(cron job)来执行备份。 ### 定时备份示例脚本 创建个脚本(如`/usr/local/bin/etcd-backup.sh`): ```bash #!/bin/bash date_time=$(date +%Y%m%d) ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /niub/etcd_backup/snapshot-${date_time}.db # 删除7天前的备份 find /niub/etcd_backup/ -name 'snapshot-*.db' -mtime +7 -exec rm -f {} \; ``` 然后设置cron任务,每天执行次: ```bash 0 0 * * * /usr/local/bin/etcd-backup.sh ``` 注意:确保备份目录(如`/niub/etcd_backup`)存在,并具有写入权限。 以上步骤参考了etcd官方文档和引用[5]的思路[^5]。 ### 相关问题 1. 如何验证etcd备份文件的完整性和可用性? 2. 在Kubernetes集群中,如何在不影响服务的情况下执行etcd备份? 3. 多节点etcd集群的备份还原与单节点有何不同? [^5]: 使用etcd自带命令etcdctl进行etcd备份,脚本示例。 </think> ### Kubernetes 中 etcd 数据备份与还原方法 etcd 是 Kubernetes 的核心分布式键值存储数据库,存储集群所有状态数据(如 Pod、Service、ConfigMap 等),其备份与还原是集群灾难恢复的关键步骤。以下是完整操作流程: --- #### **备份 etcd 数据** 1. **创建快照备份** 使用 `etcdctl snapshot save` 命令创建数据快照: ```bash ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ # etcd 访问地址 --cacert=/etc/kubernetes/pki/etcd/ca.crt \ # CA 证书 --cert=/etc/kubernetes/pki/etcd/server.crt \ # 客户端证书 --key=/etc/kubernetes/pki/etcd/server.key \ # 私钥 snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db ``` - **关键参数**: - `--endpoints`:etcd 服务地址(多节点集群需指定所有节点) - 证书文件路径需与实际部署匹配(参考引用[4])[^4] 2. **自动化备份脚本** 定期备份并清理旧文件(参考引用[5])[^5]: ```bash #!/bin/bash DATE=$(date +%Y%m%d) etcdctl snapshot save --data-dir /var/lib/etcd \ --backup-dir /backup/etcd_${DATE} find /backup -name "etcd_*" -mtime +7 -exec rm -rf {} \; # 删除7天前备份 ``` - 可通过 `cron` 定时执行(如每天 2:00) --- #### **二、还原 etcd 数据** > **警告**:还原前需停止所有 etcd 和 kube-apiserver 服务 > ```bash > systemctl stop etcd kube-apiserver > ``` 1. **还原快照到临时目录** ```bash ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot-20230501.db \ --data-dir /var/lib/etcd-restore # 新数据目录 ``` 2. **替换原数据目录** ```bash mv /var/lib/etcd /var/lib/etcd-old # 备份数据 mv /var/lib/etcd-restore /var/lib/etcd chown -R etcd:etcd /var/lib/etcd # 确保权限正确 ``` 3. **重启服务** ```bash systemctl start etcd kube-apiserver ``` 4. **验证集群状态** ```bash kubectl get nodes # 检查节点状态 etcdctl endpoint health # 检查 etcd 健康状态 ``` --- #### **三、关键注意事项** 1. **集群部署差异** - **单节点 etcd**:直接按上述流程操作(参考引用[1][4])[^1][^4] - **多节点集群**:需在所有节点同步还原同快照,并确保 `--initial-cluster` 参数致[^2] 2. **数据致性保证** - 备份时建议停止 etcd 写入(避免增量数据丢失) - 使用 `etcdctl snapshot status` 验证备份完整性: ```bash etcdctl snapshot status /backup/snapshot.db ``` 3. **证书管理** - 还原时必须使用备份时的相同证书,否则会导致认证失败[^4] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值