×

您可以备份和恢复 Amazon Web Services (AWS) 上托管集群上的 etcd 以修复故障。

为托管集群拍摄 etcd 快照

要备份托管集群的 etcd,必须拍摄 etcd 的快照。稍后,您可以使用该快照恢复 etcd。

此过程需要 API 停机。

步骤
  1. 通过输入以下命令暂停托管集群的协调

    $ oc patch -n clusters hostedclusters/<hosted_cluster_name> -p '{"spec":{"pausedUntil":"true"}}' --type=merge
  2. 通过输入以下命令停止所有 etcd-writer 部署

    $ oc scale deployment -n <hosted_cluster_namespace> --replicas=0 kube-apiserver openshift-apiserver openshift-oauth-apiserver
  3. 要拍摄 etcd 快照,请在每个 etcd 容器中使用 `exec` 命令,并输入以下命令

    $ oc exec -it <etcd_pod_name> -n <hosted_cluster_namespace> -- env ETCDCTL_API=3 /usr/bin/etcdctl --cacert /etc/etcd/tls/etcd-ca/ca.crt --cert /etc/etcd/tls/client/etcd-client.crt --key /etc/etcd/tls/client/etcd-client.key --endpoints=localhost:2379 snapshot save /var/lib/data/snapshot.db
  4. 要检查快照状态,请在每个 etcd 容器中使用 `exec` 命令,并运行以下命令

    $ oc exec -it <etcd_pod_name> -n <hosted_cluster_namespace> -- env ETCDCTL_API=3 /usr/bin/etcdctl -w table snapshot status /var/lib/data/snapshot.db
  5. 将快照数据复制到您可以稍后检索到的位置,例如 S3 存储桶。请参阅以下示例。

    以下示例使用签名版本 2。如果您所在的区域支持签名版本 4(例如 `us-east-2` 区域),请使用签名版本 4。否则,将快照复制到 S3 存储桶时,上传将失败。

    示例
    BUCKET_NAME=somebucket
    CLUSTER_NAME=cluster_name
    FILEPATH="/${BUCKET_NAME}/${CLUSTER_NAME}-snapshot.db"
    CONTENT_TYPE="application/x-compressed-tar"
    DATE_VALUE=`date -R`
    SIGNATURE_STRING="PUT\n\n${CONTENT_TYPE}\n${DATE_VALUE}\n${FILEPATH}"
    ACCESS_KEY=accesskey
    SECRET_KEY=secret
    SIGNATURE_HASH=`echo -en ${SIGNATURE_STRING} | openssl sha1 -hmac ${SECRET_KEY} -binary | base64`
    HOSTED_CLUSTER_NAMESPACE=hosted_cluster_namespace
    
    oc exec -it etcd-0 -n ${HOSTED_CLUSTER_NAMESPACE} -- curl -X PUT -T "/var/lib/data/snapshot.db" \
      -H "Host: ${BUCKET_NAME}.s3.amazonaws.com" \
      -H "Date: ${DATE_VALUE}" \
      -H "Content-Type: ${CONTENT_TYPE}" \
      -H "Authorization: AWS ${ACCESS_KEY}:${SIGNATURE_HASH}" \
      https://${BUCKET_NAME}.s3.amazonaws.com/${CLUSTER_NAME}-snapshot.db
  6. 要稍后在新集群上恢复快照,请保存托管集群引用的加密密钥。

    1. 通过输入以下命令获取密钥加密密钥

      $ oc get hostedcluster <hosted_cluster_name> -o=jsonpath='{.spec.secretEncryption.aescbc}'
      {"activeKey":{"name":"<hosted_cluster_name>-etcd-encryption-key"}}
    2. 通过输入以下命令保存密钥加密密钥

      $ oc get secret <hosted_cluster_name>-etcd-encryption-key -o=jsonpath='{.data.key}'

      您可以在新集群上恢复快照时解密此密钥。

  7. 通过输入以下命令重新启动所有 etcd-writer 部署

    $ oc scale deployment -n <control_plane_namespace> --replicas=3 kube-apiserver openshift-apiserver openshift-oauth-apiserver
  8. 通过输入以下命令恢复托管集群的协调

    $ oc patch -n <hosted_cluster_namespace> -p '[\{"op": "remove", "path": "/spec/pausedUntil"}]' --type=json
后续步骤

恢复 etcd 快照。

在托管集群上恢复 etcd 快照

如果您有托管集群的 etcd 快照,则可以恢复它。目前,您只能在集群创建期间恢复 etcd 快照。

要恢复 etcd 快照,请修改 `create cluster --render` 命令的输出,并在 `HostedCluster` 规范的 etcd 部分中定义 `restoreSnapshotURL` 值。

`hcp create` 命令中的 `--render` 标志不会呈现密钥。要呈现密钥,必须在 `hcp create` 命令中同时使用 `--render` 和 `--render-sensitive` 标志。

先决条件

您已在托管集群上拍摄了 etcd 快照。

步骤
  1. 在 `aws` 命令行界面 (CLI) 上,创建一个预签名 URL,以便您可以从 S3 下载 etcd 快照,而无需将凭据传递给 etcd 部署

    ETCD_SNAPSHOT=${ETCD_SNAPSHOT:-"s3://${BUCKET_NAME}/${CLUSTER_NAME}-snapshot.db"}
    ETCD_SNAPSHOT_URL=$(aws s3 presign ${ETCD_SNAPSHOT})
  2. 修改 `HostedCluster` 规范以引用该 URL

    spec:
      etcd:
        managed:
          storage:
            persistentVolume:
              size: 4Gi
            type: PersistentVolume
            restoreSnapshotURL:
            - "${ETCD_SNAPSHOT_URL}"
        managementType: Managed
  3. 确保您从 `spec.secretEncryption.aescbc` 值引用的密钥包含您在上一步中保存的相同 AES 密钥。