ボリュームを非同期で複製する

このページでは、Google Distributed Cloud(GDC)エアギャップ ブロック ストレージ ボリュームの非同期レプリケーションを設定して実行する方法について説明します。

非同期レプリケーションは、ある GDC ゾーンから別のゾーンにデータを複製するために使用されます。この複製されたデータは、ソースゾーンのデータが使用できなくなった場合のフェイルオーバー シナリオで使用できます。フェイルオーバーを作成すると、元のボリュームを同じ移行先ボリュームに複製するように設定することはできません。代わりに、新しいレプリケーション関係を作成する必要があります。

始める前に

非同期ブロック レプリケーションを使用するには、インフラストラクチャ オペレーター(IO)が、レプリケーションが必要な 2 つのゾーン間にストレージ インフラストラクチャを設定する必要があります。具体的には、まず各ゾーンから関連するストレージ クラスタをピアリングする必要があります。 次に、ブロック ストレージがプロビジョニングされている組織に関連付けられたストレージ仮想マシンをピアリングする必要があります。

次に、VolumeReplicationRelationship リソースを管理するための volume-replication-admin-global ロールがあることを確認します。グローバル API が使用できない場合は、app-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: プロジェクト リソースの Namespace。
  • 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 が存在する移行先クラスタの名前です。

仕様の source フィールドと destination フィールドは、データが複製される をそれぞれ示します。この例では、データは SOURCE_ZONE_NAME から DESTINATION_ZONE_NAME に複製されます。

VM ディスク API

仮想マシン ディスクを複製する

VolumeReplicationRelationship は、非同期仮想マシン ディスク(VM ディスク)レプリケーション API も提供します。 複製されるソースディスクはプライマリ ディスクと呼ばれます。複製先の移行先ディスクは セカンダリ ディスクと呼ばれます。プライマリ ディスクで非同期レプリケーションを開始すると、 セカンダリ ディスクが自動的に作成されます。

権限とアクセスをリクエストする

VM ディスクを複製するには、プロジェクトの VirtualMachine 管理者ロールが必要です。手順に沿って、VM ディスクが存在するプロジェクトの Namespace にプロジェクトの VirtualMachine 管理者(project-vm-admin)ロールがあることを 確認 します。

gdcloud CLI を使用した VM オペレーションの場合は、プロジェクト IAM 管理者に、プロジェクトの VirtualMachine 管理者ロールとプロジェクト閲覧者(project-viewer)ロールの両方を割り当てるように依頼してください。

非同期レプリケーションを開始する

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: プロジェクト リソースの Namespace。
  • SOURCE_ZONE_NAME: ソースゾーン リソースの名前。
  • DESTINATION_ZONE_NAME: 移行先ゾーン リソースの名前。
  • VIRTUAL_MACHINE_SOURCE_DISK_NAME: ソース上の VirtualMachineDisk リソースの名前。
  • VIRTUAL_MACHINE_DESTINATION_DISK_NAME: 移行先の VirtualMachineDisk リソースの名前。

この例では、PROJECT という名前のプロジェクトが my-org という名前の組織に作成され、VirtualMachineDisk という名前の VIRTUAL_MACHINE_SOURCE_DISK_NAMEVirtualMachine リソースにすでにプロビジョニングされていることを前提としています。

仕様の source フィールドと destination フィールドは、データが複製される をそれぞれ示します。この例では、データは 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 管理プレーンに作成されます。これにより、2 つのゾーン間のレプリケーション関係が解除され、移行先ゾーンの 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: プロジェクト リソースの Namespace。

  • その後、フェイルオーバーが成功すると、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
  • これで、VolumeReplicationRelationship を安全に削除できます。これは、この CR で実行できる唯一のアクションです。

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

ボリュームのサイズを変更する

ソースボリュームのサイズが変更された場合は、VolumeReplicationRelationship の作成時にユーザーに代わって作成された移行先ゾーンの対応するボリュームのサイズも、一致するように変更する必要があります。

ソースゾーンと移行先ゾーンの両方でストレージのサイズを変更するには、VM ディスクを拡張するドキュメントまたはボリューム容量を拡張するをご覧ください。