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):
O Cluster 1 executa na AZ 1; o Cluster 2 executa na AZ 2.
O ACK One GitOps distribui o
web-demopara 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:
Recurso de gerenciamento de Fleet habilitado. Consulte Habilitar gerenciamento multicluste
Dois clusters ACK associados à instância Fleet, na mesma virtual private cloud (VPC). Consulte Gerenciar clusters associados
Regras de entrada do grupo de segurança de cada cluster associado configuradas para permitir todo o tráfego do bloco CIDR do vSwitch (necessário para que o ALB alcance os pods de backend)
Kubeconfig da instância Fleet baixado do console do ACK One, com kubectl conectado
A versão mais recente da CLI do Alibaba Cloud instalada e configurada
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.
Faça login no console do ACK One. No painel de navegação à esquerda, escolha Fleet > Multi-cluster Applications.
Na página Multi-cluster Applications, clique em
ao lado do nome da instância Fleet e selecione sua instância Fleet.-
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 .
-
Na aba Create from YAML, cole o seguinte ApplicationSet e clique em OK.
Este ApplicationSet implanta o
web-demoem 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.
Obtenha dois IDs de vSwitch na VPC da instância Fleet.
-
Crie o arquivo
gateway.yamlcom 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-demoParâmetros principais:
Parâmetro
Obrigatório
Descrição
metadata.nameSim
Nome do AlbConfig.
metadata.annotations: alb.ingress.kubernetes.io/remote-clustersSim
IDs de cluster separados por vírgula. Os clusters já devem estar associados à instância Fleet.
spec.config.nameNão
Nome da instância ALB.
spec.config.addressTypeNão
Tipo de rede:
Internet(padrão, voltado para a internet) ouIntranet(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.zoneMappingsSim
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.listenersNã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.
-
Aplique a configuração:
kubectl apply -f gateway.yaml -
Aguarde de 1 a 3 minutos e verifique se o gateway multicluste ALB foi criado:
kubectl get albconfig ackone-gateway-demoSaída esperada:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE ackone-gateway-demo alb-xxxx alb-xxxx.<regionid>.alb.aliyuncs.com 4d9hAnote o valor de
DNSNAME— você precisará dele na Etapa 4. -
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.
Crie o namespace
gateway-demona instância Fleet. Ele deve corresponder ao namespace dos Services da aplicação implantada.-
Crie o arquivo
ingress-demo.yamlcom 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 -
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):

Simular uma falha de cluster e verificar o failover automático
-
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 Enquanto as requisições estiverem em execução, escale o Deployment da aplicação no Cluster 2 para 0 réplicas.
-
Observe a saída: após a alteração entrar em vigor, todo o tráfego será transferido automaticamente para o Cluster 1.

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