Crea un repositorio de copias de seguridad para el servicio de bases de datos

En este documento, se describen los pasos para configurar el BackupRepository requerido para el servicio de base de datos (DBS) de Google Distributed Cloud (GDC) aislado. Este repositorio, que debe llamarse dbs-backup-repository, es un recurso personalizado dentro de Kubernetes que dirige el servicio de copia de seguridad de GDC a un bucket de almacén de objetos compatible con S3 para almacenar copias de seguridad de la base de datos.

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

Antes de comenzar

Antes de comenzar, asegúrate de cumplir con los siguientes requisitos:

  • Proyecto: Un proyecto para alojar el bucket, que suele llamarse backups, con acceso solo a la cuenta de servicio.
  • Acceso: Permisos suficientes para interactuar con el servidor de la API de administración.
    • El usuario debe tener los siguientes roles a nivel de la organización para crear el repositorio de copias de seguridad:
      • Administrador de buckets (bucket-admin)
      • Creador del proyecto (project-creator)
      • Administrador de copias de seguridad de la organización (organization-backup-admin)
    • Dentro del proyecto de destino:
      • Administrador de IAM del proyecto (project-iam-admin)
      • Visualizador de proyectos de objetos de bucket (project-bucket-object-viewer)
      • Administrador de proyectos de objetos de bucket (project-bucket-object-admin)
      • Administrador de proyectos de buckets (project-bucket-admin)
      • Visualizador de secretos (secret-viewer)
      • Administrador de espacios de nombres (namespace-admin)
      • Creador de copias de seguridad (backup-creator)
  • Herramientas:

Crea un bucket de almacenamiento de objetos

Todos los pasos siguientes se realizan en el servidor de la API de administración. Define y crea un recurso Bucket. Se asume el nombre recomendado dbs-backups para este bucket de almacenamiento durante el resto de este documento, ubicado dentro del espacio de nombres del proyecto backups. Asegúrate de que el bucket no tenga ninguna política de retención.

Console

  1. Accede a la consola de GDC de la organización.
  2. Asegúrate de estar en el proyecto backups.
  3. Navega a Almacén de objetos > Buckets.
  4. Haz clic en Crear bucket.
  5. Establece el nombre del bucket como dbs-backups.
  6. Establece 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 establecer una política de retención, ya que esto hará que las bases de datos y sus copias de seguridad se retengan de forma errónea.
  9. Haz clic en Crear.

API

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

Crea una cuenta de servicio y configura los permisos

Crea una ProjectServiceAccount y otórgale permisos para acceder al bucket.

Console

  1. En el proyecto backups, navega a Identidad y acceso > Identidades de servicio.
  2. Haz clic en Crear identidad de servicio. Se abrirá la página Detalles de la identidad del servicio.
  3. En el campo Nombre de la identidad del servicio, ingresa dbs-backup-sa.
  4. Haz clic en Crear.
  5. Ve a Identidad y acceso > Acceso.
  6. En la lista Miembro, haz clic en Agregar miembro. Verás la página Usuarios y roles.
  7. Selecciona Identidad de servicio en la lista Tipo de miembro.
  8. En la lista Identidad de servicio, selecciona dbs-backup-sa para asignar una vinculación de rol.
  9. En la lista Rol, selecciona Administrador de proyectos de objetos de bucket para asignarlo a la identidad de servicio.
  10. Haz clic en Agregar.

API

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

Identifica el secreto de credenciales de la cuenta de servicio y los detalles del bucket

Cuando se otorga acceso al bucket al dbs-backup-sa, GDC crea automáticamente un Secret en el mismo espacio de nombres, backups, que contiene las credenciales de acceso de S3. Debes encontrar el nombre de este Secret y los detalles del bucket con la CLI (API) de kubectl.

  1. Establece las variables de entorno:

    export SA_NAMESPACE="backups"
    export SA_NAME="dbs-backup-sa"
    export KUBECONFIG=MANAGEMENT_API_SERVER
    
  2. Busca el nombre del 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}"
    

    Este comando filtra los Secrets en el espacio de nombres backups para encontrar el que tiene la anotación de la cuenta de servicio dbs-backup-sa y que coincide con la convención de nombres estándar. Para ejecutar este comando, debes tener el rol de visualizador de secretos (secret-viewer) en el proyecto backups o pedirle al administrador de la plataforma que creó la cuenta de servicio que proporcione el nombre del secreto.

  3. Obtén los detalles del extremo y de la región del 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}"
    

Crea el BackupRepository

Crea el recurso BackupRepository, que hace referencia al secreto identificado en la sección anterior, Identifica el secreto de credenciales de la cuenta de servicio y los detalles del bucket. Este paso se debe completar con la CLI de kubectl (API).

  • Crea el archivo YAML, como backup-repo.yaml, y sustituye 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
    

    Reemplaza lo siguiente:

    • BUCKET_CRED_SECRET_NAME: Es el nombre del Secret.
    • ENDPOINT: Es el extremo del bucket.
    • FULL_BUCKET_NAME: Es el nombre del bucket completamente calificado.
    • REGION: Es la región del bucket.

Verifica el repositorio de copias de seguridad

Verifica el estado del repositorio para asegurarte de que se haya 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. Verifica que el resultado sea similar al siguiente. Un mensaje NoError es la señal de que el repositorio se configuró como se esperaba:

    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