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 :
Créez manuellement un snapshot pour un seul volume de disque et reconstruisez le disque entre les zones.
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 :
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.
Réduction à zéro : Réduit le nombre de réplicas du StatefulSet à 0, mettant ainsi l'application en pause.
Création de snapshots : Crée des instant access snapshots pour tous les disques montés. Les snapshots sont indépendants des zones.
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.
Reconstruction des PVC et PV : Reconstruit les PVC portant les mêmes noms et leurs PV correspondants, liés aux nouveaux disques.
Restauration des réplicas : Restaure le nombre initial de réplicas. Les réplicas se lient aux PVC reconstruits et montent les nouveaux disques.
(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.
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
ModifyDiskSpecsur 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 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

É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.
-
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>
-
Vérifiez que les deux pods sont en cours d'exécution :
kubectl get pod -o wide -l app=nginxLa 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).
Confirmez que la zone cible dispose de ressources de nœuds suffisantes et prend en charge les disques ESSD.
-
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 -
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 StatusUn statut
SUCCESSconfirme que la migration est terminée :Status: Status: SUCCESS -
Vérifiez le placement des pods après la migration :
kubectl get pod -o wide -l app=nginxLes deux pods se trouvent désormais sur le nœud
cn-shanghai.192.168.5.245dans 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> -
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
retainSourcePVest 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é.
-
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 -
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 StatusUn statut
SUCCESSconfirme que la migration est terminée :Status: Status: SUCCESS -
Vérifiez le placement des pods après la migration :
kubectl get pod -o wide -l app=nginxLes 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> -
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.