
实践:Kubernetes环境中Etcd集群的备份与恢复
这篇文章我们将进行Kubernetes集群的核心组件 etcd
集群备份,然后在具有一个主节点和一个从节点的 kubernetes 集群中恢复相同的备份。下面是实验的步骤和效果验证。
Step1 安装ETCD客户端
安装etcd cli 客户端, 管理etcd集群。这里在Ubuntu系统中安装。
Step2 创建Nginx部署
我们将创建具有多个副本的 nginx 部署,这些副本将用于验证 etcd 数据的恢复。
验证新部署的 Pod 是否处于运行状态
Step3 备份Etcd集群
为 etcd 备份创建一个备份目录mkdir etcd-backup
运行以下命令进行 etcd 备份。
请注意,您不需要记住上述命令的证书路径,您可以从 kube-system 命名空间中运行的 etcd pod 获取证书路径。您可以通过运行以下命令来为 pod 运行命令
现在运行 get pods -o yaml
命令来获取 etcd pod
的容器命令。
将得到它并可以获得所有证书路径。
Step4 验证备份数据
运行以下命令,以从新备份数据中获取密钥列表和详细信息ETCDCTL_API=3 etcdctl --write-out=table snapshot status ./etcd-backup/etcdbackup.db
Step5 将备份恢复到集群
在这里,我们将删除之前创建的 nginx
部署,然后恢复备份,以便恢复 nginx
部署。
A.删除nginx部署
B.将数据从备份恢复
这将创建一个名为的default.etcd
文件夹, 恢复备份时您可能会遇到如下错误:
为了避免这种情况,您可以在上面的恢复命令中使用--skip-hash-check=true
此标志,您应该可以很好地获取default.etcd
当前路径上的文件夹。
C.现在我们需要停止所有正在运行的 Kubernetes 组件以更新 etcd 数据。为此,我们在/etc/kubernetes/manifests/
文件夹中放置了 kubernetes
组件的清单文件,我们将临时将此文件移出此路径,kubelet 将自动删除这些 pod。
您可以在上面看到,一旦我们从清单路径中删除文件,api-server pod
将被终止,您将无法访问集群。你可以检查这些组件的docker容器是否被Kill或处于运行状态。在移动文件之前,容器将运行。
一旦文件被移动,它们将被终止。
D.现在 api-server/controller-manager/kube-scheduler
已终止,我们将把数据从default.etcd
文件夹移动到 etcd data-dir
,我们可以从第 3 阶段获取该数据,在阶段 3 中,我们在 etcd pod 中运行 etcd 命令,并且设置了 data-dir到--data-dir=/var/lib/etcd
.
我们将从备份目录中重命名并添加member
文件夹/var/lib/etcd/member
。备份默认/var/lib/etcd/
目录中的member
到文件夹/var/lib/etcd/member.bak
E. 现在,由于我们的数据已恢复,我们将停止 kubelet 服务并将 yaml 文件再次移动到清单文件夹。
一旦这些文件被移动,我们将启动 kubelet 服务,以便它选择这些文件并部署组件。
您现在可以看到容器现在再次运行, kubectl 命令可能需要几分钟才能工作。
您现在可以通过运行 get pods 命令来验证我们的 nginx 部署是否已恢复(我们在备份后删除了该部署)
恭喜!!!您现在已成功恢复 ETCD 数据。
文章转载自公众号:DevOps云学堂
