Service Mesh (ASM) permite configurar regras de disjuntor de circuito para o tráfego leste-oeste entre serviços e rotas específicos. Essas regras permitem que o proxy do mesh rejeite ativamente requisições para serviços upstream com falha, oferecendo uma capacidade não intrusiva de disjuntor de circuito de tráfego. Este tópico descreve como usar o CRD ASMCircuitBreaker para configurar regras de disjuntor de circuito para tráfego leste-oeste.
Contexto
O disjuntor de circuito é um mecanismo de proteção contra sobrecarga que impede a falha do sistema devido a picos repentinos de tráfego. Em ambientes cloud-native com tráfego leste-oeste entre serviços, uma única falha (por exemplo, resposta lenta ou alta taxa de erros) pode causar uma reação em cadeia e levar a uma falha em cascata em toda a cadeia de chamadas.
Uma regra de disjuntor de circuito para tráfego leste-oeste "abre o circuito" automaticamente e rejeita requisições para um serviço upstream quando a taxa de erro ou o limiar de tempo limite de resposta é excedido. Isso protege o serviço upstream, evita a propagação da falha e ajuda a prevenir interrupções em todo o sistema.
Após a configuração de uma regra de disjuntor de circuito, cada proxy do mesh calcula independentemente a taxa de erro ou o número de requisições lentas para o tráfego que gerencia. Consequentemente, diferentes proxies de mesh no lado do cliente podem abrir o circuito em momentos ligeiramente distintos para o mesmo serviço upstream com falha.
Pré-requisitos
Você possui uma instância do ASM Professional Edition v1.14.3 ou posterior. Para mais informações, consulte Crie uma instância do ASM.
As aplicações de exemplo
sleepehttpbinestão implantadas. Para mais informações, consulte Implantar a aplicação httpbin em um cluster de plano de dados e Implantar o serviço sleep em um cluster de plano de dados.
Etapa 1: Configure o roteamento do caminho da requisição
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
-
Crie um serviço virtual usando um dos métodos a seguir.
Usar o console
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create.
Especifique o **Namespace e o Host, e ative Gateways > Apply To All Sidecars**.
Na seção **Hosts, clique em Add Host** para adicionar o serviço httpbin.
Na seção **HTTP Route, clique em Add Route** e configure as rotas conforme descrito abaixo.
Defina o nome da rota como
error-route. Ative **Match Request URI, selecione Exact** como tipo de correspondência e insira/status/500no conteúdo de correspondência. Defina o nome do serviço de destino comohttpbin.default.svc.cluster.local.Defina o nome da rota como **delay-route. Ative Match Request URI, selecione Prefix** como tipo de correspondência e insira
/delayno conteúdo de correspondência. Defina o nome do serviço de destino comohttpbin.default.svc.cluster.local.Defina o nome da rota como
default-route. Não adicione regras de correspondência de requisição. Defina o nome do serviço de destino comohttpbin.default.svc.cluster.locale deixe os campos de versão, peso e porta vazios.Usar YAML
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create from YAML.
-
No editor **YAML, cole o seguinte conteúdo e clique em Create**.
A tabela a seguir mapeia caminhos de requisição para rotas.
Caminho da requisição
Tipo de correspondência
Rota
Descrição
/status/500Exact
error-routeSempre retorna um código de status 500.
/delayPrefix
delay-routeRetorna um código de status 200 após um atraso especificado. Para mais informações sobre como usar o caminho /delay, consulte delay.
/*Qualquer caminho
default-routeA rota padrão.
Etapa 2: Configure o disjuntor de circuito
Esta seção descreve como configurar e testar o disjuntor de circuito baseado em taxa de erro e em requisições lentas.
Taxa de erro
O disjuntor de circuito baseado em taxa de erro abre o circuito quando a taxa de erro das respostas do servidor excede um limiar dentro de uma janela de tempo determinada.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha .
-
Na página **Create, cole o seguinte conteúdo no editor YAML e clique em Create**.
A tabela a seguir descreve os parâmetros da configuração do disjuntor de circuito.
Parâmetro
Descrição
workloadSelector.labels
Carga de trabalho do serviço downstream à qual a regra de disjuntor de circuito se aplica. Neste exemplo, o serviço downstream é o sleep, selecionado pelo rótulo
app: sleep.break_duration
Duração em que o circuito permanece aberto após ser acionado. Neste exemplo, o valor é 60s.
window_size
Janela de tempo para detecção do disjuntor de circuito. Neste exemplo, o valor é 10s. Se a taxa de erro de requisição na rota exceder o limiar especificado dentro de 10 segundos, o disjuntor será acionado e rejeitará as requisições.
error_percent
Limiar de taxa de erro de requisição necessário para acionar o disjuntor dentro da janela de tempo. Neste exemplo, o valor é 60. Se a taxa de erro na rota exceder 60% dentro de uma janela de 10s, o disjuntor será acionado e rejeitará as requisições.
min_request_amount
Número mínimo de requisições necessárias para acionar o disjuntor dentro da janela de tempo. Este parâmetro evita que o disjuntor seja acionado por um volume baixo de requisições.
Neste exemplo, o valor é 5. O disjuntor só é acionado se mais de 5 requisições forem enviadas na rota dentro de uma janela de 10s e a taxa de erro exceder 60%.
custom_response
Resposta personalizada retornada pelo proxy do mesh para requisições rejeitadas após o acionamento do disjuntor.
-
bodydefinido comoerror break!. O corpo da resposta éerror break!. -
header_to_adddefinido comox-envoy-overload: 'true'. O cabeçalhox-envoy-overload: 'true'é adicionado à resposta quando o circuito está aberto. -
status_codedefinido como499. O código de resposta para a requisição é499após a abertura do circuito.
match.vhost
Entrada de rota para a qual o disjuntor está configurado. Deve corresponder a uma entrada específica declarada no serviço virtual.
-
name: Nome de domínio do serviço upstream na cadeia de chamadas. Neste exemplo, definido comohttpbin.default.svc.cluster.local, que é o domínio do serviço httpbin (upstream do serviço sleep). -
port: Porta do serviço upstream. Neste exemplo, definido como8000, que é a porta do serviço httpbin. -
route.name_match: Nome real da entrada de rota no serviço virtual onde a configuração do disjuntor entra em vigor. Neste exemplo, definido comoerror-route, referente à entrada criada na Etapa 1. Requisições correspondentes sempre retornam status 500, garantindo o acionamento do disjuntor.
-
-
Conecte-se ao cluster ACK usando kubectl e execute o seguinte comando:
for i in {1..100}; do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/500 -I | grep 'HTTP'; echo ''; sleep 0.1; done;Saída esperada:
A saída mostra que o disjuntor é acionado na sexta requisição. As requisições subsequentes retornam o código de resposta personalizado 499. O circuito permanece aberto por 60s.
-
Com o circuito aberto, tente acessar outros caminhos do serviço httpbin.
for i in {1..100}; do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/503 -I | grep 'HTTP'; echo ''; sleep 0.1; done;Saída esperada:
Requisições para outros caminhos do serviço não são afetadas pela configuração do disjuntor na entrada de rota
error-routee ainda retornam o conteúdo de resposta do serviço httpbin.
Requisição lenta
O disjuntor baseado em requisições lentas abre o circuito quando o número de "requisições lentas" (aquelas que excedem um limiar de tempo de resposta) ultrapassa um limite dentro de uma janela de tempo determinada.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha .
-
Na página **Create, cole o seguinte conteúdo no editor YAML e clique em Create**.
A tabela a seguir descreve os parâmetros da configuração do disjuntor de circuito.
Parâmetro
Descrição
workloadSelector.labels
Carga de trabalho do serviço downstream à qual a regra de disjuntor de circuito se aplica. Neste exemplo, o serviço downstream é o sleep, selecionado pelo rótulo
app: sleep.break_duration
Duração em que o circuito permanece aberto após ser acionado. Neste exemplo, o valor é 60s.
window_size
Janela de tempo para detecção do disjuntor de circuito. Neste exemplo, o valor é 10s. Se o número de requisições lentas na rota exceder o limiar especificado dentro de 10 segundos, o disjuntor será acionado e rejeitará as requisições.
slow_request_rt
Limiar de tempo de resposta para uma requisição lenta. Neste exemplo, o valor é 0,5s. Requisições com tempo de resposta superior a 0,5s são consideradas lentas.
max_slow_requests
Número de requisições lentas necessário para acionar o disjuntor dentro da janela de tempo. Neste exemplo, o valor é 5. Se ocorrerem mais de 5 requisições lentas dentro de uma janela de 10s, o disjuntor será acionado e rejeitará as requisições.
min_request_amount
Número mínimo de requisições necessárias para acionar o disjuntor dentro da janela de tempo. Este parâmetro evita que o disjuntor seja acionado por um volume baixo de requisições.
Neste exemplo, o valor é 5. O disjuntor só é acionado se mais de 5 requisições forem enviadas na rota dentro de uma janela de 10s e o número de requisições lentas exceder 5.
custom_response
Resposta personalizada retornada pelo proxy do mesh para requisições rejeitadas após o acionamento do disjuntor.
-
bodydefinido comodelay break!. O corpo da resposta édelay break!. -
header_to_adddefinido comox-envoy-overload: 'true'. O cabeçalhox-envoy-overload: 'true'é adicionado à resposta quando o circuito está aberto. -
status_codedefinido como498. O código de resposta para a requisição é498após a abertura do circuito.
match.vhost
Entrada de rota para a qual o disjuntor está configurado. Deve corresponder a uma entrada específica declarada no serviço virtual.
-
name: Nome de domínio do serviço upstream na cadeia de chamadas. Neste exemplo, definido comohttpbin.default.svc.cluster.local, que é o domínio do serviço httpbin (upstream do serviço sleep). -
port: Porta do serviço upstream. Neste exemplo, definido como8000, que é a porta do serviço httpbin. -
route.name_match: Nome real da entrada de rota no serviço virtual onde a configuração do disjuntor entra em vigor. Neste exemplo, definido comodelay-route, referente à entrada criada na Etapa 1. Especifique manualmente um tempo de resposta superior a 0,5 segundos para requisições correspondentes a esta rota para garantir o acionamento do disjuntor.
-
-
Conecte-se ao cluster ACK usando kubectl e execute o seguinte comando:
for i in {1..100}; do kubectl exec -it deploy/sleep -- curl httpbin:8000/delay/1 -I | grep 'HTTP'; echo ''; sleep 0.1; done;Saída esperada:
A saída mostra que o disjuntor é acionado na sexta requisição. As requisições subsequentes retornam o código de resposta personalizado 498. O circuito permanece aberto por 60s.
-
Com o disjuntor baseado em requisições lentas ativo, execute o seguinte comando para testar o disjuntor baseado em taxa de erro configurado na seção anterior.
for i in {1..100}; do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/500 -I | grep 'HTTP'; echo ''; sleep 0.1; done;Saída esperada:
A saída indica que as regras de disjuntor configuradas em diferentes entradas de rota operam independentemente. Isso permite definir políticas específicas para diferentes tipos de tráfego leste-oeste.
Operações relacionadas
Visualize métricas de disjuntor de circuito no nível de serviço
No ASM v1.22.6.28 e posterior, é possível visualizar e usar métricas de disjuntor de circuito no nível de serviço para ASMCircuitBreaker.
|
Métrica |
Tipo |
Descrição |
|
envoy_asm_circuit_breaker_total_broken_requests |
Counter |
Número total de requisições rejeitadas pelo ASMCircuitBreaker. |
Configure o proxyStatsMatcher para o proxy sidecar reportar as métricas.
Ao configurar o proxyStatsMatcher, selecione **Regular Expression Match** e defina o valor como
.*circuit_breaker.*. Para mais informações, consulte proxyStatsMatcher.Reimplante a aplicação httpbin para aplicar a nova configuração de proxy. Para mais informações, consulte Reimplantar cargas de trabalho.
Execute a Etapa 1 e a Etapa 2 novamente para reconfigurar o disjuntor de circuito.
-
Execute o seguinte comando para visualizar as métricas de disjuntor de circuito no nível de serviço para o serviço httpbin:
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15090/stats/prometheus|grep asm_circuit_breakerSaída esperada:
# TYPE envoy_asm_circuit_breaker_total_broken_requests counter envoy_asm_circuit_breaker_total_broken_requests{cluster="outbound|8000||httpbin.default.svc.cluster.local",uuid="af7cf7ad-67e8-49c5-b5fe-xxxxxxxxx"} 1430 # TYPE envoy_total_asm_circuit_breakers gauge envoy_total_asm_circuit_breakers{} 1
Configure coleta de métricas e alertas
Após configurar o relatório de métricas de disjuntor de circuito no nível de serviço, colete essas métricas no Prometheus e crie regras de alerta para notificações oportunas sobre eventos de disjuntor. O exemplo a seguir mostra como configurar a coleta de métricas e alertas usando o Managed Service for Prometheus.
No Managed Service for Prometheus, adicione o componente **Alibaba Cloud ASM** ao cluster de plano de dados ou atualize-o para a versão mais recente para garantir a coleta das métricas de disjuntor expostas. Para mais informações sobre como adicionar um componente, consulte Gerenciamento de componentes. Caso já tenha integrado uma instância auto-gerenciada do Prometheus para monitorar o service mesh e coletar métricas, nenhuma operação adicional é necessária.
-
Crie uma regra de alerta para disjuntor de circuito no nível de serviço. Para mais informações, consulte Criar uma regra de alerta do Prometheus usando uma instrução PromQL personalizada. A tabela a seguir exemplifica a configuração de parâmetros-chave para uma regra de alerta. Configure outros parâmetros conforme seus requisitos de negócios, seguindo a documentação.
Parâmetro
Exemplo
Descrição
Instrução PromQL personalizada
(sum by(cluster, namespace) (increase(envoy_asm_circuit_breaker_total_broken_requests[1m]))) > 0
Consulta o número de requisições rejeitadas no último minuto e agrupa os resultados pelo namespace e nome do serviço upstream. Um alerta é acionado quando o número de requisições rejeitadas em um minuto é maior que 0.
Conteúdo do alerta
Disjuntor de circuito no nível de serviço ocorreu! Namespace: {{$labels.namespace}}, Serviço alvo onde ocorreu o disjuntor de circuito: {{$labels.cluster}}. Número de requisições rejeitadas devido ao disjuntor de circuito no último minuto: {{ $value }}
Formato da mensagem de alerta. Exibe o namespace e o nome do serviço afetado, além do número de requisições rejeitadas para esse serviço no último minuto.