为数据库服务创建备份代码库

本文档介绍了为 Google Distributed Cloud (GDC) 网闸隔离配置数据库服务 (DBS) 配置所需 BackupRepository 的步骤。此代码库必须命名为 dbs-backup-repository,是 Kubernetes 中的自定义资源,用于将 GDC 备份服务定向到与 S3 兼容的对象存储桶,以存储数据库备份。

正确设置对于为 PostgreSQL、Oracle 和 AlloyDB Omni 等 DBS 实例启用备份和恢复功能至关重要。

准备工作

在开始之前,请确保您满足以下前提条件:

  • 项目:用于托管存储桶的项目,通常名为 backups,仅限服务账号访问。
  • 访问权限:有足够的权限与管理 API 服务器交互。
    • 用户必须具有以下组织级层角色才能创建备份仓库:
      • Bucket Admin (bucket-admin)
      • Project Creator (project-creator)
      • Organization Backup Admin (organization-backup-admin)
    • 在目标项目中:
      • IAM Project Admin (project-iam-admin)
      • Bucket Object Project Viewer (project-bucket-object-viewer)
      • Bucket Object Project Admin (project-bucket-object-admin)
      • Bucket Project Admin (project-bucket-admin)
      • Secret Viewer (secret-viewer)
      • 命名空间管理员 (namespace-admin)
      • Backup Creator (backup-creator)
  • 工具:

创建对象存储区存储桶

所有后续步骤都在 Management API 服务器中执行。定义并创建 Bucket 资源。本文档的其余部分假定此存储桶的推荐名称为 dbs-backups,位于 backups 项目命名空间中。确保存储桶没有任何保留政策。

控制台

  1. 登录组织的 GDC 控制台。
  2. 确保您位于 backups 项目中。
  3. 依次前往对象存储 > 存储桶。
  4. 点击创建存储桶。
  5. 将存储桶名称设置为 dbs-backups。
  6. 将说明设置为 Bucket for DBS backups。
  7. 根据需要配置存储类别。例如 Standard。
  8. 对于安全,请确保不要设置保留政策,因为这会导致数据库及其备份被错误地保留。
  9. 点击创建。

API

  • 将以下清单应用于 Management API 服务器:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f -
<<EOF
apiVersion: object.gdc.goog/v1
kind: Bucket
metadata:
  name: dbs-backups
  namespace: backups
spec:
  description: "Bucket for DBS backups"
  storageClass: "Standard"
EOF

创建服务账号并设置权限

创建一个 ProjectServiceAccount,并向其授予访问存储桶的权限。

控制台

  1. 在 backups 项目中,前往身份和访问权限 > 服务身份。
  2. 点击创建服务身份。 系统会打开服务身份详情页面。
  3. 在服务身份名称字段中,输入 dbs-backup-sa。
  4. 点击创建。
  5. 前往身份和访问权限 > 访问权限。
  6. 在成员列表中,点击添加成员。 您会看到用户和角色页面。
  7. 在成员类型列表中选择服务身份。
  8. 在服务身份列表中,选择 dbs-backup-sa 以分配角色绑定。
  9. 在角色列表中,选择 Bucket Object Project Admin 以分配给服务身份。
  10. 点击 Add(添加)。

API

  • 将这些清单应用于 Management API 服务器:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f -
<<EOF
apiVersion: resourcemanager.gdc.goog/v1
kind: ProjectServiceAccount
metadata:
  name: dbs-backup-sa
  namespace: backups
spec: {}
EOF
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f -
<<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dbs-backups-readwrite-rolebinding
  namespace: backups
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: project-bucket-object-admin
subjects:
- kind: ServiceAccount
  name: dbs-backup-sa
  namespace: backups
EOF

确定服务账号的凭证 Secret 和存储桶详细信息

向 dbs-backup-sa 授予存储桶访问权限后,GDC 会自动在同一命名空间 backups 中创建一个包含 S3 访问凭据的 Secret。您需要使用 kubectl CLI (API) 找到此 Secret 的名称和存储桶详细信息。

  1. 设置环境变量:

    export SA_NAMESPACE="backups"
    export SA_NAME="dbs-backup-sa"
    export KUBECONFIG=MANAGEMENT_API_SERVER
    
  2. 查找 Secret 名称:

    export BUCKET_CRED_SECRET_NAME=$(kubectl --kubeconfig=${KUBECONFIG} get secret \
        -n "${SA_NAMESPACE}" -l object.gdc.goog/subject-type=ServiceAccount -o json | \
        jq -r --arg SA_NAME "${SA_NAME}" \
        '.items[] | select(.metadata.annotations["object.gdc.goog/subject"] == $SA_NAME and (.metadata.name |startswith("object-storage-key-std-sa-"))) | .metadata.name')
    echo "Bucket Credential Secret Name: ${BUCKET_CRED_SECRET_NAME}"
    

    此命令会过滤 backups 命名空间中的 Secret,以查找为 dbs-backup-sa 服务账号添加了注解且符合标准命名惯例的 Secret。如需运行此命令,您必须在 backups 项目中拥有 Secret Viewer (secret-viewer) 角色,或者让创建服务账号的平台管理员提供 Secret 名称。

  3. 获取存储桶端点和区域详细信息:

    export BUCKET_NAME=dbs-backups
    export FULL_BUCKET_NAME=$(kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${SA_NAMESPACE} ${BUCKET_NAME} -o jsonpath='{.status.fullyQualifiedName}')
    export ENDPOINT=$(kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${SA_NAMESPACE} ${BUCKET_NAME} -o jsonpath='{.status.endpoint}')
    export REGION=$(kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${SA_NAMESPACE} ${BUCKET_NAME} -o jsonpath='{.status.region}')
    
    echo "FULL_BUCKET_NAME: ${FULL_BUCKET_NAME}"
    echo "ENDPOINT: ${ENDPOINT}"
    echo "REGION: ${REGION}"
    

创建 BackupRepository

创建 BackupRepository 资源,引用上一部分确定服务账号的凭据 Secret 和存储桶详细信息中确定的 Secret。此步骤必须使用 kubectl CLI (API) 完成。

  • 创建 YAML 文件(例如 backup-repo.yaml),并替换上一部分中找到的变量:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f -
    <<EOF
    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: dbs-backup-repository # This specific name is required for DBS
    spec:
      secretReference:
        namespace: "backups" # Namespace of the Service Account and the auto-generated secret
        name: BUCKET_CRED_SECRET_NAME
      endpoint: ENDPOINT
      type: "S3"
      s3Options:
        bucket: FULL_BUCKET_NAME
        region: REGION
        forcePathStyle: true
      importPolicy: "ReadWrite"
      force: true
      EOF
    

    替换以下内容:

    • BUCKET_CRED_SECRET_NAME:Secret 名称。
    • ENDPOINT:存储桶的端点。
    • FULL_BUCKET_NAME:完全限定的存储桶名称。
    • REGION:存储桶的区域。

验证备份仓库

检查代码库状态,确保其设置正确。

  1. 输出备份仓库的信息:

    kubectl --kubeconfig MANAGEMENT_API_SERVER get backuprepository dbs-backup-repository -ojson | jq .status
    
  2. 验证您的输出是否与以下内容类似。NoError 消息表示代码库已按预期设置:

    NAME                    TYPE   POLICY      ERROR
    dbs-backup-repository   S3     ReadWrite   NoError
    status:
      conditions:
      - lastTransitionTime: "2025-11-13T00:36:09Z"
        message: Backup Repository reconciled successfully
        reason: Ready
        status: "True"
        type: Ready
      initialImportDone: true
      reconciliationError: NoError
      sentinelEtag: 9b82fbb7-6ea2-444d-8878-ab91397ae961