本页面介绍了如何设置和执行 Google Distributed Cloud (GDC) 网闸隔离配置块存储卷的异步复制。
异步复制用于将数据从一个 GDC 可用区复制到另一个 GDC 可用区。如果源可用区数据不可用,则复制的数据可用于故障切换。请注意,故障切换一经创建,原始卷便无法复制到同一目标卷。而是必须创建新的复制关系。
对于使用 KRM API 管理 PVC 的平台管理员,请参阅为平台管理员异步复制卷。
准备工作
如需使用异步块复制,您的基础设施运维人员 (IO) 必须先设置两个可用区以进行异步复制。然后,确保您拥有 app-volume-replication-admin-global 角色,以便管理 VolumeReplicationRelationship 资源。如果全局 API 不可用,则可以使用 volume-replication-admin 角色直接修改可用区级 VolumeReplicationRelationshipReplica 资源。
设置复制
VolumeReplicationRelationship 自定义资源 (CR) 为异步块复制 API 提供服务。此 CR 存在于全局 Management API 中。如需为给定块存储设备启用复制功能,需要在全局 Management API 上创建 VolumeReplicationRelationship CR:
Replicate 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:Project 资源的命名空间。SOURCE_USER_CLUSTER_NAME:要连接的来源用户集群资源的名称。PVC_NAME:PersistentVolumeClaim 资源的名称。SOURCE_ZONE_NAME:来源可用区资源的名称。DESTINATION_USER_CLUSTER_NAME:要连接的目标用户集群资源的名称。DESTINATION_ZONE_NAME:目标可用区资源的名称。
此示例假设在名为 my-org 的组织中创建了一个名为 PROJECT 的项目,并且已预配名为 PVC_NAME 的 PVC。SOURCE_USER_CLUSTER_NAME 是 PVC 所在的来源集群的名称,DESTINATION_USER_CLUSTER_NAME 是新 PVC 所在的目标集群的名称。
规范的 source 和 destination 字段分别指示数据的复制来源和目标。在此示例中,数据从 SOURCE_ZONE_NAME 复制到 DESTINATION_ZONE_NAME。
复制虚拟机磁盘
VolumeReplicationRelationship 还为异步虚拟机磁盘(虚拟机磁盘)复制 API 提供服务。要复制的源磁盘称为主磁盘。要复制到的目标磁盘称为辅助磁盘。在主磁盘上启动异步复制会自动创建辅助磁盘。
请求权限和访问权限
如需复制虚拟机磁盘,您必须拥有 Project VirtualMachine Admin 角色。按照相关步骤验证您在虚拟机磁盘所在项目的命名空间中是否拥有 Project VirtualMachine Admin 角色 (project-vm-admin)。
对于使用 gdcloud CLI 的虚拟机操作,请请求 IAM 项目管理员为您分配 Project VirtualMachine Admin 角色和 Project Viewer (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 Disk API
启动异步复制
使用 kubectl 在虚拟机磁盘上启动异步复制。
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:Project 资源的命名空间。VIRTUAL_MACHINE_DESTINATION_DISK_NAME:目标位置上的 VirtualMachineDisk 资源的名称。DESTINATION_ZONE_NAME:目标可用区资源的名称。VIRTUAL_MACHINE_SOURCE_DISK_NAME:来源上的 VirtualMachineDisk 资源的名称。SOURCE_ZONE_NAME:来源可用区资源的名称。
此示例假设在名为 my-org 的组织中创建了一个名为 PROJECT 的项目,并且已为 VirtualMachine 资源预配了一个名为 VIRTUAL_MACHINE_SOURCE_DISK_NAME 的 VirtualMachineDisk。
规范的 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 Disk 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 组织,这将是 Management API 服务器。对于 v1 组织,这将是组织管理员集群。例如,如果创建了 VolumeReplicationRelationship,其中指定 zone2 作为目标可用区,并且 my-org 组织中存在 PVC 或 VirtualMachineDisk,则会在 zone2 的 my-org 管理平面中创建 VolumeFailover CR。这会破坏两个可用区之间的复制关系,并允许工作负载在目标可用区中装载 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: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-replVolumeReplicationRelationship会转换为Broken 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 Disk 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 时创建。
如需在来源可用区和目标可用区中调整存储空间大小,请参阅扩容虚拟机磁盘文档或扩容卷容量。
列出异步复制关系
使用 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 停止主虚拟机磁盘上的异步复制。
gdcloud
gdcloud compute disks stop-async-replication PRIMARY_DISK_NAME \
--project PROJECT --zone PRIMARY_ZONE
替换以下内容:
| 变量 | 定义 |
|---|---|
PRIMARY_DISK_NAME |
要复制的源磁盘的名称。 |
PROJECT |
主磁盘的 GDC 项目。 |
PRIMARY_ZONE |
主磁盘所在的可用区。 |
API
找到与主虚拟机磁盘对应的卷复制关系。
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'删除上一步中列出的每个卷复制关系。将 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主磁盘所在的可用区。
如果来源可用区因任何原因而不可用,请创建卷故障切换以停止复制。