Crear un repositorio de copias de seguridad para Database Service

En este documento se describen los pasos para configurar los BackupRepository necesarios para el servicio de base de datos (DBS) aislado de Google Distributed Cloud (GDC). Este repositorio, cuyo nombre es obligatorio (dbs-backup-repository), es un recurso personalizado de Kubernetes que dirige el servicio de copia de seguridad de GDC a un bucket de almacenamiento de objetos compatible con S3 para almacenar copias de seguridad de bases de datos.

Una configuración adecuada es fundamental para habilitar las funciones de copia de seguridad y restauración de instancias de DBS, como PostgreSQL, Oracle y AlloyDB Omni.

Antes de empezar

Antes de empezar, asegúrate de que cumples los siguientes requisitos:

  • Proyecto: un proyecto para alojar el segmento, normalmente llamado database-backups, con acceso solo para cuentas de servicio.
  • Acceso: permisos suficientes para interactuar con el servidor de la API Management.
    • El usuario debe tener los siguientes roles a nivel de organización para crear el repositorio de copias de seguridad:
      • Administrador de segmento (bucket-admin)
      • Creador del proyecto (project-creator)
      • Administrador de copias de seguridad de la organización (organization-backup-admin)
    • En el proyecto de destino, haz lo siguiente:
      • Administrador de gestión de identidades y accesos de proyectos (project-iam-admin)
      • Lector de objetos de los contenedores de proyectos (project-bucket-object-viewer)
      • Administrador de objetos de un bucket de un proyecto (project-bucket-object-admin)
      • Administrador de cubos de proyecto (project-bucket-admin)
      • Administrador de espacios de nombres (namespace-admin)
      • Creador de copias de seguridad (backup-creator)
  • Herramientas:

Crear un segmento de almacenamiento de objetos

Todos los pasos siguientes se realizan en el servidor de la API de gestión. Define y crea un Bucket. En el resto de este documento, se da por supuesto el nombre recomendado dbs-backups para este contenedor de almacenamiento, que se encuentra en el espacio de nombres del proyecto backups. Asegúrate de que el segmento no tenga ninguna política de retención.

Consola

  1. Inicia sesión en la consola de GDC de la organización.
  2. Asegúrate de que estás en el proyecto backups.
  3. Vaya a Object Storage > Buckets.
  4. Haz clic en Crear segmento.
  5. Asigna el nombre dbs-backups al segmento.
  6. Define la descripción como Bucket for DBS backups.
  7. Configura la clase de almacenamiento según sea necesario. Por ejemplo, Standard.
  8. En Seguridad, asegúrate de no definir una política de conservación, ya que esto provocará que las bases de datos y sus copias de seguridad se conserven de forma incorrecta.
  9. Haz clic en Crear.

API

  • Aplica el siguiente manifiesto al servidor de la API Management:
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

Crear una cuenta de servicio y definir permisos

Crea un ProjectServiceAccount y concédele permisos para acceder al segmento.

Consola

  1. En el proyecto backups, ve a Identidad y acceso > Cuentas de servicio.
  2. Haz clic en Crear cuenta de servicio y asígnale el nombre dbs-backup-sa.
  3. Concede permisos:
    1. Ve a Object Storage (Almacenamiento de objetos) > Buckets (Contenedores) > dbs-backups > Permissions (Permisos).
    2. Haz clic en Añadir principal.
    3. Selecciona Cuenta de servicio: dbs-backup-sa.
    4. Selecciona un rol que conceda acceso de lectura y escritura a los objetos, como Administrador de objetos de Storage.
    5. Haz clic en Añadir.

API

  • Aplica estos manifiestos al servidor de la API de gestión:
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

Identificar el secreto de las credenciales de la cuenta de servicio y los detalles del segmento

Cuando se concede acceso al segmento a dbs-backup-sa, GDC crea automáticamente un secreto en el mismo espacio de nombres, backups, que contiene las credenciales de acceso de S3. Debes encontrar el nombre de este secreto.

Consola

  1. Busca el nombre del secreto:
    1. Vaya a Kubernetes Engine > Configuración > Secretos en el proyecto backups.
    2. Busca un secreto que empiece por object-storage-key-std-sa- y comprueba las anotaciones para confirmar que object.gdc.goog/subject es dbs-backup-sa.
    3. Anota este nombre de secreto.
  2. Busca los detalles del segmento:
    1. Vaya a Object Storage > Buckets > página de detalles de dbs-backups.
    2. Busca y anota el ENDPOINT, el REGION y el FULL_BUCKET_NAME.

API

  1. Define las variables de entorno:

    export SA_NAMESPACE="backups"
    export SA_NAME="dbs-backup-sa"
    export KUBECONFIG=MANAGEMENT_API_SERVER
    
  2. Busca el nombre secreto:

    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}"
    

    Este comando filtra los secretos del espacio de nombres backups para encontrar el que tiene la anotación dbs-backup-sa y coincide con la convención de nomenclatura estándar.

  3. Obtener los detalles del endpoint y la región de un segmento:

    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}"'
    

Crea el BackupRepository.

Crea el recurso BackupRepository haciendo referencia al secreto identificado en la sección anterior, Identifica el secreto de las credenciales de la cuenta de servicio y los detalles del segmento. Este paso debe completarse con la CLI de kubectl (API).

  • Crea el archivo YAML, como backup-repo.yaml, sustituyendo las variables que se encuentran en la sección anterior:

    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
    

    Haz los cambios siguientes:

    • BUCKET_CRED_SECRET_NAME: el nombre del secreto.
    • ENDPOINT: el endpoint del bucket.
    • FULL_BUCKET_NAME": el nombre de segmento completo.
    • REGION: la región del grupo.

Verificar la copia de seguridad

Comprueba el estado del repositorio para asegurarte de que se ha configurado correctamente.

  1. Imprime la información de tu repositorio de copias de seguridad:

    kubectl --kubeconfig MANAGEMENT_API_SERVER get backuprepository dbs-backup-repository -ojson | jq .status
    
  2. Comprueba que el resultado sea similar al siguiente. Un mensaje NoError es la señal de que el repositorio se ha configurado correctamente:

    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