更新时间:2024-10-25 GMT+08:00

备份与恢复

背景

UCS本地集群安装完成后,为保证集群高可用,防止在发生集群故障时数据丢失,UCS支持对于本地集群上的3个master节点上的证书文件、加解密物料、etcd数据等信息的备份,以保障UCS本地集群故障后的数据恢复。

约束与限制

无论是单master还是多master故障,节点IP须保持不变。

集群备份

本地备份

  1. 创建备份文件压缩包存放的目录。
  2. 执行备份命令:
    ./ucs-ctl backup 集群名 --path 备份路径 --type local

    示例如下:

    ./ucs-ctl backup gpu-test --path /home/ggz/gpu-test --type local

    执行成功后,会在指定的备份路径下产生名为:集群名-backup-时间戳.tar.gz这样一个备份压缩文件。

    备份压缩文件存在ha.yaml、etcd-snapshot目录、crt目录,etcd-snapshot包含etcd备份数据,crt包含证书与加解密材料。

远端备份

  1. 在远端sftp主机创建备份文件压缩包存放的目录。
  2. 执行备份命令:
    ./ucs-ctl backup 集群名 --path 备份路径 --type sftp --ip 远端主机ip --user 远端主机用户名

    示例如下:

    ./ucs-ctl backup gpu-test --path /home/ggz/gpu-test --type sftp --ip 100.95.142.93 --user root
    • 首次进行远端备份需要输入sftp密码,请在please input sftp password提示后输入远端sftp服务器密码。
    • 备份命令中的备份路径必须真实有效,否则执行命令后在远端生成的备份文件可能存在错误。

    执行成功后,远端主机的指定备份路径下会产生名为“集群名-backup-时间戳.tar.gz”的备份压缩文件。该备份压缩文件包含ha.yaml、etcd-snapshot目录、crt目录,etcd-snapshot包含etcd备份数据,crt包含证书与加解密材料。

周期备份

执行crontab -e,通过编写crontab表达式使得备份命令周期执行。

示例如下,代表每天16:40执行集群周期本地备份任务。

40 16 * * * /root/cluster/ucs-ctl backup cluster-redhat --path /root/cluster/backup --type local  

周期远端备份时,在首次输入完远端sftp服务器密码后,在crontab表达式中无需指明密码。

为防止备份文件数量一直膨胀,需在备份机器上同样通过crontab周期执行备份文件老化脚本,备份文件老化参考如下:

#!/bin/bash  
backup_dir=${1}                                            # 备份文件保存路径
keep_days=${2}                                             # 保存天数
if [ ! -d ""$backup_dir"" ]; then                          # 检查日志目录是否存在              
  echo "备份文件路径不存在!" 
  exit 1 
fi  
find "$backup_dir" -type f -mtime +$keep_days -exec rm {} \;       # 删除旧日志 
echo "过期备份文件已删除!"

数据恢复

etcd数据恢复

  1. 准备etcd备份数据文件。

    将备份数据压缩文件{clustername}-backup-{timestamp}.tar.gz发送到需要恢复的集群的各个master/etcd节点上。

  2. 关闭etcd服务

    在节点上执行:

    mv /var/paas/kubernetes/manifests/etcd*.manifest /var/paas/kubernetes/

    等待服务停止。

    crictl ps | grep etcd

    若查询不到etcd容器,说明服务已经停止。

  3. 备份节点的etcd数据(可选)。
    mv /var/paas/run/etcd/data /var/paas/run/etcd/data-bak 
    mv /var/paas/run/etcd-event/data /var/paas/run/etcd-event/data-bak
  4. 在含有etcd的节点上执行恢复命令。
    ./ucs-ctl restore etcd 备份文件压缩包路径

    示例如下:

    ./ucs-ctl restore etcd /home/ggz/gpu-test/backup-file-20230625164904.tar.gz

    若回显如下命令,则etcd的节点数据恢复成功:

    Restore the etcd snapshot successfully.
  5. 对etcd节点重启etcd服务,重启过程需要等待几分钟。
    mv /var/paas/kubernetes/etcd*.manifest /var/paas/kubernetes/manifests

    等待服务重新启动:

    crictl ps | grep etcd

    若查询到etcd容器说明服务已经重启,此时该节点的etcd数据得到恢复。

    etcd数据恢复需要每个含有etcd的节点上单独执行1-5步骤。

单master节点故障恢复

  1. 在执行机上执行单节点故障恢复命令。

    ./ucs-ctl restore node 节点ip --name 集群名
    其中节点ip为故障节点的ip,示例如下。
    ./ucs-ctl restore node 192.168.0.87 --name gpu-test
    若回显如下命令,则单master节点故障恢复成功:
    restore node 192.168.0.87 successfully.

  2. 在含有etcd的节点上进行etcd数据恢复,具体命令请参考步骤1-5

多master节点故障恢复

  1. 对所有master节点进行系统清理。将执行机目录下的卸载脚本拷贝到3台master节点并执行。(脚本路径为/var/paas/.ucs-package/ucs-onpremise/scripts/uninstall_node.sh)

    scp -r /var/paas/.ucs-package/ucs-onpremise/scripts/uninstall_node.sh root@{目标节点IP}:/root
    sudo bash /root/uninstall_node.sh

  2. 在执行机上执行集群故障恢复命令。

    ./ucs-ctl restore cluster 集群名 -b 备份文件压缩包路径

    示例命令:

    ./ucs-ctl restore cluster gpu-test -b /home/ggz/gpu-test/backup-file-20230625164904.tar.gz
    若回显如下命令,则多master节点故障恢复成功:
    restore cluster successfully.

  3. 在每个含有etcd的节点上进行etcd数据恢复,具体命令请参考步骤1-5