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

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

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

시작하기 전에

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

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

객체 스토리지 버킷 만들기

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

콘솔

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

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

콘솔

  1. backups 프로젝트에서 ID 및 액세스 > 서비스 계정으로 이동합니다.
  2. 서비스 계정 만들기를 클릭하고 dbs-backup-sa로 이름을 지정합니다.
  3. 권한 부여:
    1. 객체 스토리지 > 버킷 > dbs-backups > 권한으로 이동합니다.
    2. 주 구성원 추가를 클릭합니다.
    3. 서비스 계정(dbs-backup-sa)을 선택합니다.
    4. 역할 선택: 객체 읽기 및 쓰기 액세스 권한을 부여하는 역할(예: 스토리지 객체 관리자)
    5. 추가를 클릭합니다.

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: 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

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

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

콘솔

  1. 보안 비밀 이름을 찾습니다.
    1. backups 프로젝트에서 Kubernetes Engine > 구성 > 보안 비밀로 이동합니다.
    2. object-storage-key-std-sa-로 시작하는 보안 비밀을 찾아 주석을 확인하여 object.gdc.goog/subjectdbs-backup-sa인지 확인합니다.
    3. 이 보안 비밀 이름을 기록해 둡니다.
  2. 버킷 세부정보를 찾습니다.
    1. 객체 스토리지 > 버킷 > dbs-backups 세부정보 페이지로 이동합니다.
    2. ENDPOINT, REGION, FULL_BUCKET_NAME를 찾아 기록해 둡니다.

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에 대해 주석이 지정되고 표준 명명 규칙과 일치하는 보안 비밀을 찾습니다.

  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