Acheminez le trafic inter-zones selon des pondérations et basculez automatiquement en cas de panne d'un cluster.
Fonctionnement
Une architecture métier se compose de trois couches : accès, application et données. La reprise après sinistre au niveau de la zone traite chacune d'elles :
Couche d'accès — Distributed Cloud Container Platform for Kubernetes (ACK One) déploie l'instance ALB sur plusieurs zones au sein d'une région par défaut, ce qui garantit une haute disponibilité du point d'entrée.
Couche application — Une passerelle multi-clusters ALB répartit le trafic entre les clusters situés dans différentes zones de disponibilité grâce à des règles Ingress basées sur des pondérations. En cas de défaillance d'un cluster, ALB détecte les pods défectueux et redirige automatiquement le trafic vers le cluster restant.
Couche données — La reprise au niveau de la couche de données dépend des intergiciels (par exemple, ApsaraDB RDS) et n'est pas abordée ici.
Comparaison de la reprise après sinistre au niveau de la zone avec d'autres approches
| Approche | Latence réseau | Étendue de la protection | Complexité |
|---|---|---|---|
| Reprise après sinistre au niveau de la zone (cette rubrique) | Faible — même région | Pannes au niveau de la zone (coupure de courant, interruption réseau, incendie) | Faible |
| Redondance géographique active | Plus élevée — inter-régions | Sinistres au niveau de la région (inondation, tremblement de terre) | Élevée |
| Trois centres de données sur deux zones | Faible + plus élevée | Combinaison des niveaux zone et région | La plus élevée |
Passerelle multi-clusters ALB vs distribution du trafic basée sur DNS
La distribution du trafic basée sur DNS nécessite une adresse IP d'équilibreur de charge distincte pour chaque cluster et s'appuie sur la mise en cache DNS lors du basculement, ce qui entraîne des interruptions de service temporaires. La passerelle multi-clusters ALB :
Utilise une seule adresse IP pour la région, avec un déploiement multi-zones par défaut
Prend en charge le transfert de requêtes de couche 7 et le routage basé sur des pondérations
Bascule vers les pods backend d'un autre cluster sans délai lié au cache DNS côté client
Permet de gérer toutes les règles de trafic depuis l'instance Fleet — aucun contrôleur Ingress par cluster n'est nécessaire
Architecture
Cet exemple utilise une application web (un Deployment et un Service) pour illustrer la reprise après sinistre au niveau de la zone dans la région Chine (Hong Kong) :
Le cluster 1 s'exécute dans la zone de disponibilité 1 ; le cluster 2 s'exécute dans la zone de disponibilité 2.
ACK One GitOps distribue
web-demovers les deux clusters.Un AlbConfig sur l'instance Fleet crée une passerelle multi-clusters ALB qui achemine le trafic vers les deux clusters.
Les annotations de pondération Ingress contrôlent la répartition du trafic. Lorsqu'un cluster est défectueux, ALB transfère automatiquement le trafic vers l'autre.
La synchronisation des données (ApsaraDB RDS) dépend des intergiciels et n'est pas abordée ici.
Prérequis
Assurez-vous de disposer des éléments suivants :
Fonctionnalité de gestion Fleet activée. Consultez la section Activer la gestion multi-clusters
Deux clusters ACK associés à l'instance Fleet, dans le même cloud privé virtuel (VPC). Consultez la section Gérer les clusters associés
Règles entrantes du groupe de sécurité de chaque cluster associé configurées pour autoriser tout le trafic provenant du bloc CIDR du vSwitch (requis pour permettre à ALB d'atteindre les pods backend)
kubeconfig de l'instance Fleet téléchargé depuis la console ACK One, avec kubectl connecté
La dernière version d'Alibaba Cloud CLI installée et configurée
Étape 1 : Distribuer l'application sur plusieurs clusters
Utilisez GitOps pour déployer web-demo sur les deux clusters associés. Vous pouvez également créer une application multi-clusters ou commencer avec la distribution d'applications.
Connectez-vous à la console ACK One. Dans le volet de navigation de gauche, sélectionnez Fleet > Multi-cluster Applications.
Sur la page Multi-cluster Applications, cliquez sur
à côté du nom de l'instance Fleet et sélectionnez votre instance Fleet.-
Sélectionnez Create Multi-cluster Application > GitOps pour accéder à la page Create Multi-cluster Application - GitOps.
Si GitOps n'est pas activé, activez GitOps pour l'instance Fleet . Pour autoriser l'accès Internet, activez l'accès public à Argo CD .
-
Dans l'onglet Create from YAML, collez l'ApplicationSet suivant et cliquez sur OK.
Cet ApplicationSet déploie
web-demosur chaque cluster associé. L'onglet Quick Create propose une alternative basée sur un formulaire — les modifications sont synchronisées automatiquement avec l'onglet Create from YAML .apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: appset-web-demo namespace: argocd spec: template: metadata: name: '{{.metadata.annotations.cluster_id}}-web-demo' namespace: argocd spec: destination: name: '{{.name}}' namespace: gateway-demo project: default source: repoURL: https://github.com/AliyunContainerService/gitops-demo.git path: manifests/helm/web-demo targetRevision: main helm: valueFiles: - values.yaml parameters: - name: envCluster value: '{{.metadata.annotations.cluster_name}}' syncPolicy: automated: {} syncOptions: - CreateNamespace=true generators: - clusters: selector: matchExpressions: - values: - cluster key: argocd.argoproj.io/secret-type operator: In - values: - in-cluster key: name operator: NotIn goTemplateOptions: - missingkey=error syncPolicy: preserveResourcesOnDeletion: false goTemplate: true
Étape 2 : Créer la passerelle multi-clusters ALB
Créez un AlbConfig sur l'instance Fleet pour provisionner une instance ALB et y associer vos clusters.
Récupérez deux ID de vSwitch dans le VPC de l'instance Fleet.
-
Créez le fichier
gateway.yamlavec le contenu suivant. Remplacez${vsw-id1}et${vsw-id2}par les ID de vSwitch obtenus à l'étape précédente, et${cluster1}et${cluster2}par les ID des clusters associés.apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: ackone-gateway-demo annotations: # Cluster IDs to associate with the ALB instance alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2} spec: config: name: one-alb-demo addressType: Internet addressAllocatedMode: Fixed zoneMappings: - vSwitchId: ${vsw-id1} - vSwitchId: ${vsw-id2} listeners: - port: 8001 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: ackone-gateway-demoParamètres clés :
Paramètre Obligatoire Description metadata.nameOui Nom de l'AlbConfig. metadata.annotations: alb.ingress.kubernetes.io/remote-clustersOui ID de clusters séparés par des virgules. Les clusters doivent déjà être associés à l'instance Fleet. spec.config.nameNon Nom de l'instance ALB. spec.config.addressTypeNon Type de réseau : Internet(par défaut, exposé publiquement) ouIntranet(interne au VPC). Les instances ALB exposées sur Internet nécessitent une adresse IP élastique (EIP) et entraînent des frais d'instance et de bande passante. Consultez la section Paiement à l'utilisation.spec.config.zoneMappingsOui ID de vSwitch. Spécifiez au moins deux zones prises en charge par ALB pour garantir la haute disponibilité. Consultez les sections Régions et zones où ALB est disponible et Créer et gérer un vSwitch. spec.listenersNon Port et protocole de l'écouteur. L'exemple définit HTTP sur le port 8001. Conservez cette configuration — les Ingress ALB nécessitent un écouteur avant de pouvoir acheminer le trafic. -
Appliquez la configuration :
kubectl apply -f gateway.yaml -
Attendez 1 à 3 minutes, puis vérifiez que la passerelle multi-clusters ALB a été créée :
kubectl get albconfig ackone-gateway-demoRésultat attendu :
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE ackone-gateway-demo alb-xxxx alb-xxxx.<regionid>.alb.aliyuncs.com 4d9hNotez la valeur
DNSNAME— vous en aurez besoin à l'étape 4. -
Vérifiez que les clusters sont connectés à la passerelle :
kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'Le résultat liste les ID des clusters associés.
Étape 3 : Configurer les règles de routage Ingress
Créez un namespace et un Ingress sur l'instance Fleet. Les annotations de pondération Ingress contrôlent la répartition du trafic entre les clusters.
Créez le namespace
gateway-demosur l'instance Fleet. Il doit correspondre au namespace des Services de l'application déployée.-
Créez le fichier
ingress-demo.yamlavec le contenu suivant. Remplacez${cluster1-id}et${cluster2-id}par les ID réels des clusters.Les pondérations dans les annotations
alb.ingress.kubernetes.io/cluster-weight.*doivent totaliser 100.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: | [{"HTTP": 8001}] alb.ingress.kubernetes.io/cluster-weight.${cluster1-id}: "20" alb.ingress.kubernetes.io/cluster-weight.${cluster2-id}: "80" name: web-demo namespace: gateway-demo spec: ingressClassName: alb rules: - host: alb.ingress.alibaba.com http: paths: - path: /svc1 pathType: Prefix backend: service: name: service1 port: number: 80 -
Appliquez l'Ingress :
kubectl apply -f ingress-demo.yaml -n gateway-demo
Étape 4 : Vérifier la reprise après sinistre au niveau de la zone
Vérifier la distribution pondérée du trafic
Envoyez 500 requêtes pour confirmer la répartition du trafic 20/80 entre les clusters.
Remplacez alb-xxxx.<regionid>.alb.aliyuncs.com par la valeur DNSNAME obtenue à l'étape 2.
for i in {1..500}; do curl -H "host: alb.ingress.alibaba.com" alb-xxxx.<regionid>.alb.aliyuncs.com:8001/svc1; done > res.txt
Les résultats montrent environ 20 % des réponses provenant du cluster 1 (poc-ack-1) et 80 % du cluster 2 (poc-ack-2) :

Simuler une panne de cluster et vérifier le basculement automatique
-
Démarrez un flux continu de requêtes :
for i in {1..500}; do curl -H "host: alb.ingress.alibaba.com" alb-xxxx.<regionid>.alb.aliyuncs.com:8001/svc1; sleep 1; done Pendant l'exécution des requêtes, réduisez le nombre de réplicas du Deployment de l'application dans le cluster 2 à 0.
-
Observez le résultat : après la prise en compte de la modification, tout le trafic bascule automatiquement vers le cluster 1.

ALB détecte l'absence de pods sains dans le cluster 2 et achemine toutes les requêtes vers le cluster 1.