备份和恢复集群

本页面介绍如何备份和恢复使用 Anthos clusters on Bare Metal 创建的集群。以下说明适用于 Anthos clusters on Bare Metal 支持的所有集群类型。

备份集群

备份过程包括两个部分。首先,通过 etcd 存储区创建快照。然后,相关的 PKI 证书会保存到一个 tar 文件中。etcd 存储区是所有集群数据的 Kubernetes 后备存储区,包含管理集群状态需要的所有 Kubernetes 对象和自定义对象。PKI 证书用于通过 TLS 进行身份验证。此数据从集群的控制层面或高可用性 (HA) 部署的其中一个控制层面进行备份。

我们建议您定期备份集群,以确保快照数据相对最新。备份频率取决于集群进行重大更改的频率。

创建 etcd 存储区的快照

在 Anthos clusters on Bare Metal 中,kube-system 命名空间中名为 etcd-CONTROL_PLANE_NAME 的 pod 会运行该控制层面的 etcd。要备份集群的 etcd 存储区,请从管理员工作站执行以下步骤:

  1. 使用 kubectl get po 标识 etcd pod。

    kubectl --kubeconfig CLUSTER_KUBECONFIG get po -n kube-system \
        -l 'component=etcd,tier=control-plane'
    

    响应内容包括 etcd pod 名称及其状态。

  2. 使用 kubectl describe pod 查看在 etcd Pod 中运行的容器(包括 etcd 容器)。

    kubectl --kubeconfig CLUSTER_KUBECONFIG describe pod ETCD_POD_NAME -n kube-system
    
  3. 在 etcd 容器中运行 Bash shell:

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it \
        ETCD_POD_NAME --container etcd --namespace kube-system \
        -- bin/sh
    
  4. 在 etcd 容器内的 shell 中,使用 etcdctl(API 的第 3 版)保存 etcd 存储区的快照 snapshot.db

    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --cert=/etc/kubernetes/pki/etcd/peer.crt \
        --key=/etc/kubernetes/pki/etcd/peer.key \
        snapshot save /tmp/snapshotDATESTAMP.db
    

    DATESTAMP 替换为当前日期,以防止覆盖任何后续快照。

  5. 从容器中的 shell 退出,然后运行以下命令将快照文件复制到管理员工作站。

    kubectl --kubeconfig CLUSTER_KUBECONFIG cp \
        kube-system/ETCD_POD_NAME:/tmp/snapshot.db \
        --container etcd snapshot.db
    
  6. 从 etcd pod 中复制 etcdctl 二进制文件,以便在恢复过程中使用相同的二进制文件。

    kubectl --kubeconfig CLUSTER_KUBECONFIG cp \
      kube-system/ETCD_POD_NAME:/usr/local/bin/etcdctl \
      --container etcd etcdctl
    
  7. 将快照文件和 etcdctl 二进制文件存储在集群外部且不依赖于集群操作的位置。

将 PKI 证书归档

要备份的证书位于控制层面的 /etc/kubernetes/pki 目录中。如果控制层面完全停止运行,将需要使用 PIK 证书和 etcd 存储区 snapshot.db 文件来恢复集群。以下步骤将创建一个包含 PKI 证书的 tar 文件。

  1. 使用 ssh 以根用户身份连接到集群的控制层面。

    ssh root@CONTROL_PLANE_NAME
    
  2. 在控制层面中,创建一个包含 /etc/kubernetes/pki 目录内容的 certs_backup.tar.gz 文件。

    tar -czvf certs_backup.tar.gz -C /etc/kubernetes/pki .
    

    在控制层面内创建 tar 文件会保留所有证书文件权限。

  3. 退出控制层面,然后从工作站中将包含证书的 tar 文件复制到工作站中的首选位置。

    sudo scp root@CONTROL_PLANE_NAME:certs_backup.tar.gz BACKUP_PATH
    

恢复集群

通过备份恢复集群是最后的补救手段,应在集群发生灾难性故障并且无法以任何其他方式恢复服务时使用。例如,etcd 数据损坏或 etcd pod 陷入崩溃循环。

集群恢复过程包括两个部分。首先,在控制层面上恢复 PKI 证书。然后,恢复 etcd 存储区数据。

恢复 PKI 证书

假设您已按照归档 PKI 证书中的说明设置了 PKI 证书,则以下步骤介绍了如何将证书从 tar 文件恢复到控制层面。

  1. 将 PKI 证书 tar 文件 certs_backup.tar.gz 从工作站复制到集群控制层面。

    sudo scp -r BACKUP_PATH/certs_backup.tar.gz root@CONTROL_PLANE_NAME:~/
    
  2. 使用 ssh 以根用户身份连接到集群的控制层面。

    ssh root@CONTROL_PLANE_NAME
    
  3. 从控制层面中,将 tar 文件的内容提取到 /etc/kubernetes/pki 目录。

    tar -xzvf certs_backup.tar.gz -C /etc/kubernetes/pki/
    
  4. 退出控制层面。

恢复 etcd 存储区

恢复 etcd 存储区时,具体过程取决于集群是否以高可用性 (HA) 模式运行,以及如果是,是否保留了仲裁。根据给定的集群故障场景,按照相应的指南恢复 etcd 存储区:

  • 如果故障集群未以高可用性模式运行,则按照以下步骤在控制层面上恢复 etcd 存储区。

  • 如果集群以高可用性模式运行,并且保留了仲裁,则不执行任何操作。只要保留了仲裁,则无需恢复故障集群。

  • 如果集群以高可用性模式运行,并且配额丢失,则重复上述步骤,以使每个失败成员恢复 etcd 存储空间。

如需从工作站中移除和恢复故障集群的控制层面的 etcd 存储区,请按以下步骤操作:

  1. 在控制层面的根目录中创建 /backup 目录。

    ssh root@CONTROL_PLANE_NAME "mkdir /backup"
    

    此步骤并非严格要求,但我们建议执行。以下步骤假定您已创建 /backup 目录。

  2. 将 etcd 快照文件 snapshot.dbetcdctl 二进制文件从工作站复制到集群控制层面上的 backup 目录。

    sudo scp snapshot.db root@CONTROL_PLANE_NAME:/backup
    sudo scp etcdctl root@CONTROL_PLANE_NAME:/backup
    
  3. 使用 SSH 连接到控制层面节点:

    ssh root@CONTROL_PLANE_NAME
    
  4. 将 etcd 和 kube-apiserver 静态 Pod 的清单文件从 /etc/kubernetes/manifests 目录移至 /backup 目录,停止这些 Pod。

    sudo mv /etc/kubernetes/manifests/etcd.yaml /backup/etcd.yaml
    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /backup/kube-apiserver.yaml
    
  5. 移除 etcd 数据目录。

    rm -rf /var/lib/etcd/
    
  6. 使用已保存的二进制文件运行 etcdctl 快照恢复。

    sudo chmod +x /backup/etcdctl
    sudo ETCDCTL_API=3 /backup/etcdctl \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --cert=/etc/kubernetes/pki/etcd/server.crt \
        --key=/etc/kubernetes/pki/etcd/server.key \
        --data-dir=/var/lib/etcd \
        --name=CONTROL_PLANE_NAME \
        --initial-advertise-peer-urls=https://CONTROL_PLANE_IP:2380 \
        --initial-cluster=CONTROL_PLANE_NAME=https://CONTROL_PLANE_IP:2380 \
        snapshot restore /backup/snapshot.db
    

    您可以在移动到 /backup 目录的 etcd.yaml 清单文件中找到 --name--initial-advertise-peer-urls--initial-cluster 条目。

  7. 确保重新创建了 /var/lib/etcd,并在 /var/lib/etcd/member 中创建了一个新成员。

  8. /var/lib/etcd/member 目录的所有者更改为 2003。从 Anthos clusters on Bare Metal 1.10.0 版开始,etcd 容器会以非根用户身份运行,其中 UID 和 GID 为 2003

    sudo chown -R 2003:2003 /var/lib/etcd
    
  9. 将 etcd 和 kube-apiserver 清单移回 /manifests 目录,以便静态 Pod 可以重启。

    sudo mv /backup/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
    sudo mv /backup/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
    
  10. 在 etcd 容器中运行 Bash shell:

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it \
        ETCD_POD_NAME --container etcd --namespace kube-system \
        -- bin/sh
    
    1. 使用 etcdctl 确认添加的成员正常运行。
    ETCDCTL_API=3 etcdctl --cert=/etc/kubernetes/pki/etcd/peer.crt  \
        --key=/etc/kubernetes/pki/etcd/peer.key \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --endpoints=CONTROL_PLANE_IP:2379 \
        endpoint health
    

    如果您要恢复多个失败的成员,请在恢复所有失败的成员后,在“--endpoints”字段中恢复所有恢复成员的控制层面 IP 地址。

    例如:

    ETCDCTL_API=3 etcdctl --cert=/etc/kubernetes/pki/etcd/peer.crt  \
        --key=/etc/kubernetes/pki/etcd/peer.key \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --endpoints=10.200.0.3:2379,10.200.0.4:2379,10.200.0.5:2379 \
        endpoint health
    

    如果每个端点都正常运行,您的集群应该在正常运行。

问题排查

如果您在备份或恢复过程中遇到问题,以下部分可帮助您排查问题。

如果您需要其他帮助,请与 Google 支持团队联系。

恢复期间缺少文件权限

恢复任务成功后,删除引导可能会失败,并显示类似于以下示例的错误消息:

Error: failed to restore node config files: sftp: "Failure" (SSH_FX_FAILURE)

此错误可能表示恢复所需的某些目录不可写入。

Anthos Clusters on Bare Metal 1.14 版及更高版本具有更清晰的错误消息,指出哪些目录必须是可写入。确保报告的目录可写入,并根据需要更新目录的权限。

在备份中断恢复过程后刷新 SSH 密钥

如果在执行备份后刷新 SSH 密钥,则恢复过程中与 SSH 相关的操作可能会失败。在这种情况下,新的 SSH 密钥会在恢复过程中失效。

如需解决此问题,您可以暂时重新添加原始 SSH 密钥,然后执行恢复。恢复过程完成后,您可以轮替 SSH 密钥。