Crie um repositório de cópias de segurança para o serviço de base de dados

Este documento descreve os passos para configurar os pré-requisitos necessários BackupRepository para o serviço de base de dados (DBS) isolado do Google Distributed Cloud (GDC). Este repositório, denominado obrigatoriamente dbs-backup-repository, é um recurso personalizado no Kubernetes que direciona o serviço de cópia de segurança do GDC para um contentor de armazenamento de objetos compatível com o S3 para armazenar cópias de segurança da base de dados.

A configuração adequada é fundamental para ativar as funcionalidades de cópia de segurança e restauro para instâncias de DBS, como PostgreSQL, Oracle e AlloyDB Omni.

Antes de começar

Antes de começar, certifique-se de que tem os seguintes pré-requisitos:

  • Projeto: um projeto para alojar o contentor, normalmente denominado database-backups, com acesso apenas à conta de serviço.
  • Acesso: autorizações suficientes para interagir com o servidor da API de gestão.
    • O utilizador tem de ter as seguintes funções ao nível da organização para criar o repositório de cópias de segurança:
      • Administrador do contentor (bucket-admin)
      • Criador do projeto (project-creator)
      • Administrador da cópia de segurança da organização (organization-backup-admin)
    • No projeto de destino:
      • Administrador de IAM do projeto (project-iam-admin)
      • Project Bucket Object Viewer (project-bucket-object-viewer)
      • Administrador de objetos do contentor do projeto (project-bucket-object-admin)
      • Administrador do contentor de projetos (project-bucket-admin)
      • Administrador do espaço de nomes (namespace-admin)
      • Criador da cópia de segurança (backup-creator)
  • Ferramentas:

Crie um contentor de armazenamento de objetos

Todos os passos seguintes são realizados no servidor da API de gestão. Defina e crie um recurso Bucket. O nome recomendado dbs-backups para este contentor de armazenamento é assumido para o resto deste documento, localizado no espaço de nomes do projeto backups. Certifique-se de que o contentor não tem nenhuma política de retenção.

Consola

  1. Inicie sessão na consola do GDC para a organização.
  2. Certifique-se de que está no projeto backups.
  3. Navegue para Object Storage > Recipientes.
  4. Clique em Criar contentor.
  5. Defina o nome do contentor como dbs-backups.
  6. Definir a descrição como Bucket for DBS backups.
  7. Configure a classe de armazenamento conforme necessário. Por exemplo, Standard.
  8. Para segurança, certifique-se de que não define uma política de retenção, uma vez que isto fará com que as bases de dados e as respetivas cópias de segurança sejam retidas incorretamente.
  9. Clique em Criar.

API

  • Aplique o seguinte manifesto ao servidor da API de gestão:
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

Crie uma conta de serviço e defina autorizações

Crie um ProjectServiceAccount e conceda-lhe autorizações para aceder ao contentor.

Consola

  1. No projeto backups, navegue para Identidade e acesso > Contas de serviço.
  2. Clique em Criar conta de serviço e atribua-lhe o nome dbs-backup-sa.
  3. Conceda autorizações:
    1. Aceda a Object Storage > Buckets > dbs-backups > Autorizações.
    2. Clique em Adicionar principal.
    3. Selecione a conta do serviço: dbs-backup-sa.
    4. Função selecionada: uma função que concede acesso de leitura e escrita a objetos, como Administrador de objetos de armazenamento.
    5. Clique em Adicionar.

API

  • Aplique estes manifestos ao servidor da API de gestão:
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

Identifique o segredo da credencial e os detalhes do contentor da conta de serviço

Após conceder acesso ao contentor ao dbs-backup-sa, o GDC cria automaticamente um segredo no mesmo espaço de nomes, backups, que contém as credenciais de acesso ao S3. Tem de encontrar o nome deste segredo.

Consola

  1. Encontre o nome do segredo:
    1. Navegue para Kubernetes Engine > Configuração > Secrets no projeto backups.
    2. Procure um segredo que comece por object-storage-key-std-sa- e verifique as anotações para confirmar que o object.gdc.goog/subject é dbs-backup-sa.
    3. Tome nota deste nome do segredo.
  2. Encontre os detalhes do depósito:
    1. Navegue para Object Storage > Recipientes > página de detalhes dbs-backups.
    2. Encontre e anote o ENDPOINT, o REGION e o FULL_BUCKET_NAME.

API

  1. Defina variáveis de ambiente:

    export SA_NAMESPACE="backups"
    export SA_NAME="dbs-backup-sa"
    export KUBECONFIG=MANAGEMENT_API_SERVER
    
  2. Encontre o nome do segredo:

    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 os segredos no espaço de nomes backups para encontrar o anotado para dbs-backup-sa e que corresponde à convenção de nomenclatura padrão.

  3. Obtenha detalhes do ponto final e da região do contentor:

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

Crie o BackupRepository

Crie o recurso BackupRepository, referindo-se ao segredo identificado na secção anterior, Identifique o segredo das credenciais e os detalhes do contentor da conta de serviço. Este passo tem de ser concluído através da CLI kubectl (API).

  • Crie o ficheiro YAML, como backup-repo.yaml, substituindo as variáveis encontradas na secção 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
    

    Substitua o seguinte:

    • BUCKET_CRED_SECRET_NAME: o nome do segredo.
    • ENDPOINT: o ponto final do contentor.
    • FULL_BUCKET_NAME": o nome do contentor totalmente qualificado.
    • REGION: a região do contentor.

Valide a cópia de segurança

Verifique o estado do repositório para garantir que foi configurado corretamente.

  1. Imprima as informações do repositório de cópias de segurança:

    kubectl --kubeconfig MANAGEMENT_API_SERVER get backuprepository dbs-backup-repository -ojson | jq .status
    
  2. Verifique se a saída é semelhante à seguinte. Uma mensagem NoError é o sinal de que o repositório foi configurado conforme esperado:

    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