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

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

正確設定是啟用 DBS 執行個體 (例如 PostgreSQL、Oracle 和 AlloyDB Omni) 備份和還原功能的關鍵。

事前準備

開始之前,請先確認下列事項:

  • 專案:用於代管值區的專案,通常命名為 database-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)
      • 命名空間管理員 (namespace-admin)
      • 備份建立者 (backup-creator)
  • 工具:

建立物件儲存空間值區

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

控制台

  1. 登入機構的 GDC 控制台。
  2. 確認您位於 backups 專案中。
  3. 依序前往「物件儲存空間」>「值區」。
  4. 按一下「建立值區」
  5. 將 bucket 名稱設為 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,並授予存取 bucket 的權限。

控制台

  1. backups 專案中,依序前往「身分與存取權」>「服務帳戶」
  2. 按一下「建立服務帳戶」,並將其命名為 dbs-backup-sa
  3. 授予權限:
    1. 依序前往「Object Storage」>「Buckets」>「dbs-backups」>「Permissions」。
    2. 按一下「Add principal」(新增主體)
    3. 選取服務帳戶:dbs-backup-sa
    4. 選取角色:授予物件讀取和寫入存取權的角色,例如「Storage 物件管理員」
    5. 按一下「新增」。

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

找出服務帳戶的憑證密碼和 bucket 詳細資料

將值區存取權授予 dbs-backup-sa 後,GDC 會在相同命名空間 backups 中自動建立密鑰,內含 S3 存取憑證。您需要找出這個密鑰的名稱。

控制台

  1. 找出密鑰名稱:
    1. backups 專案中,依序前往「Kubernetes Engine」 >「Configuration」 >「Secrets」
    2. 找出以 object-storage-key-std-sa- 開頭的密碼,並檢查註解,確認 object.gdc.goog/subjectdbs-backup-sa
    3. 請記下這個密鑰名稱。
  2. 找出 bucket 詳細資料:
    1. 依序前往「物件儲存空間」 >「buckets」 >「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 命名空間中的密鑰,找出已註解 dbs-backup-sa 且符合標準命名慣例的密鑰。

  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 資源,並參照上一節「找出服務帳戶的憑證密鑰和 bucket 詳細資料」中識別的密鑰。您必須使用 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:密鑰名稱。
    • ENDPOINT:值區的端點。
    • FULL_BUCKET_NAME":完整 bucket 名稱。
    • 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