ETCD 备份与还原

安装etcdctl

准备看下etcd如何命令行操作,才发现,主机上,只用kubeadm拉起了etcd,但没有etcdctl命令。

# sudo docker ps -a | awk '/etcd-master/{print $1}'
c4e3a57f05d7
26a11608b270
836dabc8e254

 找到正在运行的etcd,将pod中的etcdctl命令复制到主机上,使得在主机上就能直接使用etcdctl命令。

# sudo docker cp c4e3a57f05d7:/usr/local/bin/etcdctl /usr/local/bin/etcdctl

在此执行etcdctl 命令,已成功执行

# etcdctl
NAME:
        etcdctl - A simple command line client for etcd3.

USAGE:
        etcdctl [flags]

VERSION:
        3.5.1

API VERSION:
        3.5

查看etcd节点成员

# 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 member list -w table
+-----------------+---------+-------------------+---------------------------+---------------------------+------------+
|       ID        | STATUS  |       NAME        |        PEER ADDRS         |       CLIENT ADDRS        | IS LEARNER |
+-----------------+---------+-------------------+---------------------------+---------------------------+------------+
| dd7a929be676b37 | started |  | https://192.168.1.120:2380 | https://192.168.1.120:2379 |      false |
+-----------------+---------+-------------------+---------------------------+---------------------------+------------+

etcd的证书列表

# ll /etc/kubernetes/pki/etcd/
total 32
-rw-r----- 1 root root 1086 Mar 26 16:52 ca.crt
-rw------- 1 root root 1675 Mar 26 16:52 ca.key
-rw-r----- 1 root root 1159 Mar 26 16:52 healthcheck-client.crt
-rw------- 1 root root 1675 Mar 26 16:52 healthcheck-client.key
-rw-r----- 1 root root 1220 Mar 26 16:52 peer.crt
-rw------- 1 root root 1675 Mar 26 16:52 peer.key
-rw-r----- 1 root root 1220 Mar 26 16:52 server.crt
-rw------- 1 root root 1675 Mar 26 16:52 server.key

etcdctl设置别名

# alias etcdctl='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'
[root@192.168.1.120 ~]# 
[root@192.168.1.120 ~]# etcdctl member list -w table
+-----------------+---------+-------------------+---------------------------+---------------------------+------------+
|       ID        | STATUS  |       NAME        |        PEER ADDRS         |       CLIENT ADDRS        | IS LEARNER |
+-----------------+---------+-------------------+---------------------------+---------------------------+------------+
| dd7a92
<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] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值