Por padrão, o plano de controle do Alibaba Cloud Service Mesh (ASM) monitora serviços em todos os namespaces de um cluster e envia alterações de configuração para todos os sidecar proxies no plano de dados, mesmo para namespaces sem injeção de sidecar proxy. Em clusters grandes com muitos namespaces, isso gera carga desnecessária no plano de controle e atrasa a sincronização de configurações.
Os seletores de descoberta de serviço filtram os namespaces monitorados pelo plano de controle. Após a configuração de um seletor, o plano de controle descobre e processa apenas serviços em namespaces que correspondem aos critérios de rótulo do seletor. Os sidecar proxies recebem um conjunto de configurações menor e direcionado, o que acelera os tempos de push e reduz o consumo de recursos.
Neste tópico, configurações de sidecar proxy refere-se às configurações que um sidecar proxy recebe do plano de controle do ASM.
Como funciona
Sem um seletor de descoberta de serviço, cada sidecar proxy armazena a configuração de todos os serviços em todos os namespaces, incluindo aqueles com os quais o proxy nunca se comunica. Quando qualquer serviço é alterado em qualquer namespace, o plano de controle aciona um push completo para cada sidecar proxy.
Com um seletor de descoberta de serviço, o plano de controle observa apenas namespaces cujos rótulos correspondem aos critérios do seletor. O sistema ignora alterações de serviço em namespaces não correspondentes, e os sidecar proxies armazenam apenas as configurações necessárias.
Regras de correspondência de seletor de rótulo
Os seletores de rótulo suportam dois modos de correspondência:
Correspondência exata
Especifique uma chave e um valor de rótulo. Um namespace é selecionado somente quando tanto a chave quanto o valor correspondem exatamente.
Correspondência baseada em expressão
Especifique uma chave de rótulo, um operador e, opcionalmente, um conjunto de valores:
|
Operador |
Comportamento |
Caso de uso de exemplo |
|
In |
Seleciona namespaces onde o valor do rótulo está no conjunto especificado |
Incluir apenas namespaces |
|
NotIn |
Seleciona namespaces onde o valor do rótulo não está no conjunto especificado |
Excluir namespaces |
|
Exists |
Seleciona namespaces onde a chave do rótulo existe, independentemente do valor |
Selecionar todos os namespaces rotulados com |
|
DoesNotExist |
Seleciona namespaces onde a chave do rótulo não existe |
Excluir namespaces sem opt-in explícito para o mesh |
Configure um seletor de descoberta de serviço
Para configurar um seletor, sua instância do ASM deve atender a estes requisitos:
Versão 1.10.5.32 ou posterior do ASM
Um cluster Container Service for Kubernetes (ACK) adicionado à instância do ASM
Escolha um dos métodos a seguir.
Método 1: Selecione namespaces no console
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 instância do ASM. No painel de navegação à esquerda, escolha ASM Instance > Service Discovery Selectors.
Defina Mesh Discovery Mode como Automatically Discover Services in the Selected Namespace of a Kubernetes Cluster on the Data Plane.
Na aba Select Namespaces, selecione o cluster e clique em unselect ao lado de cada namespace a ser excluído da descoberta. Mantenha apenas os namespaces cujos serviços precisam ser enviados aos sidecar proxies. Clique em OK e, em seguida, clique em OK na caixa de diálogo Submit.
-
Verifique a configuração:
No painel de navegação à esquerda, escolha ASM Instance > Base Information.
Confirme se Status exibe Running.
Método 2: Usar uma expressão de seletor de rótulo
Este método é mais adequado para ambientes gerenciados por infraestrutura como código. Rotule cada namespace a ser incluído e defina um seletor de rótulo no console.
-
Rotule cada namespace de destino:
kubectl label namespace <namespace-name> asm-discovery=enabled 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 instância do ASM. No painel de navegação à esquerda, escolha ASM Instance > Service Discovery Selectors.
Defina Mesh Discovery Mode como Automatically Discover Services in the Selected Namespace of a Kubernetes Cluster on the Data Plane e clique em Edit Discovery Selectors Directly.
Defina o seletor de rótulo. Por exemplo, para selecionar todos os namespaces que possuem o rótulo
asm-discoveryindependentemente do valor, defina Key comoasm-discoverye Operator como Exists. Clique em OK e, em seguida, clique em OK na caixa de diálogo Submit.-
Verifique a configuração:
No painel de navegação à esquerda, escolha ASM Instance > Base Information.
Confirme se Status exibe Running.
Verifique se o seletor entrou em vigor
Após configurar o seletor, confirme que os sidecar proxies não recebem mais configurações de namespaces excluídos.
Verifique a configuração do sidecar proxy
-
Obtenha o nome do pod de uma carga de trabalho em um namespace selecionado:
kubectl get pods -n <selected-namespace>NAME READY STATUS RESTARTS AGE httpbin-6fcb98998c-46qhr 2/2 Running 0 22m -
Extraia a configuração do sidecar proxy:
kubectl exec -it <pod-name> -c istio-proxy -n <selected-namespace> -- curl -s localhost:15000/config_dump > config_dump.json Pesquise no arquivo
config_dump.jsonpor um serviço em um namespace excluído. Por exemplo, pesquise porhttpbin.ns-not-in-mesh. Se nenhuma correspondência for encontrada, o seletor está funcionando corretamente e os sidecar proxies não armazenam mais configurações desse namespace.
Verifique logs do plano de controle
Acione uma alteração de serviço em um namespace excluído (por exemplo, crie ou exclua um deployment) e verifique se nenhum log de push correspondente aparece nos logs do plano de controle.
Para instâncias do ASM anteriores à versão 1.17.2.35
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, localize a instância do ASM e clique em nome dela ou clique em Manage na coluna Actions.
No painel de navegação à esquerda, escolha ASM Instance > Base Information.
Clique em View log ao lado de Control-plane log collection.
Defina Time Range como 15 Minutes e verifique a aba Raw Logs. Se nenhum log de push aparecer para o namespace excluído, o seletor está funcionando corretamente.
Para instâncias do ASM versão 1.17.2.35 ou posterior
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 instância do ASM. No painel de navegação à esquerda, escolha Observability Management Center > Log Center.
Clique em aba Control-Plane Logs e defina Time Range como 15 Minutes. Se nenhum log de push aparecer na aba Raw Logs para o namespace excluído, o seletor está funcionando corretamente.
Exclua pods específicos da descoberta de serviço
Este recurso requer a versão 1,20 ou posterior do ASM.
Por padrão, o ASM descobre todos os serviços e pods em um cluster Kubernetes do plano de dados. Com seletores de rótulo no nível do pod, é possível excluir pods específicos totalmente da descoberta de serviço do ASM. O plano de controle não descobre pods excluídos e nenhum sidecar proxy roteia tráfego para eles. Isso é útil para drenar rapidamente o tráfego de um pod específico.
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 instância do ASM. No painel de navegação à esquerda, escolha ASM Instance > Service Discovery Selectors.
-
Clique em Show Advanced Settings e, em seguida, clique em Logs with specific labels are not selected. Insira a Key e o Value do rótulo para excluir os pods correspondentes da descoberta de serviço do ASM. Casos de uso comuns:
Excluir pods em uma região específica: use
topology.kubernetes.io/regioncomo chave.Excluir pods em uma zona específica: use
topology.kubernetes.io/zonecomo chave.
Clique em Ok e, em seguida, clique em Ok na caixa de diálogo de confirmação.
Tutorial: configure e teste um seletor de descoberta de serviço
Este tutorial demonstra o processo de ponta a ponta usando dois namespaces: um dentro do mesh (ns-in-mesh) e outro fora (ns-not-in-mesh).
Etapa 1: Crie namespaces
Crie dois namespaces:
ns-in-meshens-not-in-mesh. Para mais informações, consulte Criar um namespace.Ative a injeção automática de sidecar proxy para o namespace
ns-in-mesh. Para mais informações, consulte Ativar injeção automática de sidecar proxy.-
Adicione o rótulo
asm-discovery=enabledao namespacens-in-mesh:kubectl label namespace ns-in-mesh asm-discovery=enabled
Etapa 2: Implantar uma aplicação de exemplo
-
Crie um arquivo chamado
httpbin.yamlcom o seguinte conteúdo: -
Implante a aplicação HTTPBin em ambos os namespaces:
kubectl apply -f httpbin.yaml -n ns-in-mesh kubectl apply -f httpbin.yaml -n ns-not-in-mesh
Etapa 3: Observar o comportamento padrão de push
Antes de configurar um seletor, verifique se os sidecar proxies recebem configurações de todos os namespaces, incluindo ns-not-in-mesh.
-
Obtenha o nome do pod:
kubectl get pods -n ns-in-meshSaída de exemplo:
NAME READY STATUS RESTARTS AGE httpbin-6fcb98998c-46qhr 2/2 Running 0 22m -
Extraia a configuração do sidecar proxy:
Substitua
httpbin-6fcb98998c-46qhrpelo nome real do pod obtido na etapa anterior.kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json Pesquise por
httpbin.ns-not-in-meshemconfig_dump.json. Se encontrado, isso confirma que os sidecar proxies armazenam configurações de serviço dens-not-in-mesh, mesmo que a injeção automática de sidecar proxy não esteja ativada para esse namespace.-
(Opcional) Verifique pelos logs do plano de controle:
Ative a coleta de logs do plano de controle. Para versões do ASM anteriores a 1.17.2.35, consulte Ativar coleta de logs do plano de controle e alertas baseados em logs. Para versões do ASM 1.17.2.35 ou posteriores, consulte Usar o Log Center.
-
Implante a aplicação sleep no namespace
ns-not-in-meshpara acionar um evento de push:kubectl apply -f sleep.yaml -n ns-not-in-mesh -
Abra os logs do plano de controle (defina Time Range como 5 Minutes). Entradas de log semelhantes às seguintes confirmam que o plano de controle envia configurações para o namespace
ns-not-in-mesh:Full push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local
Etapa 4: Aplicar o seletor de descoberta de serviço
Siga as etapas em Configure um seletor de descoberta de serviço para configurar um seletor que inclua apenas o namespace ns-in-mesh.
Etapa 5: Confirme o funcionamento do seletor
-
Extraia novamente a configuração do sidecar proxy:
kubectl exec -it <pod-name> -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.jsonPesquise por
httpbin.ns-not-in-mesh. Se nenhuma correspondência for encontrada, os sidecar proxies não armazenam mais configurações do namespace excluído. -
Exclua a aplicação sleep de
ns-not-in-meshpara acionar uma alteração de serviço:kubectl delete -f sleep.yaml -n ns-not-in-meshVerifique os logs do plano de controle (defina Time Range como 15 Minutes). Se nenhum log de push aparecer para o namespace
ns-not-in-mesh, o seletor está funcionando conforme o esperado. O plano de controle ignora alterações de serviço em namespaces fora dos critérios do seletor.