Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Recuperação de desastres entre zonas com um gateway multi-cluster ACK One MSE

Última atualização: Jun 27, 2026

Os gateways multi-cluster do ACK One permitem criar recuperação de desastres no nível de zona para aplicações em vários clusters Kubernetes, sem gerenciar endereços IP de balanceador de carga separados por cluster ou instalar controladores de Ingress em cada cluster. Este tópico detalha dois modos de recuperação — redundância ativa entre zonas e primário/secundário — usando uma aplicação de exemplo implantada via GitOps em dois clusters ACK em diferentes zonas de disponibilidade (AZs) na região China (Hong Kong).

Os gateways multi-cluster lidam apenas com o failover de tráfego da Camada 7. A recuperação de desastres de dados está fora do escopo deste recurso.

Como funciona

Os gateways multi-cluster do ACK One baseiam-se em Ingresses gerenciados do Microservices Engine (MSE). Em conjunto com o ACK One GitOps (Argo CD), a configuração opera da seguinte forma:

  1. Implante sua aplicação em vários clusters ACK em diferentes AZs usando o Argo CD.

  2. Crie um gateway multi-cluster (MseIngressConfig) na instância de fleet. O gateway provisiona um único endereço IP de Server Load Balancer (SLB) no nível da região e descobre automaticamente os recursos de Ingress com a ingressClass especificada em todos os clusters associados.

  3. Crie objetos Ingress na instância de fleet para definir as regras de roteamento de tráfego. O gateway encaminha as requisições para os Services de backend nos clusters associados e executa o failover automático do tráfego caso um cluster apresente falha.

Componentes principais:

Componente

Função

Instância de fleet do ACK One

Plano de controle para gerenciar recursos multi-cluster; local onde você cria o gateway e os objetos Ingress

MSE Ingress (MseIngressConfig)

Gateway nativo da nuvem que gerencia roteamento da Camada 7, balanceamento de carga e failover entre clusters

Argo CD (GitOps)

Implanta e sincroniza a aplicação em vários clusters ACK a partir de um repositório git

Clusters ACK (Cluster 1, Cluster 2)

Clusters de carga de trabalho em AZs separadas que executam a aplicação; adicionados ao gateway como backends

Modos de recuperação

Ambos os modos protegem contra falhas no nível de AZ. A diferença reside na distribuição do tráfego em condições normais.

Modo

Distribuição normal de tráfego

Comportamento de failover

Mais indicado para

Redundância ativa entre zonas

Balanceado entre todos os clusters pela proporção de réplicas

Rerroteia automaticamente para clusters íntegros

Aplicações stateless que podem escalar horizontalmente

Primário/secundário

Todo o tráfego vai para o cluster primário

Rerroteia automaticamente para o secundário quando o primário falha

Aplicações com backends stateful (bancos de dados, caches) onde o modelo ativo-ativo adiciona complexidade

Pré-requisitos

Antes de começar, certifique-se de ter:

Etapa 1: Implantar a aplicação em vários clusters

Use o Argo CD para implantar a aplicação web-demo tanto no Cluster 1 quanto no Cluster 2. A aplicação consiste em um Deployment e um Service.

Escolha a interface do usuário ou a CLI do Argo CD.

Implantar usando a interface do Argo CD

  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 GitOps, clique em GitOps Console.

    Se o GitOps ainda não estiver habilitado, clique em Enable GitOps . Para acessar o GitOps pela rede pública, consulte Habilitar acesso público ao Argo CD .
  3. Adicione o repositório da aplicação.

    1. No painel de navegação à esquerda do Argo CD, clique em Settings e escolha Repositories > + Connect Repo.

    2. Configure os seguintes parâmetros e clique em CONNECT.

      Seção

      Parâmetro

      Valor

      Choose your connection method

      VIA HTTP/HTTPS

      CONNECT REPO USING HTTP/HTTPS

      Type

      git

      Project

      default

      Repository URL

      https://github.com/AliyunContainerService/gitops-demo.git

      Skip server verification

      Selecione esta caixa de seleção

      image.png

      Quando a conexão for bem-sucedida, CONNECTION STATUS exibirá Successful.

      image.png

  4. Crie uma aplicação para cada cluster. Na página Applications, clique em + NEW APP e configure os parâmetros a seguir. Repita esta etapa para o Cluster 2, substituindo a URL do cluster e o valor de envCluster adequadamente.

    Seção

    Parâmetro

    Valor

    GENERAL

    Application Name

    Um nome exclusivo para a aplicação

    Project Name

    default

    SYNC POLICY

    Manual (sincronização sob demanda) ou Automatic (o Argo CD verifica o repositório git a cada 3 minutos e implanta alterações automaticamente)

    SYNC OPTIONS

    Selecione AUTO-CREATE NAMESPACE

    SOURCE

    Repository URL

    https://github.com/AliyunContainerService/gitops-demo.git

    Revision

    Branches: gateway-demo

    Path

    manifests/helm/web-demo

    DESTINATION

    Cluster URL

    Selecione a URL do Cluster 1 (ou do Cluster 2 para a segunda aplicação)

    Namespace

    gateway-demo

    Helm > Parameters

    envCluster

    cluster-demo-1 para o Cluster 1, cluster-demo-2 para o Cluster 2

Implantar usando a CLI do Argo CD

  1. Adicione o repositório git.

    argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name ackone-gitops-demos

    Saída esperada:

    Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added
  2. Verifique se o repositório foi adicionado e confirme se ambos os clusters estão registrados.

    argocd repo list

    Saída esperada:

    TYPE  NAME  REPO                                                       INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
    git         https://github.com/AliyunContainerService/gitops-demo.git  false     false  false  false  Successful           default
    argocd cluster list

    Saída esperada da lista de clusters:

    SERVER                          NAME                                        VERSION  STATUS      MESSAGE                                                  PROJECT
    https://1.1.XX.XX:6443      c83f3cbc90a****-temp01   1.22+    Successful
    https://2.2.XX.XX:6443      c83f3cbc90a****-temp02   1.22+    Successful
    https://kubernetes.default.svc  in-cluster                                           Unknown     Cluster has no applications and is not being monitored.
  3. Crie o manifesto da aplicação. Substitua repoURL pela URL real do seu repositório e substitua ${cluster1_url} e ${cluster2_url} pelas URLs do servidor de API dos clusters obtidas na etapa anterior. apps-web-demo.yaml

    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: app-demo-cluster1
      namespace: argocd
    spec:
      destination:
        namespace: gateway-demo
        # https://1.1.XX.XX:6443
        server: ${cluster1_url}
      project: default
      source:
        helm:
          releaseName: "web-demo"
          parameters:
          - name: envCluster
            value: cluster-demo-1
          valueFiles:
          - values.yaml
        path: manifests/helm/web-demo
        repoURL: https://github.com/AliyunContainerService/gitops-demo.git
        targetRevision: gateway-demo
      syncPolicy:
        syncOptions:
        - CreateNamespace=true
    ---
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: app-demo-cluster2
      namespace: argocd
    spec:
      destination:
        namespace: gateway-demo
        server: ${cluster2_url}
      project: default
      source:
        helm:
          releaseName: "web-demo"
          parameters:
          - name: envCluster
            value: cluster-demo-2
          valueFiles:
          - values.yaml
        path: manifests/helm/web-demo
        repoURL: https://github.com/AliyunContainerService/gitops-demo.git
        targetRevision: gateway-demo
      syncPolicy:
        syncOptions:
        - CreateNamespace=true
  4. Implante as aplicações.

    kubectl apply -f apps-web-demo.yaml
  5. Verifique se ambas as aplicações estão sincronizadas e íntegras.

    argocd app list

    Saída esperada:

    NAME                      CLUSTER                  NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                                       PATH                     TARGET
    argocd/web-demo-cluster1  https://10.1.XX.XX:6443             default  Synced  Healthy  Auto        <none>      https://github.com/AliyunContainerService/gitops-demo.git  manifests/helm/web-demo  main
    argocd/web-demo-cluster2  https://10.1.XX.XX:6443             default  Synced  Healthy  Auto        <none>      https://github.com/AliyunContainerService/gitops-demo.git  manifests/helm/web-demo  main

Etapa 2: Criar o gateway multi-cluster

Crie um recurso MseIngressConfig na instância de fleet para provisionar o gateway e associar ambos os clusters como backends.

  1. Obtenha os IDs dos vSwitches da instância de fleet — consulte Obter um ID de vSwitch.

  2. Crie o manifesto do gateway. gateway.yaml

    Substitua ${vsw-id1} e ${vsw-id2} pelos IDs dos vSwitches, e ${cluster1} e ${cluster2} pelos IDs dos clusters associados. Para cada cluster associado, configure as regras de entrada do grupo de segurança para permitir o acesso de todos os endereços IP e portas no bloco CIDR do vSwitch.

    Parâmetro

    Descrição

    mse.alibabacloud.com/remote-clusters

    IDs separados por vírgula dos clusters a serem adicionados ao gateway. Devem ser clusters já associados à instância de fleet.

    spec.name

    Nome da instância do gateway.

    spec.common.instance.spec

    (Opcional) Tipo de instância. Padrão: 4c8g.

    spec.common.instance.replicas

    (Opcional) Número de réplicas do gateway. Padrão: 3.

    spec.ingress.local.ingressClass

    (Opcional) Nome da classe de Ingress a ser escutada. O gateway escuta todos os recursos de Ingress na instância de fleet onde ingressClass está definido como mse.

    apiVersion: mse.alibabacloud.com/v1alpha1
    kind: MseIngressConfig
    metadata:
      annotations:
        mse.alibabacloud.com/remote-clusters: ${cluster1},${cluster2}
      name: ackone-gateway-hongkong
    spec:
      common:
        instance:
          replicas: 3
          spec: 2c4g
        network:
          vSwitches:
          - ${vsw-id}
      ingress:
        local:
          ingressClass: mse
      name: mse-ingress
  3. Implante o gateway.

    kubectl apply -f gateway.yaml
  4. Aguarde até que o gateway atinja o status Listening. A fase Pending, durante a qual o gateway nativo da nuvem é criado, pode levar cerca de 3 minutos.

    Status

    Descrição

    Pending

    O gateway está sendo provisionado (~3 minutos)

    Running

    O gateway foi criado e está em execução

    Listening

    O gateway está em execução e monitorando recursos de Ingress

    Failed

    O gateway é inválido; verifique o campo Status para detalhes

    kubectl get mseingressconfig ackone-gateway-hongkong

    Saída esperada:

    NAME                      STATUS      AGE
    ackone-gateway-hongkong   Listening   3m15s

    Valores de status do gateway:

  5. Confirme se ambos os clusters foram adicionados com sucesso.

    kubectl get mseingressconfig ackone-gateway-hongkong -ojsonpath="{.status.remoteClusters}"

    Saída esperada:

    [{"clusterId":"c7fb82****"},{"clusterId":"cd3007****"}]

    Ambos os IDs de cluster aparecem sem mensagem de Failed, confirmando que os clusters estão conectados ao gateway.

Etapa 3: Configurar a recuperação de desastres entre zonas usando Ingress

O gateway multi-cluster utiliza recursos de Ingress definidos na instância de fleet para rotear o tráfego entre os clusters. Crie os objetos Ingress no namespace gateway-demo — o mesmo namespace onde a aplicação está implantada.

Importante

O namespace gateway-demo deve existir na instância de fleet antes da criação dos recursos de Ingress.

Escolha o modo de recuperação adequado à sua aplicação:

Redundância ativa entre zonas

No modo de redundância ativa entre zonas, o tráfego é balanceado entre todos os backends do cluster pela proporção de réplicas. Caso um cluster apresente falha, o gateway redireciona automaticamente sua parcela de tráfego para os demais clusters íntegros.

Exemplo: Com 9 réplicas no Cluster 1 e 1 réplica no Cluster 2, 90% do tráfego vai para o Cluster 1 e 10% para o Cluster 2 por padrão. Se todos os backends do Cluster 1 falharem, 100% do tráfego será transferido para o Cluster 2.

image.png

Criar um Ingress para redundância ativa entre zonas

Crie um Ingress que roteie o tráfego para service1 sob o domínio example.com. O gateway distribui as requisições pelo Service de mesmo nome em ambos os clusters.

ingress-demo.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-demo
spec:
  ingressClassName: mse
  rules:
  - host: example.com
    http:
      paths:
      - path: /svc1
        pathType: Exact
        backend:
          service:
            name: service1
            port:
              number: 80

Implante o Ingress na instância de fleet.

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

Verificar a redundância ativa entre zonas

  1. Obtenha o endereço IP público do gateway multi-cluster.

    kubectl get ingress web-demo -n gateway-demo -ojsonpath="{.status.loadBalancer}"
  2. Envie 100 requisições e observe a distribuição do tráfego. Substitua XX.XX.XX.XX pelo endereço IP do gateway.

    for i in {1..100}; do curl -H "host: example.com" XX.XX.XX.XX; done

    Resultado esperado: O tráfego é distribuído entre o Cluster 1 e o Cluster 2 na proporção de 9:1.

    image.png

  3. Simule uma falha de cluster dimensionando as réplicas do Deployment no Cluster 1 para 0. Todo o tráfego é automaticamente redirecionado para o Cluster 2.

    image.png

Executar implantações canário com roteamento baseado em cabeçalho

No modo de redundância ativa entre zonas, é possível testar uma versão canário em um cluster sem afetar o tráfego de produção. Implante a versão canário como um Service e um Deployment separados e use uma anotação de Ingress para rotear requisições com um cabeçalho específico para ela.

  1. Implante a aplicação canário no Cluster 1. new-app.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: service1-canary-1
      namespace: gateway-demo
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: web-demo-canary-1
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-demo-canary-1
      namespace: gateway-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: web-demo-canary-1
      template:
        metadata:
          labels:
            app: web-demo-canary-1
        spec:
          containers:
            - env:
                - name: ENV_NAME
                  value: cluster-demo-1-canary
              image: 'registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.6.0'
              imagePullPolicy: Always
              name: web-demo
    kubectl apply -f new-app.yaml
  2. Crie um Ingress canário baseado em cabeçalho na instância de fleet. Requisições com o cabeçalho canary-dest: cluster1 são roteadas para o Service canário. new-ingress.yaml

    Anotação

    Descrição

    nginx.ingress.kubernetes.io/canary

    Defina como "true" para habilitar o roteamento baseado em cabeçalho para este Ingress

    nginx.ingress.kubernetes.io/canary-by-header

    A chave do cabeçalho a ser correspondida (canary-dest)

    nginx.ingress.kubernetes.io/canary-by-header-value

    O valor do cabeçalho a ser correspondido (cluster1)

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: web-demo-canary-1
      namespace: gateway-demo
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "canary-dest"
        nginx.ingress.kubernetes.io/canary-by-header-value: "cluster1"
    spec:
      ingressClassName: mse
      rules:
      - host: example.com
        http:
          paths:
          - path: /svc1
            pathType: Exact
            backend:
              service:
                name: service1-canary-1
                port:
                  number: 80
    kubectl apply -f new-ingress.yaml
  3. Verifique se as requisições com o cabeçalho estão sendo roteadas para a versão canário.

    for i in {1..100}; do curl -H "host: example.com" -H "canary-dest: cluster1" XX.XX.XX.XX/svc1; sleep 1; done

    Resultado esperado: Todas as requisições com canary-dest: cluster1 são tratadas pela versão canário no Cluster 1.

    image.png

Recuperação de desastres primário/secundário

No modo primário/secundário, todo o tráfego vai para o Cluster 1 (primário) em condições normais. Se o Cluster 1 apresentar falha, o gateway redireciona automaticamente o tráfego para o Cluster 2 (secundário).

image.png

Este modo utiliza duas anotações específicas do MSE para fixar as rotas do Ingress em um cluster específico:

Anotação

Descrição

mse.ingress.kubernetes.io/service-subset

Um rótulo legível para o subconjunto do serviço. Use um nome que indique o cluster de destino.

mse.ingress.kubernetes.io/subset-labels

O ID do cluster para o qual rotear, usando o rótulo topology.istio.io/cluster.

Para obter uma lista completa das anotações do MSE Ingress, consulte Anotações suportadas pelos gateways MSE Ingress.

Criar um Ingress para recuperação de desastres primário/secundário

  1. Crie o Ingress primário que fixa o tráfego no Cluster 1. Substitua ${cluster1-id} pelo ID real do cluster. ingress-demo-cluster-one.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        mse.ingress.kubernetes.io/service-subset: cluster-demo-1
        mse.ingress.kubernetes.io/subset-labels: |
          topology.istio.io/cluster ${cluster1-id}
      name: web-demo-cluster-one
    spec:
      ingressClassName: mse
      rules:
      - host: example.com
        http:
          paths:
          - path: /service1
            pathType: Exact
            backend:
              service:
                name: service1
                port:
                  number: 80
    kubectl apply -f ingress-demo-cluster-one.yaml -n gateway-demo

Executar implantações canário no nível do cluster

Use um Ingress canário baseado em cabeçalho junto com o Ingress primário para rotear requisições específicas para o Cluster 2 para validação, sem alterar o caminho padrão do tráfego.

  1. Crie o Ingress canário direcionado ao Cluster 2. Substitua ${cluster2-id} pelo ID real do cluster. ingress-demo-cluster-gray.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        mse.ingress.kubernetes.io/service-subset: cluster-demo-2
        mse.ingress.kubernetes.io/subset-labels: |
          topology.istio.io/cluster ${cluster2-id}
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "app-web-demo-version"
        nginx.ingress.kubernetes.io/canary-by-header-value: "gray"
      name: web-demo-cluster-gray
    spec:
      ingressClassName: mse
      rules:
      - host: example.com
        http:
          paths:
          - path: /service1
            pathType: Exact
            backend:
              service:
                name: service1
                port:
                  number: 80
    kubectl apply -f ingress-demo-cluster-gray.yaml -n gateway-demo

Verificar a recuperação de desastres primário/secundário

  1. Obtenha o endereço IP público do gateway multi-cluster.

    kubectl get ingress web-demo -n gateway-demo -ojsonpath="{.status.loadBalancer}"
  2. Confirme se o tráfego padrão vai para o Cluster 1.

    for i in {1..100}; do curl -H "host: example.com" XX.XX.XX.XX/service1; sleep 1; done

    Resultado esperado: Todo o tráfego padrão é tratado pelo Cluster 1.

    image.png

  3. Confirme se o tráfego canário vai para o Cluster 2.

    for i in {1..50}; do curl -H "host: example.com" -H "app-web-demo-version: gray" XX.XX.XX.XX/service1; sleep 1; done

    Resultado esperado: Todas as requisições com app-web-demo-version: gray são tratadas pelo Cluster 2.

    image.png

  4. Simule uma falha no Cluster 1 dimensionando as réplicas do Deployment para 0. Todo o tráfego padrão é automaticamente redirecionado para o Cluster 2.

    image.png

Próximos passos