En esta página se describe cómo configurar y realizar la replicación asíncrona de volúmenes de almacenamiento en bloques aislados de Google Distributed Cloud (GDC).
La replicación asíncrona se utiliza para replicar datos de una zona de GDC a otra. Los datos replicados se pueden usar para la conmutación por error si los datos de la zona de origen dejan de estar disponibles. Ten en cuenta que, una vez que se crea una conmutación por error, el volumen original no se puede replicar en el mismo volumen de destino. En su lugar, se debe crear una nueva relación de replicación.
Si eres administrador de la plataforma y gestionas PVCs con la API de KRM, consulta el artículo Replicar volúmenes de forma asíncrona.
Antes de empezar
Para usar la replicación asíncrona de bloques, el operador de infraestructura debe configurar primero dos zonas para la replicación asíncrona.A continuación, asegúrate de tener el rol app-volume-replication-admin-global para administrar el recurso VolumeReplicationRelationship. En los casos en los que la API global no esté disponible, se puede usar el rol volume-replication-admin para modificar directamente el recurso zonal VolumeReplicationRelationshipReplica.
Configurar la replicación
El recurso personalizado (CR) VolumeReplicationRelationship proporciona la API de replicación asíncrona de bloques. Este CR existe en la API de gestión global. Para habilitar la replicación de un dispositivo de bloques determinado, se debe crear un CR VolumeReplicationRelationship en la API de gestión global:
API de replicación de PVCs
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
Haz los cambios siguientes:
MANAGEMENT_API_SERVER: la ruta de kubeconfig del servidor de la API zonal.VRR_NAME: el nombre del recurso VolumeReplicationRelationship.PROJECT: el espacio de nombres del recurso de proyecto.SOURCE_USER_CLUSTER_NAME: el nombre del recurso de clúster de usuario de origen al que se va a conectar.PVC_NAME: el nombre del recurso PersistentVolumeClaim.SOURCE_ZONE_NAME: el nombre del recurso de zona de origen.DESTINATION_USER_CLUSTER_NAME: el nombre del recurso de clúster de usuario de destino al que se va a conectar.DESTINATION_ZONE_NAME: el nombre del recurso de zona de destino.
En este ejemplo, se da por hecho que se ha creado un proyecto llamado PROJECT en una organización llamada my-org y que ya se ha aprovisionado un PVC llamado PVC_NAME. El SOURCE_USER_CLUSTER_NAME es el nombre del clúster de origen en el que existe el PVC, y el DESTINATION_USER_CLUSTER_NAME es el nombre del clúster de destino en el que existirá un nuevo PVC.
Los campos source y destination de la especificación indican, respectivamente, el origen de y el destino de de los datos que se van a replicar. En este ejemplo, los datos se replican de SOURCE_ZONE_NAME a DESTINATION_ZONE_NAME.
Replicar discos de máquinas virtuales
VolumeReplicationRelationship también proporciona la API de replicación asíncrona de discos de máquinas virtuales (VMs).
El disco de origen que se está replicando se denomina "disco principal". El disco de destino en el que se está replicando se denomina "disco secundario". Al iniciar la replicación asíncrona en un disco principal, se crea automáticamente el disco secundario.
Solicitar permisos y acceso
Para replicar discos de máquinas virtuales, debes tener el rol Administrador de máquinas virtuales del proyecto. Sigue los pasos para verificar que tienes el rol Administrador de máquinas virtuales del proyecto (project-vm-admin) en el espacio de nombres del proyecto en el que reside el disco de la VM.
Para realizar operaciones en máquinas virtuales con la CLI de gdcloud, pide al administrador de IAM del proyecto que te asigne los roles Administrador de máquinas virtuales del proyecto y Visor del proyecto (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
Haz los cambios siguientes:
| Variable | Definición |
|---|---|
PRIMARY_DISK_NAME |
El nombre del disco de origen que se está replicando. |
PROJECT |
El proyecto de GDC del disco principal. |
PRIMARY_ZONE |
La zona en la que reside el disco principal. |
SECONDARY_DISK_NAME |
El nombre del disco de destino en el que se va a replicar. |
SECONDARY_ZONE |
La zona en la que debe residir el disco secundario. |
API de discos de VMs
Iniciar la replicación asíncrona
Inicia la replicación asíncrona en un disco de VM con 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
Haz los cambios siguientes:
MANAGEMENT_API_SERVER: la ruta de kubeconfig del servidor de la API zonal.VRR_NAME: el nombre del recurso VolumeReplicationRelationship.PROJECT: el espacio de nombres del recurso de proyecto.VIRTUAL_MACHINE_DESTINATION_DISK_NAME: el nombre del recurso VirtualMachineDisk en el destino.DESTINATION_ZONE_NAME: el nombre del recurso de zona de destino.VIRTUAL_MACHINE_SOURCE_DISK_NAME: el nombre del recurso VirtualMachineDisk en el origen.SOURCE_ZONE_NAME: el nombre del recurso de zona de origen.
En este ejemplo, se da por hecho que se ha creado un proyecto llamado PROJECT en una organización llamada my-org y que ya se ha aprovisionado un VirtualMachineDisk llamado VIRTUAL_MACHINE_SOURCE_DISK_NAME en el recurso VirtualMachine.
Los campos source y destination de la especificación indican, respectivamente, el origen de y el destino de de los datos que se van a replicar. En este ejemplo, los datos se replican de SOURCE_ZONE_NAME a DESTINATION_ZONE_NAME.
Verificación
Para comprobar el estado de la relación de replicación, recupera el CR VolumeReplicationRelationship de la API global. Consulta el siguiente ejemplo. Ten en cuenta que el resultado se ha truncado para simplificarlo:
kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationship VRR_NAME \
-n PROJECT -o yaml
El resultado debería ser similar al siguiente:
API de PVCs
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
API de discos de VMs
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
Crear conmutación por error
Si la zona de origen no está disponible por algún motivo, se puede crear un CR VolumeFailover en el plano de gestión de la organización de la zona de destino. En el caso de una organización v2, sería el servidor de la API de gestión. En el caso de una organización v1, sería el clúster de administración de la organización. Por ejemplo, si se ha creado un VolumeReplicationRelationship que especifica zone2 como zona de destino y existe un PVC o un VirtualMachineDisk en la organización my-org, el CR VolumeFailover se crea en el plano de gestión de my-org en zone2. Esto interrumpe la relación de replicación entre las dos zonas y permite que una carga de trabajo monte el PVC o el VirtualMachineDisk en la zona de destino:
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
Haz los cambios siguientes:
FAILOVER_NAME: el nombre del recurso VolumeFailover.MANAGEMENT_API_SERVER: la ruta de kubeconfig del servidor de la API zonal.VRR_NAME: el nombre del recurso VolumeReplicationRelationship.PROJECT: el espacio de nombres del recurso de proyecto.
Una vez que se haya realizado correctamente la conmutación por error, se reflejará en el estado del CR:
kubectl --kubeconfig MANAGEMENT_API_SERVER get volumefailover FAILOVER_NAME \
-n PROJECT -o yaml
El resultado debería ser similar al siguiente:
apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: my-failover namespace: my-project spec: volumeReplicationRelationshipRef: my-vrr-repl status: state: CompletedUna vez creada la conmutación por error, el
VolumeReplicationRelationshipmy-vrr-replpasa al estadoBroken Off. Ahora se puede montar el PVC o el VirtualMachineDisk enzone2.En este punto, el
VolumeReplicationRelationshipserá similar al siguiente ejemplo. De nuevo, este resultado se ha truncado para simplificarlo:kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationship VRR_NAME \ -n PROJECT -o yamlEl resultado debería ser similar al siguiente:
API de PVCs
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
API de discos de VMs
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
Ahora puedes eliminar el
VolumeReplicationRelationshipde forma segura, ya que es la única acción que se puede realizar en este CR.kubectl --kubeconfig MANAGEMENT_API_SERVER delete volumereplicationrelationship VRR_NAME \ -n PROJECT
Cambiar el tamaño de los volúmenes
Si en algún momento se cambia el tamaño del volumen de origen, también debes cambiar el tamaño del volumen correspondiente en la zona de destino para que coincida. El volumen de la zona de destino se crea cuando creas el VolumeReplicationRelationship.
Consulta la documentación Ampliar discos de VMs o Ampliar la capacidad de un volumen para cambiar el tamaño del almacenamiento en las zonas de origen y de destino.
Mostrar relaciones de replicación asíncrona
Muestra las relaciones de replicación asíncrona de un proyecto con kubectl.
kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationships -n PROJECT
Haz los cambios siguientes:
- PROJECT: el proyecto de GDC del disco principal.
- MANAGEMENT_API_SERVER: el archivo kubeconfig del servidor de la API de gestión zonal.
El resultado es similar al siguiente:
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
Detener la replicación asíncrona
Detén la replicación asíncrona en un disco de VM principal con gdcloud o kubectl.
gdcloud
gdcloud compute disks stop-async-replication PRIMARY_DISK_NAME \
--project PROJECT --zone PRIMARY_ZONE
Haz los cambios siguientes:
| Variable | Definición |
|---|---|
PRIMARY_DISK_NAME |
El nombre del disco de origen que se está replicando. |
PROJECT |
El proyecto de GDC del disco principal. |
PRIMARY_ZONE |
La zona en la que reside el disco principal. |
API
Busca las relaciones de replicación de volúmenes correspondientes al disco de VM principal.
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'Elimina cada una de las relaciones de replicación de volúmenes que se indican en el paso anterior. Sustituye VRR_NAMES por los nombres de las relaciones de replicación de volúmenes.
kubectl --kubeconfig MANAGEMENT_API_SERVER delete volumereplicationrelationships \ -n PROJECT VRR_NAMESHaz los cambios siguientes:
Variable Definición MANAGEMENT_API_SERVEREl archivo kubeconfig del servidor de la API de gestión global. PROJECTEl proyecto de GDC del disco principal. PRIMARY_DISK_NAMEEl nombre del disco de origen que se está replicando. PRIMARY_ZONELa zona en la que reside el disco principal.
Si la zona de origen no está disponible por algún motivo, crea una conmutación por error de volumen para detener la replicación.
Asociar el disco replicado a una VM
Mientras la replicación esté habilitada, el disco secundario no se podrá asociar a una VM. Una vez que se haya detenido la replicación, podrás asociar el disco secundario a una VM recién creada o a una VM ya existente.