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:
Implante sua aplicação em vários clusters ACK em diferentes AZs usando o Argo CD.
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 aingressClassespecificada em todos os clusters associados.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:
Habilitado o recurso de Gerenciamento de Fleet
Associado dois clusters ACK à instância de fleet na mesma Virtual Private Cloud (VPC) — consulte Associar clusters
Baixado o arquivo kubeconfig da instância de fleet no Console do ACK One e conectado o kubectl a ele
Habilitado o recurso de gateway multi-cluster — consulte as Regras de faturamento para preços
Criado um namespace
gateway-demona instância de fleet (deve corresponder ao namespace onde a aplicação está implantada nos clusters associados)
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
Faça login no Console do ACK One. No painel de navegação à esquerda, escolha Fleet > Multi-cluster Applications.
-
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 .
-
Adicione o repositório da aplicação.
No painel de navegação à esquerda do Argo CD, clique em Settings e escolha Repositories > + Connect Repo.
-
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.gitSkip server verification
Selecione esta caixa de seleção

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

-
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
envClusteradequadamente.Seção
Parâmetro
Valor
GENERAL
Application Name
Um nome exclusivo para a aplicação
Project Name
defaultSYNC 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 NAMESPACESOURCE
Repository URL
https://github.com/AliyunContainerService/gitops-demo.gitRevision
Branches:
gateway-demoPath
manifests/helm/web-demoDESTINATION
Cluster URL
Selecione a URL do Cluster 1 (ou do Cluster 2 para a segunda aplicação)
Namespace
gateway-demoHelm > Parameters
envClustercluster-demo-1para o Cluster 1,cluster-demo-2para o Cluster 2
Implantar usando a CLI do Argo CD
-
Adicione o repositório git.
argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name ackone-gitops-demosSaída esperada:
Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added -
Verifique se o repositório foi adicionado e confirme se ambos os clusters estão registrados.
argocd repo listSaí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 defaultargocd cluster listSaí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. -
Crie o manifesto da aplicação. Substitua
repoURLpela 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.yamlapiVersion: 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 -
Implante as aplicações.
kubectl apply -f apps-web-demo.yaml -
Verifique se ambas as aplicações estão sincronizadas e íntegras.
argocd app listSaí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.
Obtenha os IDs dos vSwitches da instância de fleet — consulte Obter um ID de vSwitch.
-
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-clustersIDs separados por vírgula dos clusters a serem adicionados ao gateway. Devem ser clusters já associados à instância de fleet.
spec.nameNome 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
ingressClassestá definido comomse.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 -
Implante o gateway.
kubectl apply -f gateway.yaml -
Aguarde até que o gateway atinja o status
Listening. A fasePending, durante a qual o gateway nativo da nuvem é criado, pode levar cerca de 3 minutos.Status
Descrição
PendingO gateway está sendo provisionado (~3 minutos)
RunningO gateway foi criado e está em execução
ListeningO gateway está em execução e monitorando recursos de Ingress
FailedO gateway é inválido; verifique o campo
Statuspara detalheskubectl get mseingressconfig ackone-gateway-hongkongSaída esperada:
NAME STATUS AGE ackone-gateway-hongkong Listening 3m15sValores de status do gateway:
-
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.
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.

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
-
Obtenha o endereço IP público do gateway multi-cluster.
kubectl get ingress web-demo -n gateway-demo -ojsonpath="{.status.loadBalancer}" -
Envie 100 requisições e observe a distribuição do tráfego. Substitua
XX.XX.XX.XXpelo endereço IP do gateway.for i in {1..100}; do curl -H "host: example.com" XX.XX.XX.XX; doneResultado esperado: O tráfego é distribuído entre o Cluster 1 e o Cluster 2 na proporção de 9:1.

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

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.
-
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-demokubectl apply -f new-app.yaml -
Crie um Ingress canário baseado em cabeçalho na instância de fleet. Requisições com o cabeçalho
canary-dest: cluster1são roteadas para o Service canário. new-ingress.yamlAnotação
Descrição
nginx.ingress.kubernetes.io/canaryDefina como
"true"para habilitar o roteamento baseado em cabeçalho para este Ingressnginx.ingress.kubernetes.io/canary-by-headerA chave do cabeçalho a ser correspondida (
canary-dest)nginx.ingress.kubernetes.io/canary-by-header-valueO 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: 80kubectl apply -f new-ingress.yaml -
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; doneResultado esperado: Todas as requisições com
canary-dest: cluster1são tratadas pela versão canário no Cluster 1.
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).

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 |
|
|
Um rótulo legível para o subconjunto do serviço. Use um nome que indique o cluster de destino. |
|
|
O ID do cluster para o qual rotear, usando o rótulo |
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
-
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.yamlapiVersion: 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: 80kubectl 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.
-
Crie o Ingress canário direcionado ao Cluster 2. Substitua
${cluster2-id}pelo ID real do cluster. ingress-demo-cluster-gray.yamlapiVersion: 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: 80kubectl apply -f ingress-demo-cluster-gray.yaml -n gateway-demo
Verificar a recuperação de desastres primário/secundário
-
Obtenha o endereço IP público do gateway multi-cluster.
kubectl get ingress web-demo -n gateway-demo -ojsonpath="{.status.loadBalancer}" -
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; doneResultado esperado: Todo o tráfego padrão é tratado pelo Cluster 1.

-
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; doneResultado esperado: Todas as requisições com
app-web-demo-version: graysão tratadas pelo Cluster 2.
-
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.

Próximos passos
Gerenciar tráfego norte-sul — explore todas as capacidades de gerenciamento de tráfego dos gateways multi-cluster do ACK One
Guia de início rápido do GitOps — saiba mais sobre como implantar aplicações com o Argo CD no ACK One