Falhas no nível de serviço podem causar indisponibilidade ou degradação em aplicações cloud-native. Combinado a um modelo de implantação paritária em múltiplas regiões e clusters, o Alibaba Service Mesh (ASM) redireciona o tráfego para workloads disponíveis em segundos sempre que um serviço falha, de forma transparente aos usuários. Este tópico descreve como usar o ASM para recuperação de desastres no nível de serviço.
Arquitetura de recuperação de desastres
Mecanismo de failover: failover com reconhecimento de localidade em uma service mesh
O ASM oferece um mecanismo de failover com reconhecimento de localidade. O sidecar proxy de cada workload monitora continuamente se o workload de destino retorna erros de resposta consecutivos dentro de uma janela de tempo configurável. Ao detectar falha em um workload, o sidecar proxy o remove do pool de balanceamento de carga e redireciona o tráfego para outros workloads saudáveis.
O exemplo a seguir utiliza dois clusters em duas regiões diferentes, com dois conjuntos paritários de uma aplicação implantados entre eles. Em cada cluster, os workloads de cada serviço são distribuídos uniformemente por diferentes zonas usando restrições de distribuição de topologia.
Topologia de tráfego normal: Quando todos os serviços estão saudáveis, a service mesh mantém o tráfego dentro da mesma zona para minimizar o impacto da localização de destino na latência da requisição.
Topologias de implantação de aplicações: topologias de cluster suportadas e comparação
O mecanismo de failover com reconhecimento de localidade do ASM aplica-se a diversas topologias de implantação de aplicações. Cada topologia cobre uma faixa diferente de dimensões de falha e varia em custos de recursos e complexidade de O&M.
Comparar topologias de implantação
A tabela a seguir compara as quatro topologias de implantação suportadas nas principais dimensões de decisão para ajudar você a selecionar a topologia adequada aos seus requisitos de negócio:
|
Topologia |
Cobertura de falhas |
Custo de recursos |
Complexidade de O&M |
|
Cluster único, múltiplas zonas |
Falhas no nível de zona. Não lida com configurações incorretas do Kubernetes ou falhas de dependência da aplicação. |
Baixo. Um cluster ACK e um conjunto de recursos cloud em uma única região. |
Baixa |
|
Região única, múltiplas zonas, múltiplos clusters |
Falhas no nível de zona com cobertura mais ampla por meio do isolamento de cluster. Não lida com falhas no nível de região. |
Médio. Múltiplos clusters e infraestrutura cloud em uma única região. |
Média. Serviços implantados em vários clusters. |
|
Múltiplas regiões, múltiplos clusters |
Falhas nos níveis de zona, região e cluster. |
Alto. Múltiplos clusters em várias regiões, além de conectividade de rede entre regiões. Duas instâncias de service mesh são necessárias para melhor latência de envio de configuração. |
Alta. Planejamento de rede entre regiões e O&M de múltiplos clusters. |
|
Múltiplas regiões, múltiplos clusters (multicloud) |
Falhas nos níveis de zona, região, cluster e provedor de cloud. |
Mais alto. Múltiplos clusters em diferentes provedores de cloud e regiões. |
Mais alta. Problemas de compatibilidade entre clouds e questões desconhecidas decorrentes de diferenças na infraestrutura e nas capacidades dos serviços cloud. |
Como escolher:
Comece com cluster único e múltiplas zonas se precisar de recuperação de desastres básica no nível de zona com custo e complexidade mínimos.
Adote múltiplas regiões e múltiplos clusters quando exigir alta disponibilidade que cubra falhas no nível de região. Esta é a topologia recomendada para workloads de HA em produção.
Utilize múltiplas regiões e múltiplos clusters (multicloud) quando precisar sobreviver à falha de um provedor de cloud inteiro.
Região única, múltiplas zonas e múltiplos clusters aumenta a complexidade de implantação e O&M sem oferecer failover no nível de região. Considere a implantação em múltiplas regiões e clusters se necessitar de uma cobertura de falhas mais ampla.
Implantação com cluster único e múltiplas zonas
Este é o modo de implantação mais simples para recuperação de desastres. Configure um pool de nós multizona, selecione vSwitches de várias zonas para o pool de nós e escolha a política de distribuição equilibrada ao configurar a política de dimensionamento. As instâncias ECS serão então distribuídas uniformemente pelas zonas especificadas para o grupo de dimensionamento.
Implantação com região única, múltiplas zonas e múltiplos clusters
Este modo estende o cluster único de uma implantação com cluster único e múltiplas zonas para vários clusters, cada um com sua própria configuração. Quando ocorre um failover, o ASM busca primeiro outros workloads na mesma zona e, em seguida, seleciona um dos workloads saudáveis em uma zona diferente dentro da mesma região como destino do failover. Selecione zonas distintas para os dois clusters. Se as zonas dos dois clusters se sobrepuserem, workloads na mesma zona podem ter precedência sobre workloads no mesmo cluster, o que pode gerar comportamentos inesperados para o seu negócio.
Implantação com múltiplas regiões e múltiplos clusters
Este modo transforma a implantação de região única de uma arquitetura multicluster em uma implantação multirregião. Ele mantém a implantação de cada serviço dispersa em todas as dimensões: zonas, regiões, clusters e dependências. Dessa forma, workloads saudáveis continuam atendendo ao tráfego quando ocorre uma falha por qualquer motivo.
Implantação com múltiplas regiões e clusters em ambiente multicloud
Esta é a topologia de implantação mais avançada. O ASM suporta totalmente o gerenciamento de clusters Kubernetes de qualquer provedor de cloud e de data centers on-premises. Execute dois ambientes de clusters Kubernetes em provedores de cloud diferentes, ou execute um na cloud e outro on-premises. Se uma infraestrutura falhar, a outra continua fornecendo seus serviços.
Pré-requisitos
Antes de configurar a recuperação de desastres no nível de serviço com o ASM, certifique-se de ter os seguintes recursos e permissões:
Clusters ACK — Crie um cluster Kubernetes em cada uma das duas ou mais regiões. Configure múltiplas zonas para cada cluster e ative Expose API server with EIP. Para mais informações, consulte Create an ACK managed cluster.
Instâncias do ASM — Crie uma instância do ASM em cada região onde você possui um cluster ACK. Selecione vSwitches nas mesmas zonas dos clusters ACK correspondentes. Para mais informações, consulte Step 1, Step 2 e Step 3 em Implement multi-cluster disaster recovery with an ASM multi-master control plane architecture.
Ingress gateways NLB — Crie um ingress gateway do tipo NLB em cada instância do ASM. Selecione as mesmas zonas das instâncias do ASM e dos clusters ACK para o NLB. Para mais informações, consulte Use an NLB instance for an ASM ingress gateway.
Injeção de sidecar — Ative a injeção automática de sidecar para o namespace
defaultem cada cluster. Essa configuração faz parte do gerenciamento global de namespaces no ASM. Para mais informações, consulte Manage global namespaces.Planejamento de rede — Para implantações multirregião, planeje os blocos CIDR dos seus clusters para evitar conflitos de rede. Para mais informações, consulte Plan CIDR blocks for multiple clusters.
Configuração do GTM — Configure o Global Traffic Manager (GTM) com as instâncias NLB para implementar recuperação de desastres ativo-ativo para o ingress gateway. Para mais informações, consulte How GTM implements active-active disaster recovery.
Configurar recuperação de desastres
O exemplo a seguir utiliza uma implantação com múltiplas regiões e clusters para demonstrar o processo de recuperação de desastres no nível de serviço.
Etapa 1: Preparar o ambiente
Conclua as subetapas a seguir em ordem para preparar o ambiente para a demonstração de recuperação de desastres.
Crie um cluster Kubernetes em cada uma das duas regiões e nomeie-os como
cluster-1ecluster-2. Configure múltiplas zonas para ambos os clusters e ative Expose API server with EIP. Para mais informações, consulte Create an ACK managed cluster.Nas mesmas duas regiões dos clusters ACK, crie as instâncias do ASM
mesh-1emesh-2. Ao criar as instâncias, certifique-se de selecionar vSwitches nas mesmas zonas dos clusters ACK. Para mais informações, consulte Step 1, Step 2 e Step 3 em Implement multi-cluster disaster recovery with an ASM multi-master control plane architecture.Em
mesh-1emesh-2, crie um ingress gateway do tipo NLB chamadoingressgateway. Para as zonas do NLB, selecione as mesmas duas zonas das instâncias do ASM e dos clusters ACK. Para mais informações, consulte Use an NLB instance for an ASM ingress gateway.Em
mesh-1emesh-2, ative a injeção automática de sidecar para o namespacedefaultdos dois clusters. Essa configuração faz parte do gerenciamento global de namespaces no ASM. Para mais informações, consulte Manage global namespaces.-
Implante a aplicação de exemplo como pares nos dois clusters ACK. Este exemplo usa duas zonas:
cn-hangzhou-hecn-hangzhou-k. Ajuste as zonas no YAML com base no seu ambiente real.NotaAs imagens de contêiner no YAML a seguir são baixadas do registro da China (Hangzhou) (
registry-cn-hangzhou.ack.aliyuncs.com). Se você implantar em várias regiões, certifique-se de que as imagens estejam disponíveis em todas as regiões de destino. Pode ser necessário configurar a sincronização de imagens entre regiões por meio do Container Registry.Expanda para visualizar o comando
kubectl apply -f- <<EOF apiVersion: v1 kind: Service metadata: name: mocka labels: app: mocka service: mocka spec: ports: - port: 8000 name: http selector: app: mocka --- apiVersion: apps/v1 kind: Deployment metadata: name: mocka-cn-hangzhou-h labels: app: mocka spec: replicas: 1 selector: matchLabels: app: mocka template: metadata: labels: app: mocka locality: cn-hangzhou-h spec: nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-h containers: - name: default image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing imagePullPolicy: IfNotPresent env: - name: version value: cn-hangzhou-h - name: app value: mocka - name: upstream_url value: "http://mockb:8000/" ports: - containerPort: 8000 --- apiVersion: apps/v1 kind: Deployment metadata: name: mocka-cn-hangzhou-k labels: app: mocka spec: replicas: 1 selector: matchLabels: app: mocka template: metadata: labels: app: mocka locality: cn-hangzhou-k spec: nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-k containers: - name: default image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing imagePullPolicy: IfNotPresent env: - name: version value: cn-hangzhou-k - name: app value: mocka - name: upstream_url value: "http://mockb:8000/" ports: - containerPort: 8000 --- apiVersion: v1 kind: Service metadata: name: mockb labels: app: mockb service: mockb spec: ports: - port: 8000 name: http selector: app: mockb --- apiVersion: apps/v1 kind: Deployment metadata: name: mockb-cn-hangzhou-h labels: app: mockb spec: replicas: 1 selector: matchLabels: app: mockb template: metadata: labels: app: mockb locality: cn-hangzhou-h spec: nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-h containers: - name: default image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing imagePullPolicy: IfNotPresent env: - name: version value: cn-hangzhou-h - name: app value: mockb - name: upstream_url value: "http://mockc:8000/" ports: - containerPort: 8000 --- apiVersion: apps/v1 kind: Deployment metadata: name: mockb-cn-hangzhou-k labels: app: mockb spec: replicas: 1 selector: matchLabels: app: mockb template: metadata: labels: app: mockb locality: cn-hangzhou-k spec: nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-k containers: - name: default image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing imagePullPolicy: IfNotPresent env: - name: version value: cn-hangzhou-k - name: app value: mockb - name: upstream_url value: "http://mockc:8000/" ports: - containerPort: 8000 --- apiVersion: v1 kind: Service metadata: name: mockc labels: app: mockc service: mockc spec: ports: - port: 8000 name: http selector: app: mockc --- apiVersion: apps/v1 kind: Deployment metadata: name: mockc-cn-hangzhou-h labels: app: mockc spec: replicas: 1 selector: matchLabels: app: mockc template: metadata: labels: app: mockc locality: cn-hangzhou-h spec: nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-h containers: - name: default image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing imagePullPolicy: IfNotPresent env: - name: version value: cn-hangzhou-h - name: app value: mockc ports: - containerPort: 8000 --- apiVersion: apps/v1 kind: Deployment metadata: name: mockc-cn-hangzhou-k labels: app: mockc spec: replicas: 1 selector: matchLabels: app: mockc template: metadata: labels: app: mockc locality: cn-hangzhou-k spec: nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-k containers: - name: default image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing imagePullPolicy: IfNotPresent env: - name: version value: cn-hangzhou-k - name: app value: mockc ports: - containerPort: 8000 --- apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: mocka namespace: default spec: selector: istio: ingressgateway servers: - hosts: - '' port: name: test number: 80 protocol: HTTP --- apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: demoapp-vs namespace: default spec: gateways: - mocka hosts: - '' http: - name: test route: - destination: host: mocka port: number: 8000 EOFAfter you run the preceding commands in both clusters, the services
mocka,mockb, andmockcare deployed as peers in both clusters. Each service contains two stateless deployments that have one replica each. DifferentnodeSelectorsettings distribute the deployments to nodes in different zones, and environment variables make each deployment return the zone that it resides in.Para uma demonstração direta, este exemplo usa o campo
nodeSelectorpara selecionar manualmente a zona de cada pod. Ao construir um ambiente real de alta disponibilidade, configure restrições de distribuição de topologia para distribuir pods por diferentes zonas tanto quanto possível. Para mais informações, consulte Configure high availability for workloads. Configure o Global Traffic Manager (GTM) com as instâncias NLB para implementar recuperação de desastres ativo-ativo para o ingress gateway. Para mais informações, consulte How GTM implements active-active disaster recovery.
Etapa 2: Ativar failover com reconhecimento de localidade
O ASM ativa o failover com reconhecimento de localidade por padrão, mas o recurso só entra em vigor junto com regras de circuit breaking no nível de host configuradas nas destination rules.
-
Implante regras de circuit breaking no nível de host nos clusters
cluster-1ecluster-2.kubectl apply -f- <<EOF apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: mocka spec: host: mocka trafficPolicy: outlierDetection: splitExternalLocalOriginErrors: true consecutiveLocalOriginFailures: 1 baseEjectionTime: 5m consecutive5xxErrors: 1 interval: 30s maxEjectionPercent: 100 --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: mockb spec: host: mockb trafficPolicy: outlierDetection: splitExternalLocalOriginErrors: true consecutiveLocalOriginFailures: 1 baseEjectionTime: 5m consecutive5xxErrors: 1 interval: 30s maxEjectionPercent: 100 --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: mockc spec: host: mockc trafficPolicy: outlierDetection: splitExternalLocalOriginErrors: true consecutiveLocalOriginFailures: 1 baseEjectionTime: 5m consecutive5xxErrors: 1 interval: 30s maxEjectionPercent: 100 EOF
outlierDetectioné o mecanismo que a service mesh usa para detecção de falhas de serviço e ejeção de endpoints defeituosos. A tabela a seguir descreve os itens de configuração:Item de configuração
Descrição
interval
Intervalo de execução da detecção de falhas.
baseEjectionTime
Tempo de espera antes da ejeção de um endpoint do pool de balanceamento de carga após a confirmação de falha.
maxEjectionPercent
Porcentagem máxima de endpoints passíveis de ejeção.
consecutive5xxErrors
Número de erros
5xxconsecutivos retornados por um endpoint antes de ser considerado defeituoso.splitExternalLocalOriginErrors
Define se falhas e timeouts de conexão devem ser contabilizados como erros.
consecutiveLocalOriginFailures
Número de erros consecutivos não-5xx, como falhas e timeouts de conexão, produzidos por um endpoint antes de ser considerado defeituoso.
-
Verifique o status do serviço.
Envie uma requisição para o nome de domínio do serviço.
curl mock.asm-demo.work/mock -v
Host mock.asm-demo.work:80 was resolved. IPv6: (none) IPv4: 8.xxx.xxx.47, 8.xxx.xxx.42 Trying 8.xxx.xxx.47:80... Connected to mock.asm-demo.work (8.209.XXX.XX) port 80 > GET /mock HTTP/1,1 > Host: mock.asm-demo.work > User-Agent: curl/8.7.1 > Accept: / > Request completely sent off < HTTP/1,1 200 OK < date: Wed, 11 Dec 2024 12:10:56 GMT < content-length: 153 < content-type: text/plain; charset=utf-8 < x-envoy-upstream-service-time: 3 < server: istio-envoy < * Connection #0 to host mock.asm-demo.work left intact -> mocka(version: cn-hangzhou-k, ip: 10.1.225.40)-> mockb(version: cn-hangzhou-k, ip: 10.1.225.31)-> mockc(version: cn-hangzhou-k, ip: 10.1.225.32)%
A cadeia de chamadas de serviço permanece nos workloads da mesma zona.
Etapa 3: Realizar um simulado de falha
O exemplo a seguir simula uma falha de workload substituindo manualmente a imagem do contêiner do serviço mockb em uma zona.
-
Substitua a imagem de
mockb-cn-hangzhou-hnocluster-2para simular uma falha.Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Deployments.
Na lista, localize o workload
mockb-cn-hangzhou-h. Na coluna Actions à direita, clique em Edit. Altere a imagem pararegistry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2e adicione["sleep","3600"]ao comando no campo Start para que o contêiner possa iniciar corretamente. Clique em Update.
-
Acesse continuamente o nome de domínio da aplicação para visualizar o caminho da requisição após a ocorrência da falha.
curl mock.asm-demo.work/mock -vResultado esperado 1: A requisição é enviada para uma zona diferente de
cn-hangzhou-h.Host mock.asm-demo.work:80 was resolved. IPv6: (none) IPv4: 8.209.XXX.XX, 8.221.XXX.XX Trying 8.209.247.47:80... Connected to mock.asm-demo.work (8.209.247.47) port 80 > GET /mock HTTP/1,1 > Host: mock.asm-demo.work > User-Agent: curl/8.7.1 > Accept: / > Request completely sent off < HTTP/1,1 200 OK < date: Wed, 11 Dec 2024 12:10:56 GMT < content-length: 153 < content-type: text/plain; charset=utf-8 < x-envoy-upstream-service-time: 3 < server: istio-envoy < * Connection #0 to host mock.asm-demo.work left intact -> mocka(version: cn-hangzhou-k, ip: 10.1.225.40)-> mockb(version: cn-hangzhou-k, ip: 10.1.225.31)-> mockc(version: cn-hangzhou-k, ip: 10.1.225.32)%
A requisição permanece dentro de uma zona saudável.
Resultado esperado 2: A requisição é enviada para a zona
cn-hangzhou-hna primeira vez.Host mock.asm-demo.work:80 was resolved. IPv6: (none) IPv4: 112.124.XX.XXX, 121.41.XXX.XXX Trying 112.124.65.120:80... Connected to mock.asm-demo.work (112.124.65.120) port 80 > GET /mock HTTP/1,1 > Host: mock.asm-demo.work > User-Agent: curl/8.7.1 > Accept: / > Request completely sent off < HTTP/1,1 200 OK < date: Wed, 11 Dec 2024 12:08:45 GMT < content-length: 220 < content-type: text/plain; charset=utf-8 < x-envoy-upstream-service-time: 48 < server: istio-envoy < * Connection #0 to host mock.asm-demo.work left intact -> mocka(version: cn-hangzhou-h, ip: 192.168.122.135)upstream connect error or disconnect/reset before headers. reset reason: remote connection failure, transport failure reason: delayed connect error: Connection refused%The connection is refused when the request reaches the
mockbservice.Resultado esperado 3: A requisição é enviada novamente para a zona
cn-hangzhou-hdepois que o sidecar proxy detecta a falha.Host mock.asm-demo.work:80 was resolved. IPv6: (none) IPv4: 8.209.XXX.XX, 8.221.XXX.XX Trying 8.209.247.47:80... Connected to mock.asm-demo.work (8.209.247.47) port 80 > GET /mock HTTP/1,1 > Host: mock.asm-demo.work > User-Agent: curl/8.7.1 > Accept: / > Request completely sent off < HTTP/1,1 200 OK < date: Wed, 11 Dec 2024 12:10:59 GMT < content-length: 154 < content-type: text/plain; charset=utf-8 < x-envoy-upstream-service-time: 4 < server: istio-envoy < * Connection #0 to host mock.asm-demo.work left intact -> mocka(version: cn-hangzhou-h, ip: 10.0.239.141)-> mockb(version: cn-hangzhou-k, ip: 10.1.225.31)-> mockc(version: cn-hangzhou-k, ip: 10.1.225.32)%
mockbtraffic is redirected tocn-hangzhou-k, a different zone in the same region.
(Opcional) Etapa 4: Configurar alertas para falhas no nível de serviço
-
Configure o sidecar proxy para reportar métricas de circuit breaking por meio de
proxyStatsMatcher. Ao configurarproxyStatsMatcher, selecione Regular Expression Match e defina o valor como.*outlier_detection.*. Para mais informações, consulte proxyStatsMatcher.A tabela a seguir descreve algumas das métricas de circuit breaking:
Métrica
Tipo de métrica
Descrição
envoy_cluster_outlier_detection_ejections_active
Gauge
Número de hosts atualmente ejetados.
envoy_cluster_outlier_detection_ejections_enforced_total
Counter
Número de eventos de ejeção de host.
envoy_cluster_outlier_detection_ejections_overflow
Counter
Número de vezes que uma ejeção de host foi ignorada porque a porcentagem máxima de ejeção foi excedida.
ejections_detected_consecutive_5xx
Counter
Número de vezes que um host retornou erros 5xx consecutivos.
Reimplante os workloads stateless (
mocka,mockbemockc) para aplicar a configuração atualizada deproxyStatsMatcher. Para mais informações, consulte Redeploy the workload.-
Crie uma regra de alerta para circuit breaking no nível de host.
Integre o componente Alibaba Cloud ASM ao cluster do plano de dados ou atualize-o para a versão mais recente, permitindo que o Managed Service for Prometheus colete as métricas de circuit breaking expostas. Para mais informações sobre como atualizar o componente de integração, consulte Manage integrations. (Se você já coleta métricas da service mesh com uma instância Prometheus autogerenciada conforme descrito em Integrate a self-managed Prometheus instance for mesh monitoring, pule esta etapa.)
Crie uma regra de alerta para circuit breaking no nível de host. Para mais informações, consulte Create an alert rule for a Prometheus instance. A tabela a seguir fornece exemplos dos parâmetros-chave da regra de alerta. Configure os demais parâmetros conforme seus requisitos, consultando os documentos anteriores.
Parâmetro
Exemplo
Descrição
Instrução PromQL personalizada
(sum (envoy_cluster_outlier_detection_ejections_active) by (cluster_name, namespace)) > 0
Consulta a métrica envoy_cluster_outlier_detection_ejections_active para determinar se há hosts atualmente ejetados no cluster e agrupa os resultados por namespace e nome do serviço.
Conteúdo do alerta
Circuit breaking no nível de host acionado. Um workload retornou erros consecutivos e foi ejetado do pool de balanceamento de carga do serviço! Namespace: {{$labels.namespace}}. Serviço onde ocorreu a ejeção: {{$labels.cluster_name}}. Número de ejeções: {{ $value }}
Mensagem de alerta de exemplo mostrando o namespace e o nome do serviço que acionou o circuit breaking, além do número de hosts atualmente ejetados para esse serviço.