데이터베이스 서비스의 백업 저장소 만들기

이 문서에서는 Google Distributed Cloud (GDC) 에어 갭 데이터베이스 서비스 (DBS)에 필요한 BackupRepository를 구성하는 단계를 설명합니다. 이 저장소는 반드시 dbs-backup-repository로 이름이 지정되어야 하며, GDC 백업 서비스를 데이터베이스 백업을 저장하기 위한 S3 호환 객체 스토리지 버킷으로 안내하는 Kubernetes 내의 커스텀 리소스입니다.

PostgreSQL, Oracle, AlloyDB Omni와 같은 DBS 인스턴스의 백업 및 복원 기능을 사용 설정하려면 올바른 설정이 중요합니다.

시작하기 전에

시작하기 전에 다음 기본 요건을 충족하는지 확인하세요.

  • 프로젝트: 버킷을 호스팅하는 프로젝트로, 일반적으로 이름이 backups이며 서비스 계정 액세스 권한만 있습니다.
  • 액세스: 관리 API 서버와 상호작용할 수 있는 충분한 권한이 있어야 합니다.
    • 백업 저장소를 만들려면 사용자에게 다음과 같은 조직 수준 역할이 있어야 합니다.
      • 버킷 관리자 (bucket-admin)
      • 프로젝트 생성자(project-creator)
      • 조직 백업 관리자 (organization-backup-admin)
    • 대상 프로젝트 내:
      • IAM 프로젝트 관리자 (project-iam-admin)
      • 버킷 객체 프로젝트 뷰어 (project-bucket-object-viewer)
      • 버킷 객체 프로젝트 관리자 (project-bucket-object-admin)
      • 버킷 프로젝트 관리자 (project-bucket-admin)
      • 보안 비밀 뷰어 (secret-viewer)
      • 네임스페이스 관리자 (namespace-admin)
      • 백업 생성자 (backup-creator)
  • 도구:

객체 스토리지 버킷 만들기

모든 후속 단계는 Management API 서버에서 수행됩니다. Bucket 리소스를 정의하고 만듭니다. 이 스토리지 버킷의 권장 이름 dbs-backups은 이 문서의 나머지 부분에서 backups 프로젝트 네임스페이스 내에 있는 것으로 가정합니다. 버킷에 보관 정책이 없는지 확인합니다.

콘솔

  1. 조직의 GDC 콘솔에 로그인합니다.
  2. backups 프로젝트에 있는지 확인합니다.
  3. 객체 스토리지 > 버킷으로 이동합니다.
  4. 버킷 만들기를 클릭합니다.
  5. 버킷 이름을 dbs-backups으로 설정합니다.
  6. 설명을 Bucket for DBS backups로 설정합니다.
  7. 필요에 따라 스토리지 클래스를 구성합니다. 예를 들면 Standard입니다.
  8. 보안의 경우 보관 정책을 설정하지 않아야 합니다. 설정하면 데이터베이스와 백업이 잘못 보관됩니다.
  9. 만들기를 클릭합니다.

API

  • Management 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를 만들고 버킷에 액세스할 수 있는 권한을 부여합니다.

콘솔

  1. backups 프로젝트에서 ID 및 액세스 > 서비스 ID로 이동합니다.
  2. 서비스 ID 만들기를 클릭합니다. 서비스 ID 세부정보 페이지가 열립니다.
  3. 서비스 ID 이름 필드에 dbs-backup-sa를 입력합니다.
  4. 만들기를 클릭합니다.
  5. ID 및 액세스 > 액세스로 이동합니다.
  6. 구성원 목록에서 구성원 추가를 클릭합니다. 사용자 및 역할 페이지가 표시됩니다.
  7. 구성원 유형 목록에서 서비스 ID를 선택합니다.
  8. 서비스 ID 목록에서 dbs-backup-sa를 선택하여 역할 바인딩을 할당합니다.
  9. 역할 목록에서 서비스 ID에 할당할 버킷 객체 프로젝트 관리자를 선택합니다.
  10. 추가를 클릭합니다.

API

  • 이러한 매니페스트를 Management 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

서비스 계정의 사용자 인증 정보 보안 비밀 및 버킷 세부정보 식별

dbs-backup-sa에 버킷 액세스 권한을 부여하면 GDC는 S3 액세스 사용자 인증 정보가 포함된 보안 비밀을 동일한 네임스페이스인 backups에 자동으로 만듭니다. kubectl CLI (API)를 사용하여 이 보안 비밀의 이름과 버킷 세부정보를 찾아야 합니다.

  1. 환경 변수를 설정합니다.

    export SA_NAMESPACE="backups"
    export SA_NAME="dbs-backup-sa"
    export KUBECONFIG=MANAGEMENT_API_SERVER
    
  2. 보안 비밀 이름을 찾습니다.

    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 네임스페이스의 보안 비밀을 필터링하여 dbs-backup-sa 서비스 계정에 주석이 추가되고 표준 이름 지정 규칙과 일치하는 보안 비밀을 찾습니다. 이 명령어를 실행하려면 backups 프로젝트의 보안 비밀 뷰어 (secret-viewer) 역할이 있거나 서비스 계정을 만든 플랫폼 관리자에게 보안 비밀 이름을 제공해 달라고 요청해야 합니다.

  3. 버킷 엔드포인트 및 리전 세부정보를 가져옵니다.

    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)를 사용하여 완료해야 합니다.

  • 이전 섹션에서 찾은 변수를 대체하여 backup-repo.yaml과 같은 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: 보안 비밀 이름입니다.
    • ENDPOINT: 버킷의 엔드포인트입니다.
    • FULL_BUCKET_NAME: 정규화된 버킷 이름입니다.
    • REGION: 버킷의 리전입니다.

백업 저장소 확인

저장소 상태를 확인하여 올바르게 설정되었는지 확인합니다.

  1. 백업 저장소의 정보를 출력합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER get backuprepository dbs-backup-repository -ojson | jq .status
    
  2. 출력이 다음과 비슷하게 표시되는지 확인합니다. 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