為資料庫服務建立備份存放區

本文說明如何為 Google Distributed Cloud (GDC) 實體隔離資料庫服務 (DBS) 設定必要的 BackupRepository。這個存放區必須命名為 dbs-backup-repository,是 Kubernetes 中的自訂資源,可將 GDC 備份服務導向與 S3 相容的物件儲存庫 bucket,用於儲存資料庫備份。

如要為 PostgreSQL、Oracle 和 AlloyDB Omni 等 DBS 執行個體啟用備份與還原功能,正確設定至關重要。

事前準備

開始前,請確認您符合下列必要條件:

  • 專案:用於託管 bucket 的專案,通常名為 backups,只有服務帳戶可以存取。
  • 存取權:具備與管理 API 伺服器互動的充足權限。
    • 使用者必須具備下列組織層級角色,才能建立備份存放區:
      • Bucket 管理員 (bucket-admin)
      • 專案建立者 (project-creator)
      • 組織備份管理員 (organization-backup-admin)
    • 在目標專案中:
      • IAM 專案管理員 (project-iam-admin)
      • Bucket 物件專案檢視者 (project-bucket-object-viewer)
      • Bucket 物件專案管理員 (project-bucket-object-admin)
      • Bucket 專案管理員 (project-bucket-admin)
      • Secret 檢視者 (secret-viewer)
      • 命名空間管理員 (namespace-admin)
      • 備份建立者 (backup-creator)
  • 工具:

建立物件儲存庫 bucket

所有後續步驟都會在 Management API 伺服器中執行。定義及建立 Bucket 資源。本文件其餘部分假設這個 Storage bucket 的建議名稱為 dbs-backups,位於 backups 專案命名空間中。確認 bucket 沒有任何資料保留政策。

控制台

  1. 登入機構的 GDC 控制台。
  2. 確認您位於 backups 專案。
  3. 依序前往「物件儲存庫」 >「bucket」。
  4. 點選「建立 bucket」。
  5. 將 bucket 命名為 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 並授予 bucket 存取權。

控制台

  1. 在 backups 專案中,依序前往「Identity & Access」>「Service identities」(服務身分)。
  2. 按一下「Create Service Identity」(建立服務身分)。「Service Identity details」(服務身分詳細資料) 頁面隨即開啟。
  3. 在「Service identity name」(服務身分名稱) 欄位中輸入 dbs-backup-sa。
  4. 點選「建立」。
  5. 依序前往「身分與存取權」>「存取權」。
  6. 在「Member」(成員) 清單中,按一下「Add member」(新增成員)。「使用者與角色」頁面隨即顯示。
  7. 在「Member type」(成員類型) 清單中,選取「Service identity」(服務身分)。
  8. 在「Service identity」(服務身分) 清單中,選取 dbs-backup-sa 來指派角色繫結。
  9. 在「Role」(角色) 清單中,選取要指派給服務身分的「Bucket Object Project Admin」(Bucket 物件專案管理員)。
  10. 按一下「新增」。

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 和 bucket 詳細資料

將 bucket 存取權授予 dbs-backup-sa 後,GDC 會自動在相同命名空間 backups 中建立密鑰,其中包含 S3 存取憑證。您需要使用 kubectl CLI (API) 找出這個 Secret 的名稱和 bucket 詳細資料。

  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 檢視者 (secret-viewer) 角色,或要求建立服務帳戶的平台管理員提供 Secret 名稱。

  3. 取得 bucket 端點和區域詳細資料:

    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 和 bucket 詳細資料」中找到的 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:bucket 的端點。
    • FULL_BUCKET_NAME:完整 bucket 名稱。
    • REGION:bucket 的區域。

驗證備份存放區

檢查存放區狀態,確認設定正確無誤。

  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