ETCD-Restore
备份和恢复 etcd 的任务
1. 备份 etcd (在 controlplane 节点上执行):
ssh controlplane "sudo 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 /opt/cluster_backup.db"
解释:
ssh controlplane "...": 通过 SSH 连接到名为controlplane的节点,并在该节点上执行引号内的命令。 你需要确保你的 SSH 密钥已配置好,以便可以无密码登录到controlplane节点。sudo: 以 root 权限运行命令,因为访问 etcd 数据目录和证书通常需要 root 权限。ETCDCTL_API=3: 指定 etcdctl 使用的 API 版本。 Kubernetes 通常使用 etcd v3。etcdctl: etcd 的命令行工具。--endpoints=https://127.0.0.1:2379: 指定 etcd 集群的端点。 这里假设 etcd 在本地的 2379 端口上运行。 如果你的 etcd 集群有多个节点,你需要指定所有节点的地址。--cacert=/etc/kubernetes/pki/etcd/ca.crt: 指定用于验证 etcd 服务器证书的 CA 证书。--cert=/etc/kubernetes/pki/etcd/server.crt: 指定用于客户端身份验证的客户端证书。--key=/etc/kubernetes/pki/etcd/server.key: 指定客户端证书的私钥。snapshot save /opt/cluster_backup.db: 指示 etcdctl 创建 etcd 数据的快照,并将其保存到/opt/cluster_backup.db文件中。
重要提示:
- 证书路径:
/etc/kubernetes/pki/etcd/路径是 Kubernetes 默认的 etcd 证书存储位置。 如果你的 Kubernetes 集群使用不同的证书路径,请相应地修改命令。 - etcdctl 版本: 确保你使用的
etcdctl版本与你的 etcd 服务器版本兼容。 通常,最好使用与 etcd 服务器版本相同的etcdctl版本。 你可以通过运行etcdctl version来检查etcdctl的版本。 - 权限: 确保执行备份命令的用户具有读取 etcd 数据目录和证书的权限。
2. 恢复 etcd (在 controlplane 节点上执行):
ssh controlplane "sudo 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 restore /opt/cluster_backup.db --data-dir=/root/default.etcd 2>&1 | tee restore.txt"
解释:
snapshot restore /opt/cluster_backup.db --data-dir=/root/default.etcd: 指示 etcdctl 从/opt/cluster_backup.db文件恢复 etcd 数据,并将数据存储到/root/default.etcd目录中。 重要: 在执行恢复之前,请确保/root/default.etcd目录不存在或为空。 否则,恢复可能会失败或导致数据损坏。2>&1: 将标准错误 (stderr) 重定向到标准输出 (stdout)。 这会将所有错误消息与正常输出一起捕获。| tee restore.txt: 使用tee命令将标准输出同时显示在终端上,并将其保存到restore.txt文件中。 这允许你查看恢复过程的输出,并将其记录下来以供以后参考。
重要提示:
-
数据目录:
/root/default.etcd是你指定的数据目录。 在恢复之前,强烈建议备份现有的/root/default.etcd目录,以防恢复失败。 -
停止 kube-apiserver: 在恢复 etcd 之前,必须停止所有 kube-apiserver 实例。 否则,恢复可能会导致数据不一致。 你可以使用以下命令停止 kube-apiserver:
ssh controlplane "sudo systemctl stop kube-apiserver"在所有 controlplane 节点上执行此操作。
-
恢复后启动 kube-apiserver: 恢复完成后,启动 kube-apiserver:
ssh controlplane "sudo systemctl start kube-apiserver"在所有 controlplane 节点上执行此操作。
-
健康检查: 恢复完成后,验证 etcd 和 Kubernetes 集群是否正常运行。 检查 etcd 的健康状况:
ssh controlplane "sudo 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 endpoint health"检查 Kubernetes 集群的状态:
kubectl get nodes kubectl get pods --all-namespaces
浙公网安备 33010602011771号