Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Aug 11, 2026

Le module complémentaire storage-operator automatise la migration des disques entre zones et la répartition multizone pour les StatefulSets. En cas d'erreur lors de la migration, le module complémentaire restaure l'application dans la zone d'origine grâce à une prévalidation et à un rollback afin de garantir la disponibilité du service.

Cas d'utilisation

Scénario Description
Modification de la planification des zones Déplacez les charges de travail vers une autre zone en raison de mises à jour de l'infrastructure ou de la capacité.
Répartition multizone Répartissez les réplicas et leurs disques sur plusieurs zones pour améliorer la disponibilité.
Contraintes de ressources Capacité insuffisante dans la zone actuelle pour poursuivre les opérations ou effectuer une montée en charge horizontale.

NAS et OSS prennent en charge les montages interzones et multiples. Les disques sont liés à une zone : ils ne peuvent pas être transférés d'une zone à l'autre ni réutiliser les persistent volume claims (PVC) et persistent volumes (PV) existants. Créez de nouveaux disques dans la zone cible à partir de snapshots.

Principales contraintes

Examinez ces contraintes avant la migration :

  • Interruption de service requise : Pour garantir la cohérence des données, la migration réduit le nombre de réplicas du StatefulSet à 0, puis les restaure tous simultanément après la migration des disques. Il ne s'agit pas d'une mise à jour progressive. Prévoyez une période d'indisponibilité. La durée dépend du nombre de réplicas, du temps de démarrage des conteneurs et de la capacité des disques.

  • Disques ESSD requis : Tous les éléments de stockage utilisés par le StatefulSet doivent être des disques ESSD. La migration utilise des instant access snapshots, qui ne sont compatibles qu'avec les disques ESSD.

  • Exigences relatives à la zone cible : La zone cible doit prendre en charge les disques ESSD et le cluster doit disposer de nœuds disponibles dans cette zone pour la planification.

Si votre application utilise des disques autres que des ESSD, effectuez l'une des opérations suivantes avant la migration :

Fonctionnement

La migration interzone crée des snapshots des disques source et utilise l'accès instantané pour réduire au minimum le temps de création. Consultez la section Facturation des snapshots.

storage-operator exécute les étapes suivantes :

  1. Prévalidation : Vérifie que l'application est en cours d'exécution et identifie les disques à migrer. Le processus s'arrête si la prévalidation échoue.

  2. Réduction à zéro : Réduit le nombre de réplicas du StatefulSet à 0, mettant ainsi l'application en pause.

  3. Création de snapshots : Crée des instant access snapshots pour tous les disques montés. Les snapshots sont indépendants des zones.

  4. Provisionnement de nouveaux disques : Une fois la disponibilité des snapshots confirmée, crée de nouveaux disques dans la zone cible contenant les mêmes données.

  5. Reconstruction des PVC et PV : Reconstruit les PVC portant les mêmes noms et leurs PV correspondants, liés aux nouveaux disques.

  6. Restauration des réplicas : Restaure le nombre initial de réplicas. Les réplicas se lient aux PVC reconstruits et montent les nouveaux disques.

  7. (Facultatif) Suppression des ressources d'origine : Après avoir confirmé l'état de santé de l'application, supprimez les PV et les disques d'origine. Consultez la section Facturation du stockage par blocs.

Important

Chaque étape suivant la prévalidation dispose d'une stratégie de rollback. Confirmez que le StatefulSet fonctionne correctement après la migration avant de supprimer les disques d'origine. Cela garantit que l'application peut remonter les disques d'origine si un rollback s'avère nécessaire.

Prérequis

Assurez-vous que les conditions suivantes sont remplies :

  • Un cluster exécutant Kubernetes 1.20 ou version ultérieure avec le pilote Container Storage Interface (CSI) installé.

  • storage-operator v1.26.2-1de13b6-aliyun ou version ultérieure installé.

  • csi-plugin et csi-provisioner installés, csi-provisioner utilisant la version non gérée.

    Si la version gérée est installée, basculez vers la version non gérée. Redémarrez ensuite le contrôleur de stockage : kubectl delete pod -n kube-system <storage-controller-pod-name>
  • (Clusters dédiés ACK uniquement) Les rôles RAM des nœuds de travail et maîtres disposent de l'autorisation ModifyDiskSpec sur l'API ECS. Consultez la page Créer une stratégie personnalisée. Affichez la stratégie RAM requise :

    Les clusters gérés ACK ne nécessitent pas l'autorisation ModifyDiskSpec .
    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ecs:CreateSnapshot",
                    "ecs:DescribeSnapshot",
                    "ecs:DeleteSnapshot",
                    "ecs:ModifyDiskSpec",
                    "ecs:DescribeTaskAttribute"
                ],
                "Resource": "*"
            }
        ]
    }

    </details>

Migrer un StatefulSet entre zones

Étape 1 : Activer le contrôleur de stockage

Appliquez un correctif à la ConfigMap pour activer le contrôleur de stockage :

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\"}"}}'

Étape 2 : Créer une tâche de migration

Créez une ressource 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

Paramètres :

Paramètre Obligatoire Valeur par défaut Description
operationType Obligatoire Définissez la valeur sur APPMIGRATE pour la migration d'applications avec état.
stsName Obligatoire Nom du StatefulSet à migrer. Une seule tâche de migration par StatefulSet. Plusieurs tâches s'exécutent séquentiellement selon l'ordre de déploiement.
stsNamespace Obligatoire Namespace du StatefulSet.
targetZone Obligatoire Zones cibles séparées par des virgules, par exemple cn-beijing-h,cn-beijing-j. Les disques déjà situés dans une zone répertoriée sont ignorés. Plusieurs zones permettent de répartir les disques restants selon l'ordre de la liste.
stsType Facultatif kube Type de StatefulSet. Valeurs valides : kube (natif) et kruise (OpenKruise Advanced StatefulSet).
checkWaitingMinutes Facultatif "1" Intervalle d'interrogation (en minutes) pour les vérifications de disponibilité des réplicas après la migration. Augmentez cette valeur pour les StatefulSets volumineux ou les démarrages lents afin d'éviter un rollback prématuré.
healthDurationMinutes Facultatif "0" Temps d'attente (en minutes) après que les réplicas ont atteint le nombre attendu, avant une seconde vérification de l'état de santé. Définissez la valeur sur "0" pour ignorer cette étape.
snapshotRetentionDays Facultatif "1" Période de rétention des instant access snapshots. Valeurs valides : "1" (un jour) et "-1" (permanent).
retainSourcePV Facultatif "false" Indique s'il faut conserver le disque et le PV d'origine après la migration. La valeur "false" supprime les deux. La valeur "true" les conserve : le disque reste dans la console ECS et le PV passe à l'état Released.

Exemples

Les exemples suivants utilisent un cluster ACK Pro avec des nœuds répartis sur trois zones :

  • Zone B : cn-shanghai.192.168.5.245

  • Zone G : cn-shanghai.192.168.2.214

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

Node zones

Étape 1 : Créer un StatefulSet avec des disques ESSD

Créez un StatefulSet de test doté de disques ESSD. Ignorez cette étape si vous disposez déjà d'un StatefulSet à migrer.

  1. Déployez le StatefulSet. Consultez le fichier YAML du StatefulSet 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. Vérifiez que les deux pods sont en cours d'exécution :

    kubectl get pod -o wide -l app=nginx

    La sortie indique que les deux pods sont planifiés dans la zone M (le placement réel dépend du planificateur) :

    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>

Étape 2 : Créer une tâche de migration

Exemple 1 : Migration interzone

Migrez tous les pods vers une seule zone cible (la zone B dans cet exemple).

Important

Confirmez que la zone cible dispose de ressources de nœuds suffisantes et prend en charge les disques ESSD.

  1. Créez la tâche de migration :

    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. Vérifiez l'état de la migration :

    Si l'état est FAILED , consultez la section FAQ pour résoudre les problèmes.
    kubectl describe cso migrate-to-b | grep Status

    Un statut SUCCESS confirme que la migration est terminée :

      Status:
        Status:   SUCCESS
  3. Vérifiez le placement des pods après la migration :

    kubectl get pod -o wide -l app=nginx

    Les deux pods se trouvent désormais sur le nœud cn-shanghai.192.168.5.245 dans la zone 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. Confirmez les résultats dans la console ECS :

    • Page Snapshots : 2 nouveaux snapshots créés avec une rétention permanente.

    • Page Block Storage : 2 nouveaux disques dans la zone B ; les 2 disques d'origine dans la zone M sont conservés (car retainSourcePV est défini sur "true").

Exemple 2 : Répartition multizone

Répartissez les pods sur deux zones (zones B et G) pour améliorer la disponibilité.

  1. Créez la tâche de migration :

    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. Vérifiez l'état de la migration :

    Si l'état est FAILED , consultez la section FAQ pour résoudre les problèmes.
    kubectl describe cso migrate | grep Status

    Un statut SUCCESS confirme que la migration est terminée :

      Status:
        Status:   SUCCESS
  3. Vérifiez le placement des pods après la migration :

    kubectl get pod -o wide -l app=nginx

    Les pods sont répartis entre la zone B (cn-shanghai.192.168.5.245) et la zone 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. Confirmez les résultats dans la console ECS :

    • Page Snapshots : 2 nouveaux snapshots créés avec une rétention permanente.

    • Page Block Storage : 2 nouveaux disques répartis entre les zones B et G ; les 2 disques d'origine dans la zone M sont conservés.

FAQ

Si une tâche de migration renvoie le code FAILED, obtenez le message d'erreur :

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

Exemple de sortie :

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

Le composant n'a pas pu trouver de PVC à migrer. Causes courantes :

  • Le StatefulSet ne possède aucun stockage monté.

  • Tous les disques se trouvent déjà dans la zone cible : aucune migration n'est nécessaire.

  • Le composant n'a pas pu récupérer les informations sur les PVC.

Résolvez le problème en fonction du message d'erreur, puis appliquez à nouveau la tâche de migration.