本页面介绍如何备份 GKE on AWS 安装的 etcd 数据存储区,以便从可能破坏集群 etcd 数据的事件中恢复数据。
限制
使用备份文件来恢复 etcd 数据始终是最后的选择。除非集群完全损坏,否则我们不建议从备份文件进行恢复。请与 Google 支持团队联系,请其帮助您确定最合适的行动方案。
此过程不会备份工作负载中的数据,包括 PersistentVolume。
此备份不能用于从不同版本的 GKE on AWS 恢复集群。
备份用户集群
用户集群备份是用户集群的 etcd 存储区的快照。 etcd 存储区包含表示集群状态的所有 Kubernetes 对象和自定义对象。快照包含重新创建集群无状态工作负载所需的数据。
如需创建 etcd 数据存储区的快照,请执行以下步骤:
在为集群运行 etcd 的管理服务实例上打开 shell。
查找集群的管理服务实例的 IP 地址。
export CLUSTER_ID=$(terraform output cluster_id) export MANAGEMENT_IP=$(aws ec2 describe-instances \ --filters "Name=tag:Name,Values=$CLUSTER_ID-management-0" \ --query "Reservations[*].Instances[*].PrivateIpAddress" \ --output text)
使用
ssh
工具打开与管理服务实例的连接。直接连接
ssh -i ~/.ssh/anthos-gke ubuntu@$MANAGEMENT_IP
堡垒主机
export BASTION_DNS=$(terraform output bastion_dns_name) ssh -i ~/.ssh/anthos-gke -J ubuntu@$BASTION_DNS ubuntu@$MANAGEMENT_IP
创建用于存储 etcd 备份数据的目录。
mkdir ./etcd-backups
使用
ps
命令行工具查找该实例上 etcd 进程的进程 ID。ps -e | grep etcd
输出结果会显示 etcd 进程的详细信息。第一个元素是 etcd 的进程 ID。在以下步骤中,将 ETCD_PID 替换为此进程 ID。
在 etcd 容器的文件系统中创建脚本以截取快照。此脚本会运行 etcdctl 以连接到 etcd 守护程序,并执行快照以备份 etcd 数据库。
cat << EOT > /tmp/etcdbackup.sh # Extract a snapshot of the anthos-gke etcd state database export ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/secrets/server-ca.crt \ --cert=/secrets/server.crt \ --key=/secrets/server.key \ snapshot save /tmp/snapshot.db EOT chmod a+x /tmp/etcdbackup.sh sudo mv /tmp/etcdbackup.sh /proc/ETCD_PID/root/tmp/etcdbackup.sh
使用
nsenter
命令在 etcd 容器中运行脚本以创建快照。sudo nsenter --all --target ETCD_PID /tmp/etcdbackup.sh
从 etcd 容器中复制快照文件。
sudo cp /proc/ETCD_PID/root/tmp/snapshot.db ./etcd-backups
将 etcd 容器的 /secrets 目录中的所有文件复制到备份目录。这些文件包含用于加密和验证 etcd 和集群中其他进程之间通信的证书。快照文件和证书文件一起组成 etcd 集群状态的完整备份。
sudo cp -r /proc/ETCD_PID/root/secrets ./etcd-backups
使用
tar
工具将 etc 备份文件捆绑到合适的 tar 文件中。tar -cvf etcd-backup.tar etcd-backup
退出到本地机器,然后使用
scp
工具从管理服务实例中复制 etcd-backup.tar 文件。此示例使用前面定义的 BASTION_DNS 和 MANAGEMENT_IP 环境变量。scp -i ~/.ssh/anthos-gke -J ubuntu@$BASTION_DNS \ ubuntu@$MANAGEMENT_IP:~/etcd-backup/backup.tar