La passerelle multi-clusters Application Load Balancer (ALB) de Distributed Cloud Container Platform for Kubernetes (ACK One) vous permet de mettre en œuvre la reprise après sinistre entre les zones de disponibilité. Le trafic est routé selon des pondérations en conditions normales et bascule automatiquement en cas de panne d'un cluster. Cette rubrique vous guide tout au long de la configuration de bout en bout, en utilisant une instance Fleet, GitOps et des annotations de pondération Ingress.
Fonctionnement
Une architecture métier classique comporte trois couches : la couche d'accès qui reçoit le trafic entrant, la couche applicative qui le traite et la couche de données qui le persiste. La reprise après sinistre au niveau des zones concerne chacune de ces couches :
Couche d'accès — ACK One déploie l'instance ALB par défaut sur plusieurs zones au sein d'une même région, ce qui rend le point d'entrée intrinsèquement hautement disponible.
Couche applicative — 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 de données — La reprise après sinistre et la synchronisation des données dépendent de middleware (par exemple, ApsaraDB RDS). Cette rubrique ne couvre pas la configuration de la couche de données.
Reprise après sinistre au niveau des zones comparée à d'autres approches
| Approche | Latence réseau | Étendue de la protection | Complexité |
|---|---|---|---|
| Reprise après sinistre au niveau des zones (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 contre 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 par cluster et s'appuie sur la mise en cache DNS lors du basculement, ce qui entraîne des interruptions de service temporaires. L'approche par 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
Cette rubrique utilise une application web (un Deployment et un Service) pour illustrer la reprise après sinistre au niveau des zones dans la région Chine (Hong Kong) :
Le cluster 1 s'exécute dans la zone 1 ; le cluster 2 s'exécute dans la zone 2.
ACK One GitOps distribue l'application
web-demoaux deux clusters.Un AlbConfig sur l'instance Fleet crée une passerelle multi-clusters ALB qui achemine le trafic vers les deux clusters.
Des 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) présente des dépendances middleware et sort du cadre de cette rubrique.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Activé la fonctionnalité de gestion Fleet — consultez la section Activer la gestion multi-clusters
Associé deux clusters ACK à l'instance Fleet, tous deux situés dans le même virtual private cloud (VPC) que l'instance Fleet — consultez la section Gérer les clusters associés
Configuré les règles entrantes du groupe de sécurité de chaque cluster associé pour autoriser le trafic provenant de toutes les adresses IP et ports au sein du bloc CIDR du vSwitch (requis pour permettre à l'instance ALB d'atteindre les pods backend)
Téléchargé le fichier kubeconfig de l'instance Fleet depuis la console ACK One et connecté un client kubectl à l'instance Fleet
Installé la dernière version d'Alibaba Cloud CLI et l'avoir configurée
Étape 1 : Distribuer l'application à plusieurs clusters
Utilisez GitOps pour déployer l'application web-demo sur les deux clusters associés. Vous pouvez également utiliser la fonctionnalité de distribution d'applications multi-clusters — consultez les sections Créer une application multi-clusters et Premiers pas avec la distribution d'applications.
Connectez-vous à la console ACK One. Dans le volet de navigation de gauche, sélectionnez Fleet > Multi-cluster Applications.
Dans le coin supérieur gauche de la page Multi-cluster Applications, cliquez sur
à droite du nom de l'instance Fleet et sélectionnez votre instance Fleet dans la liste déroulante.-
Sélectionnez Create Multi-cluster Application > GitOps pour accéder à la page Create Multi-cluster Application - GitOps.
Si GitOps n'est pas activé pour l'instance Fleet, activez-le d'abord. Consultez la section Activer GitOps pour l'instance Fleet . Pour autoriser l'accès Internet à GitOps, consultez la section Activer 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'instance Fleet. L'onglet Quick Create propose une alternative basée sur un formulaire : les modifications apportées y sont synchronisées automatiquement avec le code YAML de 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 les ID de deux vSwitch dans le VPC où réside 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 remplacez${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 des clusters à associer à l'instance ALB, séparés par des virgules. Ces 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, orienté public) ouIntranet(interne au VPC). Les instances ALB orientées 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 pour l'instance ALB. Spécifiez des vSwitch dans au moins deux zones prises en charge par ALB pour garantir la haute disponibilité. Consultez les sections Régions et zones dans lesquelles 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 l'utiliserez pour envoyer des requêtes de test à 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 où les Services de l'application sont déployés.-
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 des zones
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 à 0 le nombre de réplicas du Deployment de l'application dans le cluster 2.
-
Observez le résultat : après la prise en compte de la modification, tout le trafic bascule automatiquement et de manière transparente vers le cluster 1.

ALB détecte qu'aucun pod sain n'est disponible dans le cluster 2 et achemine toutes les requêtes suivantes vers le cluster 1 de manière transparente.