Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Use service discovery selectors to reduce control plane push overhead

Última atualização: Jun 28, 2026

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.

Nota

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 production e staging

NotIn

Seleciona namespaces onde o valor do rótulo não está no conjunto especificado

Excluir namespaces kube-system e monitoring

Exists

Seleciona namespaces onde a chave do rótulo existe, independentemente do valor

Selecionar todos os namespaces rotulados com asm-discovery

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:

Escolha um dos métodos a seguir.

Método 1: Selecione namespaces no console

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. Defina Mesh Discovery Mode como Automatically Discover Services in the Selected Namespace of a Kubernetes Cluster on the Data Plane.

  4. 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.

  5. Verifique a configuração:

    1. No painel de navegação à esquerda, escolha ASM Instance > Base Information.

    2. 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.

  1. Rotule cada namespace de destino:

    kubectl label namespace <namespace-name> asm-discovery=enabled
  2. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  3. 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.

  4. 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.

  5. Defina o seletor de rótulo. Por exemplo, para selecionar todos os namespaces que possuem o rótulo asm-discovery independentemente do valor, defina Key como asm-discovery e Operator como Exists. Clique em OK e, em seguida, clique em OK na caixa de diálogo Submit.

  6. Verifique a configuração:

    1. No painel de navegação à esquerda, escolha ASM Instance > Base Information.

    2. 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

  1. 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
  2. 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
  3. Pesquise no arquivo config_dump.json por um serviço em um namespace excluído. Por exemplo, pesquise por httpbin.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

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. Na página Mesh Management, localize a instância do ASM e clique em nome dela ou clique em Manage na coluna Actions.

  3. No painel de navegação à esquerda, escolha ASM Instance > Base Information.

  4. Clique em View log ao lado de Control-plane log collection.

  5. 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

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. 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

Nota

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.

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. 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/region como chave.

    • Excluir pods em uma zona específica: use topology.kubernetes.io/zone como chave.

  4. 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

  1. Crie dois namespaces: ns-in-mesh e ns-not-in-mesh. Para mais informações, consulte Criar um namespace.

  2. 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.

  3. Adicione o rótulo asm-discovery=enabled ao namespace ns-in-mesh:

    kubectl label namespace ns-in-mesh asm-discovery=enabled

Etapa 2: Implantar uma aplicação de exemplo

  1. Crie um arquivo chamado httpbin.yaml com o seguinte conteúdo:

    Show the httpbin.yaml file

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  2. 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.

  1. Obtenha o nome do pod:

    kubectl get pods -n ns-in-mesh

    Saída de exemplo:

    NAME                       READY   STATUS    RESTARTS   AGE
    httpbin-6fcb98998c-46qhr   2/2     Running   0          22m
  2. Extraia a configuração do sidecar proxy:

    Substitua httpbin-6fcb98998c-46qhr pelo 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
  3. Pesquise por httpbin.ns-not-in-mesh em config_dump.json. Se encontrado, isso confirma que os sidecar proxies armazenam configurações de serviço de ns-not-in-mesh, mesmo que a injeção automática de sidecar proxy não esteja ativada para esse namespace.

  4. (Opcional) Verifique pelos logs do plano de controle:

    1. 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.

    2. Implante a aplicação sleep no namespace ns-not-in-mesh para acionar um evento de push:

      Show the sleep.yaml file

      apiVersion: v1
      kind: Service
      metadata:
        name: sleep
        labels:
          app: sleep
      spec:
        ports:
        - port: 80
          name: http
        selector:
          app: sleep
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sleep
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sleep
        template:
          metadata:
            labels:
              app: sleep
          spec:
            containers:
            - name: sleep
              image: pstauffer/curl
              command: ["/bin/sleep", "3650d"]
              imagePullPolicy: IfNotPresent
      kubectl apply -f sleep.yaml -n ns-not-in-mesh
    3. 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

  1. 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.json

    Pesquise 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.

  2. Exclua a aplicação sleep de ns-not-in-mesh para acionar uma alteração de serviço:

    kubectl delete -f sleep.yaml -n ns-not-in-mesh

    Verifique 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.