为了能够更好地寻找ETCD的备份与方案,因此针对这个过程进行阅读RKE中关于ETCD备份的代码部分,撰写此文与大家分享,同时也求证阅读过程是否正确与大家交流。
Rancher为采用容器的团队提供了完整的软件堆栈,解决了跨任何基础设施架构管理多个Kubernetes集群的运维和安全挑战,同时为DevOps团队提供了用于运行容器化工作负载的集成工具。Racher是100%开源的商业项目,在容器平台的实现方面有很多可以借鉴的地方。
备份过程
如上图所示,在Rancher对ETCD的备份过程中,需要备份提供两种备份,分别是s3和本地备份。在备份过程中RKE调用rke-etcd-backup命令中的save子命令进行备份。在备份的前期需要筛选掉不可用的ETCD名称。
rke-etcd-backup命令如上图所示,rke-etcd-backup主要做两步操作,备份和清理环境。而备份的具体步骤如下所示:
- 进行健康检测,判断ETCD是否健康;
- 使用etcdctl进行备份文件;
- 采用zip算法进行压缩备份文件;
- 如果采用s3存储,则直接上传到s3中。
在完成这些备份过程后,开始进行文件清理工作,清理原来文件和压缩文件。
恢复过程
而恢复过程则必备份过程要复杂得多。恢复过程需要将包括etcd在内的所有服务停止后才能开始恢复工作。
如上图所示,RKE在备份时先执行一些前置任务的工作。具体的任务如下所示:
- 停止所有node上的kubelet服务、kube-proxy、nginx服务;
- 停止所有master上的apiserver、controlermanager、Sheducler服务;
- 停止所有ETCD服务,同时将恢复的文件在磁盘山高展开。
在完成这些前置工作后,开始使用etcctl命令进行恢复命令。恢复完成后开始重启整个集群,包括 ETCD集群和kubenetes集群,从而完成ETCD的备份工作。
而ETCD的备份命令如下所示:
"sh", "-c",
strings.Join([]string{
"rm -rf", EtcdRestorePath,
"&& /usr/local/bin/etcdctl",
fmt.Sprintf("--endpoints=[%s:2379]",
etcdHost.InternalAddress),
"--cacert", pki.GetCertPath(pki.CACertName),
"--cert", pki.GetCertPath(nodeName),
"--key", pki.GetKeyPath(nodeName),
"snapshot", "restore", snapshotPath,
"--data-dir=" + EtcdRestorePath,
"--name=etcd-" + etcdHost.HostnameOverride,
"--initial-cluster=" + initCluster,
"--initial-cluster-token=etcd-cluster-1",
"--initial-advertise-peer-urls=https://" + etcdHost.InternalAddress + ":2380",
"&& mv", EtcdRestorePath + "*", EtcdDataDir, "&& rm -rf", EtcdRestorePath,}, " "),