Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Migrate stateful applications with cloud disks across zones

Última actualización: Sep 04, 2026

El complemento storage-operator automatiza la migración de discos entre zonas y la distribución multizona para los StatefulSets. Si ocurre un error durante la migración, el complemento restaura la aplicación en la zona original mediante verificaciones previas y reversiones para garantizar la disponibilidad del servicio.

Casos de uso

Escenario

Descripción

Cambios en la planificación de zonas

Traslado de cargas de trabajo a una zona diferente debido a actualizaciones de infraestructura o capacidad.

Distribución multizona

Distribución de réplicas y sus discos en varias zonas para mejorar la disponibilidad.

Restricciones de recursos

Capacidad insuficiente en la zona actual para continuar la operación o escalar horizontalmente.

NAS y OSS admiten operaciones entre zonas y montajes múltiples. Los discos están vinculados a una zona específica; no pueden moverse entre zonas ni reutilizar solicitudes de volumen persistente (PVC) ni volúmenes persistentes (PV) existentes. Cree nuevos discos en la zona de destino a partir de instantáneas.

Restricciones clave

Revise estas restricciones antes de iniciar la migración:

  • Interrupción del servicio requerida: Para garantizar la consistencia de los datos, la migración escala el StatefulSet a 0 réplicas y luego las restaura todas al mismo tiempo tras completar la migración del disco; no se trata de una actualización continua. Planifique el tiempo de inactividad. La duración depende del número de réplicas, el tiempo de inicio del contenedor y la capacidad del disco.

  • Discos ESSD obligatorios: Todo el almacenamiento utilizado por el StatefulSet debe ser discos ESSD. La migración utiliza instant access snapshots, que solo admiten discos ESSD.

  • Requisitos de la zona de destino: La zona de destino debe admitir discos ESSD y el clúster debe tener nodos disponibles en dicha zona para la programación.

Si su aplicación utiliza discos que no son ESSD, realice una de las siguientes acciones antes de migrar:

Funcionamiento

La migración entre zonas crea instantáneas de los discos de origen y utiliza acceso instantáneo para minimizar el tiempo de creación. Consulte Snapshot billing.

storage-operator ejecuta los siguientes pasos:

  1. Verificación previa: Comprueba que la aplicación se esté ejecutando e identifica los discos por migrar. Se detiene si la verificación falla.

  2. Escalado a cero: Escala el StatefulSet a 0 réplicas y pausa la aplicación.

  3. Creación de instantáneas: Genera instantáneas de acceso instantáneo para todos los discos montados. Las instantáneas son independientes de la zona.

  4. Aprovisionamiento de nuevos discos: Tras confirmar que las instantáneas están disponibles, crea nuevos discos en la zona de destino con los mismos datos.

  5. Reconstrucción de PVC y PV: Reconstruye los PVC con los mismos nombres y sus PV correspondientes, vinculados a los nuevos discos.

  6. Restauración de réplicas: Restablece el recuento original de réplicas. Estas se vinculan a los PVC reconstruidos y montan los nuevos discos.

  7. (Opcional) Eliminación de recursos originales: Tras confirmar el estado correcto de la aplicación, elimine los PV y discos originales. Consulte Block storage billing.

Importante

Cada paso posterior a la verificación previa cuenta con una estrategia de reversión. Confirme que el StatefulSet se ejecute correctamente después de la migración antes de eliminar los discos originales; esto garantiza que la aplicación pueda volver a montar los discos originales si fuera necesaria una reversión.

Requisitos previos

Asegúrese de cumplir con lo siguiente:

  • Un clúster que ejecute Kubernetes 1.20 o posterior con el controlador Container Storage Interface (CSI) instalado

  • storage-operator v1.26.2-1de13b6-aliyun o posterior instalado

  • csi-plugin y csi-provisioner instalados, con csi-provisioner usando la versión no administrada

    Si tiene instalada la versión administrada, cambie a la no administrada. Luego reinicie el controlador de almacenamiento: kubectl delete pod -n kube-system <storage-controller-pod-name>
  • (Solo para clústeres dedicados ACK) Los roles RAM de worker y master tienen el permiso ModifyDiskSpec en la API de ECS. Consulte Crear una directiva personalizada. Visualice la directiva RAM requerida:

    Los clústeres administrados ACK no requieren el permiso ModifyDiskSpec .
    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ecs:CreateSnapshot",
                    "ecs:DescribeSnapshot",
                    "ecs:DeleteSnapshot",
                    "ecs:ModifyDiskSpec",
                    "ecs:DescribeTaskAttribute"
                ],
                "Resource": "*"
            }
        ]
    }

    </details>

Migrar un StatefulSet entre zonas

Step 1: Enable the storage controller

Aplique un parche al ConfigMap para activar el controlador de almacenamiento:

kubectl patch configmap/storage-operator \
  -n kube-system \
  --type merge \
  -p '{"data":{"storage-controller":"{\"imageRep\":\"acs/storage-controller\",\"imageTag\":\"\",\"install\":\"true\",\"template\":\"/acs/templates/storage-controller/install.yaml\",\"type\":\"deployment\"}"}}'

Paso 2: Crear una tarea de migración

Cree un recurso ContainerStorageOperator:

cat <<EOF | kubectl apply -f -
apiVersion: storage.alibabacloud.com/v1beta1
kind: ContainerStorageOperator
metadata:
  name: default
spec:
  operationType: APPMIGRATE
  operationParams:
    stsName: web
    stsNamespace: default
    stsType: kube
    targetZone: cn-beijing-h,cn-beijing-j
    checkWaitingMinutes: "1"
    healthDurationMinutes: "1"
    snapshotRetentionDays: "2"
    retainSourcePV: "true"
EOF

Parámetros:

Parámetro

Obligatorio

Predeterminado

Descripción

operationType

Obligatorio

—

Establezca este valor en APPMIGRATE para la migración de aplicaciones con estado.

stsName

Obligatorio

—

Nombre del StatefulSet por migrar. Solo se permite un StatefulSet por tarea. Varias tareas se ejecutan secuencialmente según el orden de despliegue.

stsNamespace

Obligatorio

—

Namespace del StatefulSet.

targetZone

Obligatorio

—

Zonas de destino separadas por comas; por ejemplo, cn-beijing-h,cn-beijing-j. Los discos que ya se encuentren en una zona listada se omiten. Si hay varias zonas, los discos restantes se distribuyen siguiendo el orden de la lista.

stsType

Opcional

kube

Tipo de StatefulSet. Valores válidos: kube (nativo) y kruise (OpenKruise Advanced StatefulSet).

checkWaitingMinutes

Opcional

"1"

Intervalo de sondeo (en minutos) para verificar la disponibilidad de las réplicas tras la migración. Aumente este valor en StatefulSets grandes o con inicios lentos para evitar reversiones prematuras.

healthDurationMinutes

Opcional

"0"

Tiempo de espera (en minutos) después de que las réplicas alcancen el recuento esperado antes de realizar una segunda comprobación de estado. Establezca este valor en "0" para omitir la comprobación.

snapshotRetentionDays

Opcional

"1"

Periodo de retención para instantáneas de acceso instantáneo. Valores válidos: "1" (un día) y "-1" (permanente).

retainSourcePV

Opcional

"false"

Indica si se conserva el disco original y el PV tras la migración. El valor "false" elimina ambos. El valor "true" los conserva: el disco permanece visible en la consola de ECS y el PV pasa al estado Released.

Ejemplos

Los siguientes ejemplos utilizan un clúster ACK Pro con nodos en tres zonas:

  • Zona B: cn-shanghai.192.168.5.245

  • Zona G: cn-shanghai.192.168.2.214

  • Zona M: cn-shanghai.192.168.3.236, cn-shanghai.192.168.3.237

Node zones

Paso 1: Crear un StatefulSet con discos ESSD

Cree un StatefulSet de prueba con discos ESSD. Omita este paso si ya cuenta con un StatefulSet listo para migrar.

  1. Despliegue el StatefulSet. Consulte el YAML del StatefulSet de Nginx:

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              ports:
                - containerPort: 80
                  name: web
              volumeMounts:
                - name: www
                  mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
        - metadata:
            name: www
            labels:
              app: nginx
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-essd"
            resources:
              requests:
                storage: 20Gi
    EOF

    </details>

  2. Compruebe que ambos pods se estén ejecutando:

    kubectl get pod -o wide -l app=nginx

    La salida muestra ambos pods programados en la zona M (la ubicación real depende del planificador):

    NAME       READY   STATUS    RESTARTS   AGE   IP              NODE                        NOMINATED NODE   READINESS GATES
    web-0      1/1     Running   0          2m    192.168.3.243   cn-shanghai.192.168.3.237   <none>           <none>
    web-1      1/1     Running   0          2m    192.168.3.246   cn-shanghai.192.168.3.236   <none>           <none>

Paso 2: Crear una tarea de migración

Ejemplo 1: Migración entre zonas

Migre todos los pods a una sola zona de destino (zona B en este ejemplo).

Importante

Confirme que la zona de destino tenga suficientes recursos de nodo y admita discos ESSD.

  1. Cree la tarea de migración:

    cat <<EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerStorageOperator
    metadata:
      name: migrate-to-b
    spec:
      operationType: APPMIGRATE
      operationParams:
        stsName: web
        stsNamespace: default
        stsType: kube
        targetZone: cn-shanghai-b     # Target zone for migration.
        healthDurationMinutes: "1"    # Wait 1 minute after migration to confirm the application is running properly.
        snapshotRetentionDays: "-1"   # Retain snapshots permanently until manually deleted.
        retainSourcePV: "true"        # Retain the original disks and PVs.
    EOF
  2. Consulte el estado de la migración:

    Si el estado es FAILED , consulte FAQ para solucionar problemas.
    kubectl describe cso migrate-to-b | grep Status

    El estado SUCCESS confirma que la migración se completó:

      Status:
        Status:   SUCCESS
  3. Verifique la ubicación de los pods después de la migración:

    kubectl get pod -o wide -l app=nginx

    Ambos pods se encuentran ahora en el nodo cn-shanghai.192.168.5.245 de la zona B:

    NAME    READY   STATUS    RESTARTS   AGE     IP              NODE                        NOMINATED NODE   READINESS GATES
    web-0   1/1     Running   0          2m36s   192.168.5.250   cn-shanghai.192.168.5.245   <none>           <none>
    web-1   1/1     Running   0          2m14s   192.168.5.2     cn-shanghai.192.168.5.245   <none>           <none>
  4. Confirme los resultados en la consola de ECS:

    • Página Snapshots: se crearon 2 nuevas instantáneas con retención permanente.

    • Página Block Storage: hay 2 nuevos discos en la zona B; los 2 discos originales de la zona M se conservan (porque retainSourcePV está establecido en "true").

Ejemplo 2: Distribución multizona

Distribuya los pods en dos zonas (zonas B y G) para mejorar la disponibilidad.

  1. Cree la tarea de migración:

    cat <<EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerStorageOperator
    metadata:
      name: migrate
    spec:
      operationType: APPMIGRATE
      operationParams:
        stsName: web
        stsNamespace: default
        stsType: kube
        targetZone: cn-shanghai-b,cn-shanghai-g   # Target zones. Multiple zones trigger automatic spreading.
        healthDurationMinutes: "1"                # Wait 1 minute after migration to confirm the application is running properly.
        snapshotRetentionDays: "-1"               # Retain snapshots permanently until manually deleted.
        retainSourcePV: "true"                    # Retain the original disks and PVs.
    EOF
  2. Consulte el estado de la migración:

    Si el estado es FAILED , consulte FAQ para solucionar problemas.
    kubectl describe cso migrate | grep Status

    El estado SUCCESS confirma que la migración se completó:

      Status:
        Status:   SUCCESS
  3. Verifique la ubicación de los pods después de la migración:

    kubectl get pod -o wide -l app=nginx

    Los pods se distribuyen entre la zona B (cn-shanghai.192.168.5.245) y la zona G (cn-shanghai.192.168.2.214):

    NAME    READY   STATUS    RESTARTS   AGE     IP              NODE                        NOMINATED NODE   READINESS GATES
    web-0   1/1     Running   0          4m59s   192.168.2.215   cn-shanghai.192.168.2.214   <none>           <none>
    web-1   1/1     Running   0          4m38s   192.168.5.250   cn-shanghai.192.168.5.245   <none>           <none>
  4. Confirme los resultados en la consola de ECS:

    • Página Snapshots: se crearon 2 nuevas instantáneas con retención permanente.

    • Página Block Storage: hay 2 nuevos discos distribuidos en las zonas B y G; los 2 discos originales de la zona M se conservan.

Preguntas frecuentes

Si una tarea de migración devuelve el estado FAILED, obtenga el mensaje de error:

kubectl describe cso <ContainerStorageOperator-name> | grep Message -A 1

Ejemplo de salida:

  Message:
    Consume: failed to get target pvc, err: no pvc mounted in statefulset or no pvc need to migrated web

El componente no pudo encontrar un PVC para migrar. Causas comunes:

  • El StatefulSet no tiene almacenamiento montado.

  • Todos los discos ya se encuentran en la zona de destino, por lo que no se requiere migración.

  • El componente no pudo recuperar la información del PVC.

Resuelva el problema basándose en el mensaje de error y vuelva a aplicar la tarea de migración.