Todos os produtos
Search
Central de documentação

Server Load Balancer:Implementar recuperação de desastres entre zonas com um gateway multicluste ALB no ACK One

Última atualização: Sep 02, 2026

Roteie o tráfego entre zonas por peso e execute failover automaticamente quando um cluster ficar indisponível.

Como funciona

Uma arquitetura de negócios possui três camadas: acesso, aplicação e dados. A recuperação de desastres entre zonas aborda cada uma delas:

  • Camada de acesso — O Distributed Cloud Container Platform for Kubernetes (ACK One) implanta a instância ALB em várias zonas dentro de uma região por padrão, garantindo alta disponibilidade do ponto de entrada.

  • Camada de aplicação — Um gateway multicluste ALB distribui o tráfego entre clusters em diferentes AZs com regras de Ingress baseadas em peso. Quando um cluster falha, o ALB detecta pods não saudáveis e redireciona o tráfego automaticamente para o cluster restante.

  • Camada de dados — A recuperação da camada de dados depende de middleware (por exemplo, ApsaraDB RDS) e não é abordada neste tópico.

Recuperação de desastres entre zonas comparada a outras abordagens

Abordagem

Latência de rede

Escopo de proteção

Complexidade

Recuperação de desastres entre zonas (este tópico)

Baixa — mesma região

Falhas no nível de zona (queda de energia, interrupção de rede, incêndio)

Baixa

Redundância geográfica ativa

Mais alta — entre regiões

Desastres no nível de região (enchente, terremoto)

Alta

Três data centers em duas zonas

Baixa + mais alta

Combinação de falhas de zona e de região

Mais alta

Gateway multicluste ALB versus distribuição de tráfego baseada em DNS

A distribuição de tráfego baseada em DNS exige um endereço IP de balanceador de carga separado por cluster e depende do cache de DNS durante o failover, causando interrupções temporárias do service. O gateway multicluste ALB oferece as seguintes vantagens:

  • Utiliza um único endereço IP para a região, com implantação multizona por padrão

  • Suporta encaminhamento de requisições na camada 7 e roteamento baseado em peso

  • Executa failover para pods de backend em outro cluster sem atrasos causados pelo cache de DNS no cliente

  • Permite gerenciar todas as regras de tráfego a partir da instância Fleet, eliminando a necessidade de um controlador de Ingress por cluster

Arquitetura

Este exemplo usa uma aplicação web (um Deployment e um Service) para demonstrar a recuperação de desastres entre zonas na região China (Hong Kong):

image

  • O Cluster 1 executa na AZ 1; o Cluster 2 executa na AZ 2.

  • O ACK One GitOps distribui o web-demo para ambos os clusters.

  • Um AlbConfig na instância Fleet cria um gateway multicluste ALB que roteia o tráfego entre os dois clusters.

  • Anotações de peso no Ingress controlam a divisão do tráfego. Quando um cluster está não saudável, o ALB transfere o tráfego automaticamente para o outro.

  • A sincronização de dados (ApsaraDB RDS) depende de middleware e não é abordada neste tópico.

Pré-requisitos

Certifique-se de ter:

Etapa 1: Distribuir a aplicação para vários clusters

Use o GitOps para implantar o web-demo em ambos os clusters associados. Você também pode criar uma aplicação multicluste ou começar a usar a distribuição de aplicações.

  1. Faça login no console do ACK One. No painel de navegação à esquerda, escolha Fleet > Multi-cluster Applications.

  2. Na página Multi-cluster Applications, clique em Dingtalk_20231226104633.jpg ao lado do nome da instância Fleet e selecione sua instância Fleet.

  3. Escolha Create Multi-cluster Application > GitOps para acessar a página Create Multi-cluster Application - GitOps.

    Se o GitOps não estiver habilitado, habilite o GitOps para a instância Fleet . Para permitir acesso pela internet, habilite o acesso público ao Argo CD .
  4. Na aba Create from YAML, cole o seguinte ApplicationSet e clique em OK.

    Este ApplicationSet implanta o web-demo em cada cluster associado. A aba Quick Create oferece uma alternativa baseada em formulário — as alterações são sincronizadas automaticamente com a aba 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

Etapa 2: Criar o gateway multicluste ALB

Crie um AlbConfig na instância Fleet para provisionar uma instância ALB e associar seus clusters a ela.

  1. Obtenha dois IDs de vSwitch na VPC da instância Fleet.

  2. Crie o arquivo gateway.yaml com o conteúdo a seguir. Substitua ${vsw-id1} e ${vsw-id2} pelos IDs de vSwitch da etapa anterior, e ${cluster1} e ${cluster2} pelos IDs dos clusters associados.

    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-demo

    Parâmetros principais:

    Parâmetro

    Obrigatório

    Descrição

    metadata.name

    Sim

    Nome do AlbConfig.

    metadata.annotations: alb.ingress.kubernetes.io/remote-clusters

    Sim

    IDs de cluster separados por vírgula. Os clusters já devem estar associados à instância Fleet.

    spec.config.name

    Não

    Nome da instância ALB.

    spec.config.addressType

    Não

    Tipo de rede: Internet (padrão, voltado para a internet) ou Intranet (interno à VPC). Instâncias ALB voltadas para a internet exigem um elastic IP address (EIP) e geram taxas de instância e largura de banda. Consulte Pagamento conforme o uso.

    spec.config.zoneMappings

    Sim

    IDs de vSwitch. Especifique pelo menos duas zonas suportadas pelo ALB para garantir alta disponibilidade. Consulte Regiões e zonas onde o ALB está disponível e Criar e gerenciar um vSwitch.

    spec.listeners

    Não

    Porta e protocolo do listener. O exemplo define HTTP na porta 8001. Mantenha esta configuração — os Ingresses do ALB exigem um listener antes de poderem rotear tráfego.

  3. Aplique a configuração:

    kubectl apply -f gateway.yaml
  4. Aguarde de 1 a 3 minutos e verifique se o gateway multicluste ALB foi criado:

    kubectl get albconfig ackone-gateway-demo

    Saída esperada:

    NAME                  ALBID      DNSNAME                               PORT&PROTOCOL   CERTID   AGE
    ackone-gateway-demo   alb-xxxx   alb-xxxx.<regionid>.alb.aliyuncs.com                           4d9h

    Anote o valor de DNSNAME — você precisará dele na Etapa 4.

  5. Verifique se os clusters estão conectados ao gateway:

    kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'

    A saída lista os IDs dos clusters associados.

Etapa 3: Configurar regras de roteamento de Ingress

Crie um namespace e um Ingress na instância Fleet. As anotações de peso do Ingress controlam como o tráfego é dividido entre os clusters.

  1. Crie o namespace gateway-demo na instância Fleet. Ele deve corresponder ao namespace dos Services da aplicação implantada.

  2. Crie o arquivo ingress-demo.yaml com o conteúdo a seguir. Substitua ${cluster1-id} e ${cluster2-id} pelos IDs reais dos clusters.

    A soma dos pesos nas anotações alb.ingress.kubernetes.io/cluster-weight.* deve ser igual a 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
  3. Aplique o Ingress:

    kubectl apply -f ingress-demo.yaml -n gateway-demo

Etapa 4: Verificar a recuperação de desastres entre zonas

Verificar a distribuição ponderada de tráfego

Envie 500 requisições para confirmar a divisão de tráfego 20/80 entre os clusters.

Substitua alb-xxxx.<regionid>.alb.aliyuncs.com pelo DNSNAME obtido na Etapa 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

Os resultados mostram aproximadamente 20% das respostas vindas do Cluster 1 (poc-ack-1) e 80% do Cluster 2 (poc-ack-2):

image

Simular uma falha de cluster e verificar o failover automático

  1. Inicie um fluxo contínuo de requisições:

    for i in {1..500}; do curl -H "host: alb.ingress.alibaba.com" alb-xxxx.<regionid>.alb.aliyuncs.com:8001/svc1; sleep 1; done
  2. Enquanto as requisições estiverem em execução, escale o Deployment da aplicação no Cluster 2 para 0 réplicas.

  3. Observe a saída: após a alteração entrar em vigor, todo o tráfego será transferido automaticamente para o Cluster 1.

    image

O ALB detecta que não há pods saudáveis no Cluster 2 e roteia todas as requisições para o Cluster 1.

Próximas etapas