비동기적으로 볼륨 복제

이 페이지에서는 Google Distributed Cloud (GDC) 에어 갭 블록 스토리지 볼륨의 비동기 복제를 설정하고 실행하는 방법을 설명합니다.

비동기 복제는 한 GDC 영역에서 다른 영역으로 데이터를 복제하는 데 사용됩니다. 소스 영역 데이터를 사용할 수 없게 되면 복제된 데이터를 장애 조치에 사용할 수 있습니다. 장애 조치가 생성되면 원래 볼륨을 동일한 대상 볼륨으로 복제할 수 없습니다. 대신 새 복제 관계를 만들어야 합니다.

시작하기 전에

비동기 블록 복제를 사용하려면 인프라 운영자 (IO)가 먼저 복제가 필요한 두 영역 간에 스토리지 인프라를 설정해야 합니다. 특히 먼저 각 영역에서 관련 스토리지 클러스터를 피어링 해야 합니다. 다음으로 블록 스토리지가 프로비저닝된 조직과 연결된 스토리지 가상 머신을 피어링해야 합니다.

그런 다음 VolumeReplicationRelationship 리소스를 관리할 수 있는 app-volume-replication-admin-global 역할이 있는지 확인합니다. 전역 API를 사용할 수 없는 경우 volume-replication-admin 역할을 사용하여 영역 VolumeReplicationRelationshipReplica 리소스를 직접 수정할 수 있습니다.

복제 설정

VolumeReplicationRelationship 커스텀 리소스 (CR)는 비동기 블록 복제 API를 제공합니다. 이 CR은 전역 관리 API에 있습니다. 특정 블록 기기의 복제를 사용 설정하려면 전역 관리 API에서 VolumeReplicationRelationship CR을 만들어야 합니다.

PVC API 복제

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: VRR_NAME
  namespace: PROJECT
spec:
  source:
    pvc:
      clusterRef: SOURCE_USER_CLUSTER_NAME
      pvcRef: PVC_NAME
    zoneRef: SOURCE_ZONE_NAME
destination:
    pvc:
      clusterRef: DESTINATION_USER_CLUSTER_NAME
    zoneRef: DESTINATION_ZONE_NAME
EOF

다음을 바꿉니다.

  • MANAGEMENT_API_SERVER: 영역 API 서버의 kubeconfig 경로입니다.
  • VRR_NAME: VolumeReplicationRelationship 리소스의 이름입니다.
  • PROJECT: 프로젝트 리소스의 네임스페이스입니다.
  • SOURCE_USER_CLUSTER_NAME: 연결할 소스 사용자 클러스터 리소스의 이름입니다.
  • PVC_NAME: PersistentVolumeClaim 리소스의 이름입니다.
  • SOURCE_ZONE_NAME: 소스 영역 리소스의 이름입니다.
  • DESTINATION_USER_CLUSTER_NAME: 연결할 도착 위치 사용자 클러스터 리소스의 이름입니다.
  • DESTINATION_ZONE_NAME: 대상 영역 리소스의 이름입니다.

이 예에서는 PROJECT라는 프로젝트가 my-org라는 조직에 생성되고 PVC_NAME라는 PVC가 이미 프로비저닝되었다고 가정합니다. SOURCE_USER_CLUSTER_NAME은 PVC가 있는 소스 클러스터의 이름이고 DESTINATION_USER_CLUSTER_NAME은 새 PVC가 있을 대상 클러스터의 이름입니다.

사양의 sourcedestination 필드는 데이터가 복제되는 소스대상을 각각 나타냅니다. 이 예에서는 데이터가 SOURCE_ZONE_NAME에서 DESTINATION_ZONE_NAME으로 복제됩니다.

가상 머신 디스크 복제

VolumeReplicationRelationship은 비동기 가상 머신 디스크 (VM 디스크) 복제 API도 제공합니다. 복제되는 소스 디스크를 기본 디스크라고 합니다. 복제되는 대상 디스크를 보조 디스크라고 합니다. 기본 디스크에서 비동기 복제를 시작하면 보조 디스크가 자동으로 생성됩니다.

권한 및 액세스 요청

가상 머신 디스크를 복제하려면 프로젝트 VirtualMachine 관리자 역할이 있어야 합니다. 단계에 따라 VM 디스크가 있는 프로젝트의 네임스페이스에 프로젝트 VirtualMachine 관리자 역할 (project-vm-admin)이 있는지 확인합니다.

gdcloud CLI를 사용하는 가상 머신 작업의 경우 프로젝트 IAM 관리자에게 프로젝트 VirtualMachine 관리자 역할과 프로젝트 뷰어 (project-viewer) 역할을 모두 할당해 달라고 요청합니다.

gdcloud

gdcloud compute disks start-async-replication PRIMARY_DISK_NAME \
  --project PROJECT --zone PRIMARY_ZONE \
  --secondary-disk SECONDARY_DISK_NAME --secondary-zone SECONDARY_ZONE

다음을 바꿉니다.

변수정의
PRIMARY_DISK_NAME 복제되는 소스 디스크의 이름입니다.
PROJECT 기본 디스크의 GDC 프로젝트입니다.
PRIMARY_ZONE 기본 디스크가 있는 영역입니다.
SECONDARY_DISK_NAME 복제할 대상 디스크의 이름입니다.
SECONDARY_ZONE 보조 디스크가 있어야 하는 영역입니다.

VM 디스크 API

비동기 복제 시작

kubectl을 사용하여 VM 디스크에서 비동기 복제를 시작합니다.

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: VRR_NAME
  namespace: PROJECT
spec:
  destination:
    volumeOverrideName: VIRTUAL_MACHINE_DESTINATION_DISK_NAME
    zoneRef: DESTINATION_ZONE_NAME
  source:
    virtualMachineDisk:
      virtualMachineDiskRef: VIRTUAL_MACHINE_SOURCE_DISK_NAME
    zoneRef: SOURCE_ZONE_NAME
EOF

다음을 바꿉니다.

  • MANAGEMENT_API_SERVER: 영역 API 서버의 kubeconfig 경로입니다.
  • VRR_NAME: VolumeReplicationRelationship 리소스의 이름입니다.
  • PROJECT: 프로젝트 리소스의 네임스페이스입니다.
  • VIRTUAL_MACHINE_DESTINATION_DISK_NAME: 대상의 VirtualMachineDisk 리소스 이름입니다.
  • DESTINATION_ZONE_NAME: 대상 영역 리소스의 이름입니다.
  • VIRTUAL_MACHINE_SOURCE_DISK_NAME: 소스의 VirtualMachineDisk 리소스 이름입니다.
  • SOURCE_ZONE_NAME: 소스 영역 리소스의 이름입니다.

이 예에서는 PROJECT라는 프로젝트가 my-org라는 조직에 생성되고 VirtualMachineDisk라는 VIRTUAL_MACHINE_SOURCE_DISK_NAME가 이미 VirtualMachine 리소스에 프로비저닝되었다고 가정합니다.

사양의 sourcedestination 필드는 데이터가 복제되는 소스대상 을 각각 나타냅니다. 이 예에서는 데이터가 SOURCE_ZONE_NAME에서 DESTINATION_ZONE_NAME으로 복제됩니다.

인증

전역 API에서 VolumeReplicationRelationship CR을 가져와 복제 관계의 상태를 확인합니다. 다음 예를 참조하세요. 출력은 간소화를 위해 잘립니다.

kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationship VRR_NAME \
        -n PROJECT -o yaml

출력은 다음과 비슷합니다.

PVC API

apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: my-pvc-repl
  namespace: my-project
spec:
  destination:
    pvc:
      clusterRef: my-pvc-cluster
    zoneRef: zone2
  source:
    pvc:
      clusterRef: my-pvc-cluster
      pvcRef: my-block-pvc
    zoneRef: zone1
status:
  zones:
  - name: zone1
    replicaStatus:
      message: SnapMirror relationship has been established. Please check the destination
        zone for relationship state
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Established
  - name: zone2
    replicaStatus:
      exportedSnapshotName: snapmirror.c34f8845-e8c0-11ef-ad24-00a0b89f23fb_2150007868.2025-02-21_150000
      message: SnapMirror relationship has been successfully established
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Idle

VM 디스크 API

apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: my-vmdisk-vrr
  namespace: my-project
spec:
  destination:
    zoneRef: zone2
  source:
    virtualMachineDisk:
      virtualMachineDiskRef: my-vmdisk
    zoneRef: zone1
status:
  zones:
  - name: zone1
    replicaStatus:
      message: SnapMirror relationship has been established. Please check the destination
        zone for relationship state
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Established
  - name: zone2
    replicaStatus:
      exportedSnapshotName: snapmirror.c34f8845-e8c0-11ef-ad24-00a0b89f23fb_2150007868.2025-02-21_150000
      message: SnapMirror relationship has been successfully established
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Idle

장애 조치 만들기

소스 영역을 어떤 이유로든 사용할 수 없는 경우 대상 영역의 조직 관리 영역에서 VolumeFailover CR을 만들 수 있습니다. v2 조직의 경우 관리 API 서버가 됩니다. v1 조직의 경우 조직 관리자 클러스터가 됩니다. 예를 들어 대상 영역으로 zone2를 지정하는 VolumeReplicationRelationship이 생성되고 my-org 조직에 PVC 또는 VirtualMachineDisk가 있는 경우 VolumeFailover CR이 zone2my-org 관리 영역에 생성됩니다. 이렇게 하면 두 영역 간의 복제 관계가 끊어지고 워크로드가 대상 영역에서 PVC 또는 VirtualMachineDisk를 마운트할 수 있습니다.

  kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
  apiVersion: storage.gdc.goog/v1
  kind: VolumeFailover
  metadata:
    name: FAILOVER_NAME
    namespace: PROJECT
  spec:
    volumeReplicationRelationshipRef: VRR_NAME
  EOF

다음을 바꿉니다.

  • FAILOVER_NAME: VolumeFailover 리소스의 이름입니다.
  • MANAGEMENT_API_SERVER: 영역 API 서버의 kubeconfig 경로입니다.
  • VRR_NAME: VolumeReplicationRelationship 리소스의 이름입니다.
  • PROJECT: 프로젝트 리소스의 네임스페이스입니다.

성공적인 장애 조치는 CR의 상태에 반영됩니다.

  kubectl --kubeconfig MANAGEMENT_API_SERVER get volumefailover FAILOVER_NAME \
          -n PROJECT -o yaml
  • 출력은 다음과 비슷합니다.

    apiVersion: storage.gdc.goog/v1
    kind: VolumeFailover
    metadata:
      name: my-failover
      namespace: my-project
    spec:
      volumeReplicationRelationshipRef: my-vrr-repl
    status:
        state: Completed
    
  • 장애 조치가 생성되면 my-vrr-repl VolumeReplicationRelationshipBroken Off 상태로 전환됩니다. 이제 zone2의 PVC 또는 VirtualMachineDisk를 마운트할 수 있습니다.

  • 이 시점에서 VolumeReplicationRelationship은 다음 예와 비슷하게 표시됩니다. 다시 말하지만, 이 출력은 간소화를 위해 잘립니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationship VRR_NAME \
            -n PROJECT -o yaml
    
  • 출력은 다음과 비슷합니다.

PVC API

apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: my-vrr-repl
  namespace: my-project
spec:
  destination:
    pvc:
      clusterRef: my-pvc-cluster
    zoneRef: zone2
  source:
    pvc:
      clusterRef: my-pvc-cluster
      pvcRef: my-block-pvc
    zoneRef: zone1
status:
  zones:
  - name: zone1
    replicaStatus:
      message: SnapMirror relationship has been broken off
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Broken Off
  - name: zone2
    replicaStatus:
      exportedSnapshotName: snapmirror.c34f8845-e8c0-11ef-ad24-00a0b89f23fb_2150007868.2025-02-21_150000
      message: SnapMirror relationship has been broken off
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Broken Off

VM 디스크 API

apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: my-vmdisk-vrr
  namespace: my-project
spec:
  destination:
    zoneRef: zone2
  source:
    virtualMachineDisk:
      virtualMachineDiskRef: my-vmdisk
    zoneRef: zone1
status:
  zones:
  - name: zone1
    replicaStatus:
      message: SnapMirror relationship has been broken off
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Broken Off
  - name: zone2
    replicaStatus:
      exportedSnapshotName: snapmirror.c34f8845-e8c0-11ef-ad24-00a0b89f23fb_2150007868.2025-02-21_150000
      message: SnapMirror relationship has been broken off
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Broken Off
  • 이제 이 CR에서 수행할 수 있는 유일한 작업이므로 VolumeReplicationRelationship을 안전하게 삭제할 수 있습니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER delete volumereplicationrelationship VRR_NAME \
            -n PROJECT
    

볼륨 크기 조절

소스 볼륨의 크기가 언제든지 조정되면 대상 영역의 해당 볼륨 크기도 일치하도록 조정해야 합니다. 대상 영역 볼륨은 VolumeReplicationRelationship을 만들 때 생성됩니다.

소스 영역과 대상 영역 모두에서 스토리지를 크기 조정하려면 VM 디스크 확장 문서 또는 볼륨 용량 확장을 참조하세요.

비동기 복제 관계 나열

kubectl을 사용하여 프로젝트의 비동기 복제 관계를 나열합니다.

kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationships -n PROJECT

다음을 바꿉니다.

  • PROJECT: 기본 디스크의 GDC 프로젝트입니다.
  • MANAGEMENT_API_SERVER: 영역 관리 API 서버의 kubeconfig 파일입니다.

결과는 다음과 유사합니다.

NAME       AGE     SOURCE ZONE   SOURCE PVC   SOURCE PVC CLUSTER   SOURCE VM DISK      DEST. ZONE   DEST. PVC CLUSTER   DEST. VOLUME OVERRIDE     STATE
my-vrr     3m21s   zone1                                           my-vm-boot-disk     zone2                            my-vm-boot-disk-replica
test-vrr   7s      zone1                                           test-vm-boot-disk   zone2

비동기 복제 중지

gdcloud 또는 kubectl을 사용하여 기본 VM 디스크에서 비동기 복제를 중지합니다.

gdcloud

gdcloud compute disks stop-async-replication PRIMARY_DISK_NAME \
  --project PROJECT --zone PRIMARY_ZONE

다음을 바꿉니다.

변수정의
PRIMARY_DISK_NAME 복제되는 소스 디스크의 이름입니다.
PROJECT 기본 디스크의 GDC 프로젝트입니다.
PRIMARY_ZONE 기본 디스크가 있는 영역입니다.

API

  1. 기본 VM 디스크에 해당하는 볼륨 복제 관계를 찾습니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationships \
      -n PROJECT -o json | \
      jq -r '.items[] | select(.spec.source.virtualMachineDisk.virtualMachineDiskRef == "PRIMARY_DISK_NAME"
      and .spec.source.zoneRef == "PRIMARY_ZONE") | .metadata.name'
    
  2. 이전 단계에 나열된 각 볼륨 복제 관계를 삭제합니다. VRR_NAMES를 볼륨 복제 관계의 이름으로 바꿉니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER delete volumereplicationrelationships \
      -n PROJECT VRR_NAMES
    

    다음을 바꿉니다.

    변수정의
    MANAGEMENT_API_SERVER 전역 관리 API 서버의 kubeconfig 파일입니다.
    PROJECT 기본 디스크의 GDC 프로젝트입니다.
    PRIMARY_DISK_NAME 복제되는 소스 디스크의 이름입니다.
    PRIMARY_ZONE 기본 디스크가 있는 영역입니다.

소스 영역을 어떤 이유로든 사용할 수 없는 경우 볼륨 장애 조치를 만들어 복제를 중지합니다.

복제된 디스크를 VM에 연결

복제가 사용 설정된 동안에는 보조 디스크를 VM에 연결할 수 없습니다. 복제가 중지된 후에는 보조 디스크를 새로 만든 VM 또는 기존 VM에 연결할 수 있습니다.