Algoritmos padrão de balanceamento de carga, como round robin e least request, distribuem o tráfego com base em regras estáticas e não têm visibilidade sobre o desempenho real de cada pod. Se um pod responder lentamente devido a contenção de recursos, cache frio ou interferência de outros processos no host, esses algoritmos continuarão a rotear tráfego para ele, aumentando a latência geral e as taxas de erro.
O Service Mesh (ASM) versão 1.21 introduz o peak EWMA (peak Exponentially Weighted Moving Average), um algoritmo de balanceamento de carga que rastreia o tempo de resposta de cada pod em tempo real e desvia automaticamente o tráfego dos pods lentos para os mais rápidos. Isso reduz significativamente a latência de cauda (P90, P95, P99).
Como funciona o peak EWMA
O peak EWMA pontua cada pod de backend combinando pesos estáticos, latências observadas e taxas de erro em uma média móvel. Diferentemente de uma média simples, o EWMA atribui maior peso às observações recentes, permitindo que o algoritmo reaja rapidamente a picos de latência. A variante "peak" rastreia especificamente a latência do pior caso, tornando-a eficaz para cenários de tráfego em rajada, nos quais alguns pods apresentam degradação temporária.
Quando usar o peak EWMA
|
Algoritmo |
Mais indicado para |
Limitações |
|
|
Cargas de trabalho uniformes com desempenho semelhante entre pods |
Ignora a integridade e a latência dos pods |
|
|
Balanceamento de carga de uso geral (padrão do ASM) |
Não considera diferenças no tempo de resposta |
|
|
Distribuição simples e sem estado |
Sem inteligência sobre o desempenho dos pods |
|
** |
Cargas de trabalho com latência desigual entre pods ou tráfego em rajada |
Requer ASM 1.21 ou posterior |
Escolha PEAK_EWMA quando:
Os pods de backend apresentarem tempos de resposta inconsistentes (por exemplo, devido a contenção de recursos ou hardware heterogêneo).
Seu serviço lidar com tráfego em rajada que possa sobrecarregar temporariamente pods individuais.
A latência de cauda (P95/P99) for mais importante que a latência média para o seu caso de uso.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ASM versão 1.21 ou posterior. Consulte Criar uma instância do ASM
Um cluster do Container Service for Kubernetes (ACK) adicionado à instância do ASM. Consulte Adicionar um cluster a uma instância do ASM e Atualizar uma instância do ASM
Um cliente kubectl conectado ao cluster ACK. Consulte Conectar-se a um cluster usando kubectl
Configure o peak EWMA
Aplique uma DestinationRule que defina o algoritmo de balanceamento de carga PEAK_EWMA para o serviço de destino.
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em nome da sua instância do ASM. No painel de navegação à esquerda, escolha Traffic Management Center > DestinationRule. Clique em Create from YAML.
-
Cole o seguinte YAML e clique em Create. Substitua
simple-serveresimple-server.default.svc.cluster.localpelo nome e host reais do seu serviço.apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: simple-server namespace: default spec: host: simple-server.default.svc.cluster.local trafficPolicy: loadBalancer: simple: PEAK_EWMA # Latency-aware load balancing
Exemplo: Medir a melhoria de latência
Este exemplo demonstra como o peak EWMA reduz a latência de cauda quando os pods de backend têm tempos de resposta desiguais. O cenário utiliza dois deployments atrás de um único serviço:
simple-server-normal: responde em 50--100 ms (pod saudável).
simple-server-high-latency: responde em 500--2000 ms (simula um pod degradado).
Um pod sleep atua como cliente e envia 100 requisições para medir a latência com e sem o peak EWMA.
Etapa 1: Ative o monitoramento de métricas
Ative o monitoramento de métricas da instância do ASM para observar as alterações de latência antes e depois de ativar o peak EWMA. Consulte Coletar métricas para o Managed Service for Prometheus.
Etapa 2: Implantar o ambiente de teste
-
Conecte-se ao cluster ACK com kubectl e crie um arquivo
sleep.yamlcom o seguinte conteúdo:Implante a aplicação sleep:
kubectl apply -f sleep.yaml -
Crie um arquivo
simple.yamlcom o seguinte conteúdo:Implante ambos os deployments de servidor:
kubectl apply -f simple.yaml
Etapa 3: Execute um teste de linha de base com o algoritmo padrão
O algoritmo padrão LEAST_REQUEST serve como linha de base. Envie 100 requisições do pod sleep para o serviço simple-server:
kubectl exec -it deploy/sleep -c sleep -- sh -c 'for i in $(seq 1 100); do time curl simple-server:8080/hello; echo "request $i done"; done'
Saída esperada (abreviada):
hello
this is port: 8080real 0m 0.06s
user 0m 0.00s
sys 0m 0.00s
request 1 done
hello
this is port: 8080real 0m 0.09s
...
hello
this is port: 8080real 0m 1.72s
user 0m 0.00s
sys 0m 0.00s
request 100 done
Após a conclusão do teste, visualize as métricas de latência:
Na página Mesh Management, clique em nome da sua instância do ASM. No painel de navegação à esquerda, escolha Observability Management Center > Monitoring metrics.
-
Clique em aba Cloud ASM Istio Service e defina os seguintes filtros:
Filtro
Valor
Namespace
defaultService
simple-server.default.svc.cluster.localReporter
destinationClient Workload Namespace
defaultClient Workload
sleepService Workload Namespace
defaultService Workload
simple-server-normal + simple-server-high-latency Clique em Client Workloads para visualizar o painel Incoming Request Duration By Source.

Os resultados da linha de base mostram uma latência P50 de 87,5 ms e uma latência P95 de 2,05 s. Como o LEAST_REQUEST distribui o tráfego uniformemente, o pod lento inflaciona a latência de cauda geral.
Estes resultados de teste provêm de um ambiente controlado. Os resultados reais variam dependendo da sua carga de trabalho e infraestrutura.
Etapa 4: Ative o peak EWMA e execute o teste novamente
-
Crie uma DestinationRule para ativar o peak EWMA no serviço simple-server. Siga as etapas em Configure o peak EWMA usando o seguinte YAML:
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: simple-server namespace: default spec: host: simple-server.default.svc.cluster.local trafficPolicy: loadBalancer: simple: PEAK_EWMA -
Execute o mesmo teste novamente:
kubectl exec -it deploy/sleep -c sleep -- sh -c 'for i in $(seq 1 100); do time curl simple-server:8080/hello; echo "request $i done"; done' Visualize as métricas de latência usando os mesmos filtros da Etapa 3.

As latências P90, P95 e P99 caem significativamente. O peak EWMA detecta que o pod de alta latência responde lentamente e reduz sua parcela de tráfego, roteando a maioria das requisições para o pod mais rápido. A latência geral das requisições para o serviço diminui substancialmente.