为双区域存储分区设置备份仓库

本页面介绍了如何为 Google Distributed Cloud (GDC) 气隙式双区域存储分区配置备份代码库。这样一来,您就可以在可用区发生故障时最大限度地减少停机时间,同时保持关键数据和应用的高可用性。本页介绍了创建双可用区存储桶、复制存储桶密钥以及在多个可用区中设置备份代码库的步骤。

本页面适用于平台管理员群组中的 IT 管理员(负责管理组织内的资源)和应用运维人员群组中的应用开发者(负责在 GDC 世界中开发和维护应用)。

如需了解详情,请参阅 GDC 气隙环境受众群体文档

准备工作

在使用 GDC 双区域存储分区的备份和恢复服务之前,您必须具备以下条件:

  • 预配了至少两个可用区的环境。
  • 访问全局组织客户端或全局根客户端。
    • 如果您的工作负载是在项目内预配的,请使用全局组织客户端。
    • 如果工作负载是在根级预配的,请使用全局根客户端。
  • 创建双区域存储分区所需的 global-project-bucket-admin 角色。

创建双可用区存储桶

如需创建双区域存储桶,您首先需要创建一个项目资源,以便存储桶驻留在其中。如需创建项目,请按以下步骤操作:

  1. 在全局组织集群中创建项目资源:

    apiVersion: resourcemanager.global.gdc.goog/v1
    kind: Project
    metadata:
      namespace: platform
      name: PROJECT_NAME
      labels:
        object.gdc.goog/tenant-category: user
    

    替换以下内容:

    • PROJECT_NAME:项目的名称。
  2. 创建双可用区存储桶:

    apiVersion: object.global.gdc.goog/v1
    kind: Bucket
    metadata:
      name: BUCKET_NAME
      namespace: PROJECT_NAME
    spec:
      location: LOCATION_TYPE
      description: DESCRIPTION
      storageClass: Standard
    

    替换以下内容:

    • BUCKET_NAME:相应存储桶的名称。
    • LOCATION_TYPE:复制类型。对于同步复制,该值为 syncz1z2。对于异步复制,该值为 asyncz1z2
    • DESCRIPTION:存储桶的文本说明。
  3. 创建服务账号和 Identity and Access Management (IAM) 角色绑定,以授予存储桶所需的权限:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: BUCKET_NAME-sa
      namespace: PROJECT_NAME
    ---
    apiVersion: iam.global.gdc.goog/v1
    kind: IAMRoleBinding
    metadata:
      namespace: PROJECT_NAME
      name: BUCKET_NAME-admin-binding
    spec:
      roleRef:
        apiGroup: iam.global.gdc.goog
        kind: IAMRole
        name: project-bucket-object-admin
      subjects:
        - kind: ServiceAccount
          name: BUCKET_NAME-sa
          namespace: PROJECT_NAME
    
  4. 等待存储桶状态显示为 ready

将相应 Secret 复制到两个地区

配置好存储桶和所需权限后,系统会在全局组织集群中生成一个密钥,该密钥可通过其注释进行识别。

  1. 检查是否已生成带有存储桶注解的 Secret:

    export BUCKET_SECRET=$(kubectl get secret -n PROJECT_NAME -o jsonpath="{range .items[*]}{.metadata.name}{':'}{.metadata.annotations['object\.gdc\.goog/subject']}{'\n'}{end}" | grep :BUCKET_NAME | cut -f1 -d :)
    
  2. 检索密钥内容:

    kubectl get secret -n PROJECT_NAME BUCKET_SECRET -o yaml > bucket_secret.yaml
    
  3. 在组织的管理集群中,于可用区 1 和可用区 2 中创建相同的 Secret。请务必从 YAML 文件中清除 resourceVersionuidcreationTimeStamp,以防止出现创建错误:

    # zone-1
    kubectl apply -f bucket_secret.yaml
    
    # zone-2
    kubectl apply -f bucket_secret.yaml
    

创建备份代码库

配置好存储桶和密钥后,在可用区 1 和可用区 2 中创建备份仓库。

  1. 如需获取存储桶详细信息(例如 FQDN 和端点),请在全局组织集群中使用以下命令。从输出结果中提取 fullyQualifiedNamezonalEndpoints

    kubectl get buckets.object.global.gdc.goog -n PROJECT_NAME BUCKET_NAME -o yaml
    
  2. 如需在管理集群的 zone-1 中创建读写备份代码库,请使用以下命令。请务必使用可用区 1 的可用区级端点:

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      annotations:
        backup.gdc.goog/dz-bucket: "true"
        backup.gdc.goog/dz-bucket-info-namespace: PROJECT_NAME
      finalizers:
      - backup.gdc.goog/sentinel-finalizer
      generation: 1
      name: BACKUP_REPOSITORY_NAME
    spec:
      endpoint: ENDPOINT
      force: false
      importPolicy: ReadWrite
      s3Options:
        bucket: BUCKET_FULL_NAME
        forcePathStyle: true
        region: zone2
      secretReference:
        name: BUCKET_SECRET
        namespace: PROJECT_NAME
      type: S3
    

    替换以下内容:

    • BACKUP_REPOSITORY_NAME:备份代码库的名称。
    • ENDPOINT:可用区 1 的可用区级端点。
    • BUCKET_FULL_NAME:完全限定存储桶的名称。
    • BUCKET_SECRET:相应存储桶的密钥。
  3. 检查备份代码库是否已成功创建:

    kubectl get backuprepositories.backup.gdc.goog BACKUP_REPOSITORY_NAME
    
  4. 使用双可用区存储桶注释为备份仓库添加注释:

    kubectl -n PROJECT_NAME annotate --overwrite backuprepositories.backup.gdc.goog BACKUP_REPOSITORY_NAME backup.gdc.goog/dz-bucket="true"
    
    kubectl -n PROJECT_NAME annotate --overwrite backuprepositories.backup.gdc.goog BACKUP_REPOSITORY_NAME backup.gdc.goog/dz-bucket-info-namespace=PROJECT_NAME
    
  5. 在管理集群的可用区 2 中创建只读代码库。在此命令中使用可用区 2 的地区端点:

    apiVersion: backup.gdc.goog/v1
    kind: ClusterBackupRepository
    metadata:
      annotations:
        backup.gdc.goog/dz-bucket: "true"
        backup.gdc.goog/dz-bucket-info-namespace: PROJECT_NAME
      finalizers:
      - backup.gdc.goog/sentinel-finalizer
      generation: 1
      name: BACKUP_REPOSITORY_NAME
    spec:
      endpoint: ENDPOINT
      force: false
      importPolicy: ReadOnly
      s3Options:
        bucket: BUCKET_FULL_NAME
        forcePathStyle: true
        region: zone2
      secretReference:
        name: BUCKET_SECRET
        namespace: PROJECT_NAME
      type: S3
    
  6. 检查备份代码库是否已成功创建:

    kubectl get backuprepositories.backup.gdc.goog BACKUP_REPOSITORY_NAME
    
  7. 使用以下注解为底层备份代码库资源添加注解:

    kubectl -n PROJECT_NAME annotate --overwrite backuprepositories.backup.gdc.goog BACKUP_REPOSITORY_NAME backup.gdc.goog/dz-bucket="true"
    
    kubectl -n PROJECT_NAME annotate --overwrite backuprepositories.backup.gdc.goog BACKUP_REPOSITORY_NAME backup.gdc.goog/dz-bucket-info-namespace=PROJECT_NAME
    

将工作负载备份到备份代码库

配置备份存储库后,请按照步骤备份和恢复工作负载

后续步骤