K8s中 备份数据 检查验证(五)--Etcd备份验证

本文提供了一套用于Kubernetes (K8s) 中Etcd集群运行状况检查及备份文件验证的脚本。通过这些脚本,可以获取Etcd集群的健康状况,包括节点状态、成员列表等,并验证Etcd备份文件的有效性,确保数据的一致性和可用性。

现行K8s中Etcd集群运行状况;

status-etcd.sh

#!/bin/bash

bash_path=$(cd $(dirname $0); pwd)
theday=`date +%F`

if [ ! -d "${rundir}/log" ]; then
        mkdir ${rundir}/log
fi
rm -rf $bash_path/log/etcd-check-${theday}.txt >> /dev/null 2>&1

endpoint=`kubectl get pod -n kube-system -o wide \
|awk '$1~"etcd"&&$3=="Running"{print $6":2379"}' \
|awk BEGIN{RS=EOF}'{gsub(/\n/,",");print}'`

#endpoint_1="https://10.149.23.13:2379"
#endpoint_2="https://10.149.23.13:2379"
#endpoint_3="https://10.149.23.13:2379"

CL_0="ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
--endpoints=\"${endpoint}\""
CL_1="endpoint status --write-out=table"
CL_2="member list --write-out=table"
CL_3="get /registry/deployments/iotplat/ --prefix --keys-only"

Outtxt=">> /home/etcd-check-${theday}.txt"

CMDLine="${CL_0} ${CL_1} ${Outtxt} && ${CL_0} ${CL_2} ${Outtxt} && ${CL_0} ${CL_3} ${Outtxt}"

#echo "$CMDLine"
docker run -it --rm -v ${bash_path}/log:/home -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd k8s.gcr.io/etcd:3.3.10 /bin/sh -c "${CMDLine}"

sed -i '/^$/d' $bash_path/log/etcd-check-${theday}.txt

echo -e "\n=======${theday} 当前集群Etcd数据库检查=======\n" >> $bash_path/log/etcd-check.txt
cat $bash_path/log/etcd-check-${theday}.txt >> $bash_path/log/etcd-check.txt

tail -n 36 $bash_path/log/etcd-check.txt

运行

验证Etcd数据;

etcd-check.sh

#!/bin/bash

rundir=$(cd $(dirname $0); pwd)
theday=`date +%F`

echo -e "=======${theday} Etcd备份验证======="

#清除上次验证数据
dbtmpdir="${rundir}/dbtmp/etcd"
rm -rf ${dbtmpdir} && mkdir ${dbtmpdir} -p

#如果没有参数则搜索当前运行目录下的
if [ "$1" ];then
        baktar=$1
else
        baktar=$(find ${rundir} -name "*snapshot*.db" | sort -rn | head -1)
fi
if [ ! -e "${baktar}" ];then
        echo "没有找到备份snapshot*.db!!!"
        exit 0
fi
echo -e "1.Etcd备份文件是:\n ${baktar}"

echo -e "2.还原数据库的临时目录:\n ${dbtmpdir}"

echo -e "3.开始还原数据库"
cp -f ${baktar} ${dbtmpdir}/snapshot.db

docker run -it --rm -v ${dbtmpdir}:/home k8s.gcr.io/etcd:3.3.10 /bin/sh \
-c 'ETCDCTL_API=3 etcdctl snapshot restore /home/snapshot.db --data-dir=/home/db' \
>> /dev/null 2>&1
echo -e " 还原的数据库:${dbtmpdir}/db"

echo -e "\n======================================" >> ${rundir}/log/etcd-check.txt
echo -e "=======${theday} Etcd备份验证=======" >> ${rundir}/log/etcd-check.txt
echo -e "======================================" >> ${rundir}/log/etcd-check.txt
echo -e "备份文件为:${baktar}" >> ${rundir}/log/etcd-check.txt
echo -e "输出/registry/deployments/iotplat/下的所有key:" >> ${rundir}/log/etcd-check.txt

echo -e "4.检验Etcd数据"
docker run -it --name etcd-check -v ${dbtmpdir}/db:/var/lib/etcd -d k8s.gcr.io/etcd:3.3.10 /bin/sh \
-c 'etcd --data-dir=/var/lib/etcd' \
>> /dev/null 2>&1

docker exec -it etcd-check /bin/sh \
-c 'ETCDCTL_API=3 etcdctl get /registry/deployments/iotplat/ --prefix --keys-only' \
>> ${rundir}/log/etcd-check.txt

docker stop etcd-check >> /dev/null 2>&1
docker rm etcd-check >> /dev/null 2>&1

sed -i 's/
//g' ${rundir}/log/etcd-check.txt
sed -i '/^$/d' ${rundir}/log/etcd-check.txt

#cat ${rundir}/log/etcd-check.txt | tr -s "\n" > ${rundir}/log/etcd-check.txt

tail -n 24 ${rundir}/log/etcd-check.txt
echo -e "验证结果输出:${rundir}/log/etcd-check.txt"


运行

<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、付费专栏及课程。

余额充值