备份和还原 Contrail 等
总结 了解如何备份和还原 Contrail 等数据库。
在 22.1 版中,Contrail 将其数据存储在 OpenShift 等主数据库中。在 22.1 版中备份和还原主要 etcd 数据库时,您以隐式方式备份和还原 Contrail 数据。
从 22.2 版开始,Contrail 将其数据存储在自己的 etcd 数据库中。使用本节中的过程备份和还原 Contrail 等数据库。
备份 22.2 版中的 Contrail Etcd 数据库
在 22.2 版中使用此示例过程备份 Contrail 等数据库。在 22.2 版中,您可以在 contrail-etcd Pod 中运行 etcdctl 命令。
- 获取 Contrail 等 Pod 列表。
user@ai-client:~# kubectl get pods -A | grep contrail-etcd
- 备份 etcd 数据库。
- 将 shell 放入 Contrail 等 Pod 之一。
例如:
kubectl exec -it contrail-etcd-xxx -c contrail-etcd -n contrail-system sh
- 备份 etcd 数据库。
此示例将数据库保存到 /tmp/etcdbackup.db。
etcdctl snapshot save /tmp/etcdbackup.db --endpoints=<etcd-pod-ip>:<etcd-port>
exit
- 将 shell 放入 Contrail 等 Pod 之一。
- 将数据库复制到安全位置。
例如:
user@ai-client:~# kubectl cp contrail-system/contrail-etcd-xxx:/tmp/etcdbackup.db -c contrail-etcd ./etcdbackup.db
备份 22.3 版中的 Contrail Etcd 数据库
在 22.3 版中使用此示例过程备份 Contrail 等数据库。在 22.3 版中,您可以在控制平面节点上运行 etcdctl 命令。
- 在所有控制平面节点上安装 etcdctl。
- 登录其中一个控制平面节点。
例如:
ssh core@172.16.0.11
- 下载等。此示例将下载到 /tmp 目录。
ETCD_VER=v3.4.13 curl -L https://storage.googleapis.com/etcd/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
- 解开并将 etcd 可执行文件移动到路径中的目录中(例如 /usr/local/bin)。
tar -xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp sudo mv /tmp/etcd-${ETCD_VER}-linux-amd64/etcdctl /usr/local/bin
- 检查您是否已安装等。
[core@ocp1]$ etcdctl version etcdctl version: 3.4.13 API version: 3.4
- 在所有控制平面节点上重复上述操作。
- 登录其中一个控制平面节点。
- 获取 Contrail 等 Pod 列表。
user@ai-client:~# kubectl get pods -A | grep contrail-etcd
- 将 etcd 证书和密钥文件从 Pod 复制到控制平面节点。
在这一步中,我们在控制平面节点上运行 kubectl我们假设您在控制平面节点上的默认位置 ( ~/.kube/config) 上设置了 kubeconfig。
- 选择 Contrail-etcd Pod(例如,contrail-etcd-0)并登录托管该 Pod 的控制平面节点。
- 将证书和密钥文件从该 Contrail 等 Pod 复制到托管控制平面节点。
在此示例中,我们要将证书和密钥文件从 contrail-etcd-0 Pod 复制到此节点上的本地文件。
kubectl exec --namespace contrail-system contrail-etcd-0 -c contrail-etcd -- cat /etc/member-tls/ca.crt > ./ca.crt kubectl exec --namespace contrail-system contrail-etcd-0 -c contrail-etcd -- cat /etc/member-tls/tls.crt > ./tls.crt kubectl exec --namespace contrail-system contrail-etcd-0 -c contrail-etcd -- cat /etc/member-tls/tls.key > ./tls.key
- 对每个 Contrail 等 Pod 重复这一操作。
- 在一个控制平面节点上备份 etcd 数据库。您只需在一个节点上备份数据库。
- 重新登录到其中一个控制平面节点。
- 备份 etcd 数据库。
此示例将数据库保存到此控制平面节点上的 /tmp/etcdbackup.db 。
etcdctl snapshot save /tmp/etcdbackup.db --endpoints=<etcd-pod-ip>:<etcd-port> --cacert=ca.crt --cert=tls.crt --key=tls.key
- 将数据库复制到安全位置。
还原 22.2 版中的 Contrail Etcd 数据库
使用 22.2 版中的此示例过程从快照还原 Contrail 等数据库。
- 将快照复制到所有 Contrail 等 Pod。
kubectl cp etcdbackup.db contrail-system/contrail-etcd-xxx:/tmp/etcdbackup.db -c contrail-etcd
- 还原快照。
- 将 shell 放入 Contrail 等 Pod 之一。
例如:
kubectl exec -it contrail-etcd-xxx -n contrail-system sh
- 还原 etcd 数据库。
这会在 Pod 上创建一个 <contrail-etcd-xxx>.etcd 目录。
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcdBackup.db \ --name=<contrail-etcd-xxx> \ --initial-cluster=<contrail-etcd-xxx>=https://<contrail-etcd-xxx-ip>:12380,<contrail-etcd-yyy>=https://<contrail-etcd-yyy-ip>:12380,<contrail-etcd-zzz>=https://<contrail-etcd-zzz-ip>:12380 \ --initial-advertise-peer-urls= https://<contrail-etcd-xxx>:12380
exit
- 对其他 Contrail-etcd Pod 重复这一操作,用相应的 Contrail-etcd Pod 名称和 IP 地址替换
--name
--initial-advertise-peer-urls
和值。
- 将 shell 放入 Contrail 等 Pod 之一。
- 将保存的 etcd 数据从 contrail-etcd Pod 复制到各自的控制平面节点。
- SSH 到其中一个控制平面节点中。
- 将保存的 contrail-etcd-xxx.等从相应的 Contrail-etcd Pod 复制到节点。
例如:
kubectl cp contrail-system/contrail-etcd-xxx:/app/cmd/operator/operator.runfiles/cn2/contrail-etcd-xxx.etcd -c contrail-etcd ./<contrail-etcd-xxx>.etcd
exit
- 对其他控制平面节点重复上述操作。
- 停止 Contrail 等 Pod。
这会将复本设置为 0,从而有效地阻止 Pod。
user@ai-client:~# kubectl patch etcds.datastore.juniper.net contrail-etcd -n contrail-system --type=merge -p '{"spec": {"common": {"replicas": 0}}}
- 将 contrail 等数据替换为快照中的数据。
- SSH 到其中一个控制平面节点中。
- 替换数据。
sudo rm -rf /var/lib/contrail-etcd/snapshots sudo mv /var/lib/contrail-etcd/etcd/member /var/lib/contrail-etcd/etcd/member.bak sudo mv contrail-etcd-xxx.etcd/member /var/lib/contrail-etcd/etcd/
exit
- 对其他控制平面节点重复上述操作。
- 启动 Contrail 等 Pod。
这将副本设置为 3,从而有效地启动 Pod。
user@ai-client:~# kubectl patch etcds.datastore.juniper.net contrail-etcd -n contrail-system --type=merge -p '{"spec": {"common": {"replicas": 3}}}
- 重新启动 Contrail 系统 apiserver 和控制器。
删除所有 Contrail-k8s-apiserver 和 Contrail-k8s-controller Pod。
kubectl delete pod <contrail-k8s-apiserver-xxx> -n contrail-system
kubectl delete pod <contrail-k8s-controller-xxx> -n contrail-system
- 重新启动 vrouters。
删除所有 contrail-vrouter-masters 和 contrail-vrouter-nodes Pod。
kubectl delete pod <contrail-vrouter-masters-xxx> -n contrail
kubectl delete pod <contrail-vrouter-nodes-xxx> -n contrail
- 检查所有 Pod 是否都处于运行状态。
user@ai-client:~# kubectl get pods -n contrail-system
user@ai-client:~# kubectl get pods -n contrail
还原 22.3 版中的 Contrail Etcd 数据库
使用 22.3 版中的此示例过程从快照还原 Contrail 等数据库。
- 将要还原的快照复制到所有控制平面节点。
以下步骤假定您已将所有控制平面节点上的快照复制到 /tmp/etcdbackup.db 。
- 还原快照。
- 登录其中一个控制平面节点。在此示例中,我们要登录托管 contrail-etcd-0 的控制平面节点。
- 将 etcd 数据库还原到此控制平面节点上的 contrail-etcd-0 Pod。
这会在节点上创建一个 contrail-etcd-0.etcd 目录。
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcdBackup.db \ --name=contrail-etcd-0 \ --initial-cluster=contrail-etcd-0=https://<contrail-etcd-0-ip>:12380,\ contrail-etcd-1=https://<contrail-etcd-1-ip>:12380,\ contrail-etcd-2=https://<contrail-etcd-2-ip>:12380 \ --initial-advertise-peer-urls= https://<contrail-etcd-0-ip>:12380 \ --cacert=ca.crt --cert=tls.crt --key=tls.key
--name=contrail-etcd-0
指定此命令将数据库还原到 contrail-etcd-0,--initial-cluster=...
列出群集中的所有 contrail-etcd 成员,并--initial-advertise-peer-urls=...
引用 contrail-etcd-0 pod 侦听的 IP 地址和端口号。 - 对各自控制平面节点上的其他 contrail-etcd Pod 重复这一操作,用相应的 contrail-etcd Pod 名称和 IP 地址替换
--name
--initial-advertise-peer-urls
和值。
- 停止 Contrail 等 Pod。
这会将复本设置为 0,从而有效地阻止 Pod。
user@ai-client:~# kubectl patch etcds.datastore.juniper.net contrail-etcd -n contrail-system --type=merge -p '{"spec": {"common": {"replicas": 0}}}
- 将 contrail 等数据替换为快照中的数据。
- SSH 到其中一个控制平面节点中。
- 替换数据。回想一下,快照存储在 contrail-etcd-etcd<xxx> 目录中。
sudo rm -rf /var/lib/contrail-etcd/snapshots sudo mv /var/lib/contrail-etcd/etcd/member /var/lib/contrail-etcd/etcd/member.bak sudo mv contrail-etcd-<xxx>.etcd/member /var/lib/contrail-etcd/etcd/
- 对其他控制平面节点重复上述操作。
- 启动 Contrail 等 Pod。
这将副本设置为 3,从而有效地启动 Pod。
user@ai-client:~# kubectl patch etcds.datastore.juniper.net contrail-etcd -n contrail-system --type=merge -p '{"spec": {"common": {"replicas": 3}}}
- 重新启动 Contrail 系统 apiserver 和控制器。
删除所有 Contrail-k8s-apiserver 和 Contrail-k8s-controller Pod。
kubectl delete pod <contrail-k8s-apiserver-xxx> -n contrail-system
kubectl delete pod <contrail-k8s-controller-xxx> -n contrail-system
- 重新启动 vrouters。
删除所有 contrail-vrouter-masters 和 contrail-vrouter-nodes Pod。
kubectl delete pod <contrail-vrouter-masters-xxx> -n contrail
kubectl delete pod <contrail-vrouter-nodes-xxx> -n contrail
- 检查所有 Pod 是否都处于运行状态。
user@ai-client:~# kubectl get pods -n contrail-system
user@ai-client:~# kubectl get pods -n contrail