本文档介绍了为 Google Distributed Cloud (GDC) 气隙数据库服务 (DBS) 配置所需 BackupRepository 的步骤。此代码库必须命名为 dbs-backup-repository,是 Kubernetes 中的一种自定义资源,用于将 GDC 备份服务定向到与 S3 兼容的对象存储桶,以存储数据库备份。
正确设置对于为 PostgreSQL、Oracle 和 AlloyDB Omni 等数据库实例启用备份和恢复功能至关重要。
准备工作
在开始之前,请确保满足以下前提条件:
- 项目:用于托管存储桶的项目,通常名为
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。 - 点击创建。
- 前往身份和访问权限 > 访问权限。
- 在成员列表中,点击添加成员。 系统会显示用户和角色页面。
- 在成员类型列表中,选择服务身份。
- 在服务身份列表中,选择
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: 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。您需要找到此 Secret 的名称。
控制台
- 查找 Secret 名称:
- 在
backups项目中,依次前往 Kubernetes Engine > 配置 > Secret。 - 找到以
object-storage-key-std-sa-开头的密钥,并检查注释以确认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