本文档介绍了为 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)
- Bucket 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)
- Project IAM Admin (
- 用户必须拥有以下组织级角色才能创建备份存储库:
- 工具:
- GDC 控制台。
- 已配置 kubectl CLI 以访问管理 API 服务器。
创建对象存储桶
后续所有步骤都在管理 API 服务器中执行。定义并创建 Bucket 资源。本文档的其余部分将假定此存储桶的建议名称为 dbs-backups,位于 backups 项目命名空间内。确保相应存储桶没有任何保留政策。
控制台
- 登录组织的 GDC 控制台。
- 确保您位于
backups项目中。 - 依次前往对象存储 > 存储分区。
- 点击创建存储桶。
- 将存储桶名称设置为
dbs-backups。 - 将说明设置为
Bucket for DBS backups。 - 根据需要配置存储类。例如
Standard。 - 对于安全性,请确保您未设置保留政策,因为这会导致数据库及其备份被错误地保留。
- 点击创建。
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 并授予其访问相应存储桶的权限。
控制台
- 在
backups项目中,依次前往身份和访问权限 > 服务账号。 - 点击创建服务账号,并将其命名为
dbs-backup-sa。 - 授予权限:
- 依次前往 Object Storage > 存储分区 > dbs-backups > 权限。
- 点击添加主账号。
- 选择服务账号:
dbs-backup-sa。 - 选择角色:授予对象读取和写入权限的角色,例如 Storage Object Admin。
- 点击 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 的名称。
控制台
- 查找 Secret 名称:
- 在
backups项目中,依次前往 Kubernetes Engine > 配置 > Secret。 - 找到以
object-storage-key-std-sa-开头的 Secret,然后检查注释以确认object.gdc.goog/subject为dbs-backup-sa。 - 记下此 Secret 名称。
- 在
- 查找存储桶详细信息:
- 依次前往对象存储 > 存储分区 > dbs-backups 详情页面。
- 找到并记下
ENDPOINT、REGION和FULL_BUCKET_NAME。
API
设置环境变量:
export SA_NAMESPACE="backups" export SA_NAME="dbs-backup-sa" export KUBECONFIG=MANAGEMENT_API_SERVER查找密钥名称:
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。获取存储桶端点和区域详细信息:
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:相应存储桶的区域。
验证备份
检查代码库状态,确保代码库已正确设置。
打印备份存储库的信息:
kubectl --kubeconfig MANAGEMENT_API_SERVER get backuprepository dbs-backup-repository -ojson | jq .status验证输出内容是否与以下内容类似。
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