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

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

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

准备工作

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

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

创建对象存储桶

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

控制台

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

API

  • 将以下清单应用于管理 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. 点击创建服务账号,并将其命名为 dbs-backup-sa
  3. 授予权限:
    1. 依次前往 Object Storage > 存储分区 > dbs-backups > 权限
    2. 点击添加主账号
    3. 选择服务账号:dbs-backup-sa
    4. 选择角色:授予对象读取和写入权限的角色,例如 Storage Object Admin
    5. 点击 Add(添加)。

API

  • 将这些清单应用到管理 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: Role
metadata:
  name: dbs-backups-readwrite-role
  namespace: backups
rules:
- apiGroups: ["object.gdc.goog"]
  resources: ["bucket"]
  resourceNames: ["dbs-backups"]
  verbs: ["read-object", "write-object"]
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: dbs-backups-readwrite-role
subjects:
- kind: ServiceAccount
  name: dbs-backup-sa
  namespace: backups
EOF

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

dbs-backup-sa 授予存储桶访问权限后,GDC 会自动在同一命名空间 backups 中创建一个包含 S3 访问凭据的 Secret。您需要找到此 Secret 的名称。

控制台

  1. 查找 Secret 名称:
    1. backups 项目中,依次前往 Kubernetes Engine > 配置 > Secret
    2. 找到以 object-storage-key-std-sa- 开头的 Secret,然后检查注释以确认 object.gdc.goog/subjectdbs-backup-sa
    3. 记下此 Secret 名称。
  2. 查找存储桶详细信息:
    1. 依次前往对象存储 > 存储分区 > dbs-backups 详情页面。
    2. 找到并记下 ENDPOINTREGIONFULL_BUCKET_NAME

API

  1. 设置环境变量:

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

    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。

  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 资源,引用上一部分(确定服务账号的凭据密文和存储桶详细信息)中确定的密文。必须使用 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