Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Shift TCP traffic between application versions

Última atualização: Jun 28, 2026

Seja para otimizar a topologia de rede, escalar horizontalmente os servidores de aplicativos ou limitar o tráfego de usuários, direcionar todo o tráfego para uma nova versão de uma só vez pode causar indisponibilidade caso a versão apresente problemas. O Service Mesh (ASM) oferece suporte a regras de roteamento TCP ponderado que dividem o tráfego entre várias versões de um serviço — por exemplo, enviando 80% para v1 e 20% para v2 — permitindo validar uma nova versão de forma incremental antes da migração total.

Este tutorial utiliza o padrão de desvio de tráfego TCP do Istio com um aplicativo de exemplo tcp-echo que possui duas versões:

  • v1 adiciona o prefixo one aos carimbos de data/hora das respostas

  • v2 adiciona o prefixo two aos carimbos de data/hora das respostas

Ao final deste tutorial, você terá configurado o roteamento TCP ponderado e verificado que o tráfego se divide corretamente entre as versões.

Como funciona o desvio de tráfego

O ASM utiliza três recursos do Istio para controlar o fluxo de tráfego TCP:

Recurso

Função

Gateway

Expõe uma porta TCP no gateway de entrada para aceitar conexões recebidas

DestinationRule

Define subconjuntos nomeados (v1, v2) com base nos rótulos dos pods

VirtualService

Roteia o tráfego que chega ao Gateway para subconjuntos específicos com pesos configuráveis

Caminho do tráfego:

Cliente -> Gateway de entrada (porta 31400) -> VirtualService (roteamento baseado em peso) -> DestinationRule (subconjuntos v1/v2) -> pods tcp-echo (porta 9000)

Pré-requisitos

Etapa 1: Implantar o aplicativo de exemplo

Implante duas versões do aplicativo tcp-echo e crie um Serviço do Kubernetes para expô-las.

Implantar os Deployments do tcp-echo

  1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, escolha Workloads > Deployments.

  3. No topo da página Deployments, selecione um namespace na lista suspensa Namespace e clique em Create from YAML.

  4. Selecione Custom na lista suspensa Sample Template, cole o YAML a seguir no editor Template e clique em Create. Este YAML cria dois Deployments. Cada um executa a imagem tcp-echo-server na porta 9000, mas com um argumento de prefixo diferente (one para v1, two para v2). Ambos os Deployments compartilham o rótulo app: tcp-echo para que um único Serviço possa rotear para qualquer uma das versões. Após a criação, ambos os Deployments aparecem na página Deployments.

    Show the YAML code

       apiVersion: apps/v1
       kind: Deployment
       metadata:
         name: tcp-echo-v1
       spec:
         replicas: 1
         selector:
           matchLabels:
             app: tcp-echo
             version: v1
         template:
           metadata:
             labels:
               app: tcp-echo
               version: v1
           spec:
             containers:
             - name: tcp-echo
               image: docker.io/istio/tcp-echo-server:1.1
               imagePullPolicy: IfNotPresent
               args: [ "9000", "one" ]
               ports:
               - containerPort: 9000
       ---
       apiVersion: apps/v1
       kind: Deployment
       metadata:
         name: tcp-echo-v2
       spec:
         replicas: 1
         selector:
           matchLabels:
             app: tcp-echo
             version: v2
         template:
           metadata:
             labels:
               app: tcp-echo
               version: v2
           spec:
             containers:
             - name: tcp-echo
               image: docker.io/istio/tcp-echo-server:1.1
               imagePullPolicy: IfNotPresent
               args: [ "9000", "two" ]
               ports:
               - containerPort: 9000

Criar o Serviço tcp-echo

  1. Na página de detalhes do cluster, escolha Network > Services no painel de navegação à esquerda.

  2. Selecione o mesmo namespace e clique em Create.

  3. Na caixa de diálogo Create Service, configure os parâmetros a seguir e clique em OK. Após a criação, o Serviço tcp-echo aparece na página Services.

    Parâmetro

    Valor

    Name

    tcp-echo

    Service Type

    Selecione um tipo com base em como deseja expor o serviço. Valores válidos: Cluster IP, Node Port e Server Load Balancer.

    Backend

    Defina Name como app e Value como tcp-echo-v1. Os Deployments v1 e v2 compartilham o rótulo app: tcp-echo, portanto o Serviço roteia para ambos, independentemente de qual Deployment você especificar aqui.

    Port Mapping

    Defina Name como tcp, Service Port e Container Port como 9000, e Protocol como TCP.

Etapa 2: Configurar regras de roteamento

Crie um gateway Istio, uma regra de destino e um serviço virtual para rotear inicialmente todo o tráfego TCP para v1.

  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 no nome da sua instância do ASM.

Criar um gateway Istio

Um gateway Istio define o ponto de entrada externo para conexões TCP. A configuração a seguir escuta na porta 31400 e encaminha conexões para o mesh.

  1. No painel de navegação à esquerda, escolha ASM Gateways > Gateway. Clique em Create from YAML.

  2. Selecione default na lista suspensa Namespace, cole o YAML a seguir e clique em Create.

       apiVersion: networking.istio.io/v1alpha3
       kind: Gateway
       metadata:
         name: tcp-echo-gateway
       spec:
         selector:
           istio: ingressgateway    # Use the default ingress gateway
         servers:
         - port:
             number: 31400          # External-facing TCP port
             name: tcp
             protocol: TCP
           hosts:
           - "*"                    # Accept connections from any host

Criar uma regra de destino

Uma regra de destino mapeia rótulos de pods para subconjuntos nomeados que o serviço virtual referencia nas decisões de roteamento.

  1. No painel de navegação à esquerda, escolha Traffic Management Center > DestinationRule. Clique em Create from YAML.

  2. Selecione default na lista suspensa Namespace, cole o YAML a seguir e clique em Create.

       apiVersion: networking.istio.io/v1alpha3
       kind: DestinationRule
       metadata:
         name: tcp-echo-destination
       spec:
         host: tcp-echo             # Matches the Kubernetes Service name
         subsets:
         - name: v1
           labels:
             version: v1            # Selects pods with label version=v1
         - name: v2
           labels:
             version: v2            # Selects pods with label version=v2

Criar um serviço virtual

Um serviço virtual contém a lógica de roteamento. A configuração a seguir envia 100% do tráfego TCP na porta 31400 para o subconjunto v1. Você atualizará os pesos em uma etapa posterior para desviar o tráfego para v2.

  1. No painel de navegação à esquerda, escolha Traffic Management Center > VirtualService. Clique em Create from YAML.

  2. Selecione default na lista suspensa Namespace, cole o YAML a seguir e clique em Create.

       apiVersion: networking.istio.io/v1alpha3
       kind: VirtualService
       metadata:
         name: tcp-echo
       spec:
         hosts:
         - "*"
         gateways:
         - tcp-echo-gateway          # Bind to the gateway created above
         tcp:
         - match:
           - port: 31400             # Match traffic arriving on this port
           route:
           - destination:
               host: tcp-echo        # Target the tcp-echo Kubernetes Service
               port:
                 number: 9000
               subset: v1            # Send all traffic to v1

Etapa 3: Implantar um gateway de entrada

Adicione a porta 31400 ao gateway de entrada para que o tráfego TCP externo alcance o gateway Istio.

  1. Na página de detalhes da instância do ASM, escolha ASM Gateways > Ingress Gateway no painel de navegação à esquerda.

  2. Clique em Create e configure os parâmetros a seguir.

    Parâmetro

    Valor

    Cluster

    Selecione o cluster ACK onde o aplicativo de exemplo está implantado.

    CLB Instance Type

    Selecione Internet Access.

    CLB Instance

    Selecione uma instância CLB existente ou crie uma nova. Utilize uma instância CLB dedicada por Serviço do Kubernetes para evitar conflitos de listener. Para mais informações, consulte Criar um gateway de entrada.

    Port Mapping

    Defina o protocolo como TCP e a porta do serviço como 31400.

  3. Clique em Create.

Etapa 4: Verificar o roteamento inicial

Confirme se todo o tráfego TCP está chegando à versão v1.

  1. Conecte-se ao cluster ACK com kubectl. Para mais informações, consulte Obter o arquivo kubeconfig de um cluster e usar kubectl para conectar-se ao cluster.

  2. Recupere o endereço IP e a porta TCP do gateway de entrada:

       export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
       export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
  3. Conecte-se ao serviço tcp-echo via TCP: Saída esperada:

       telnet $INGRESS_HOST $INGRESS_PORT
       Trying xxx.xxx.xxx.xxx...
       Connected to xxx.xxx.xxx.xxx.
       Escape character is '^]'
  4. Insira qualquer string e pressione Enter. Se a resposta começar com one, todo o tráfego estará sendo roteado para v1.

Etapa 5: Desviar tráfego para v2

Atualize o serviço virtual para enviar 80% do tráfego para v1 e 20% para v2.

  1. Na página de detalhes da instância do ASM, escolha Traffic Management Center > VirtualService no painel de navegação à esquerda.

  2. Localize o serviço virtual tcp-echo e clique em YAML na coluna Actions.

  3. Na caixa de diálogo Edit, substitua o YAML pelo conteúdo a seguir e clique em OK. A única alteração em relação ao serviço virtual original é a adição de uma segunda entrada de rota com campos weight que controlam a divisão do tráfego.

       apiVersion: networking.istio.io/v1alpha3
       kind: VirtualService
       metadata:
         name: tcp-echo
       spec:
         hosts:
         - "*"
         gateways:
         - tcp-echo-gateway
         tcp:
         - match:
           - port: 31400
           route:
           - destination:
               host: tcp-echo
               port:
                 number: 9000
               subset: v1
             weight: 80              # 80% of traffic to v1
           - destination:
               host: tcp-echo
               port:
                 number: 9000
               subset: v2
             weight: 20              # 20% of traffic to v2
  4. Envie 10 solicitações para verificar a divisão do tráfego: Saída de exemplo: Respostas com o prefixo one vêm de v1; aquelas com two vêm de v2. Com uma amostra pequena, a proporção real pode não corresponder exatamente a 80:20, mas converge para os pesos configurados à medida que o número de solicitações aumenta.

       for i in {1..10}; do \
       docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \
       done
       one Mon Nov 12 23:38:45 UTC 2018
       two Mon Nov 12 23:38:47 UTC 2018
       one Mon Nov 12 23:38:50 UTC 2018
       one Mon Nov 12 23:38:52 UTC 2018
       one Mon Nov 12 23:38:55 UTC 2018
       two Mon Nov 12 23:38:57 UTC 2018
       one Mon Nov 12 23:39:00 UTC 2018
       one Mon Nov 12 23:39:02 UTC 2018
       one Mon Nov 12 23:39:05 UTC 2018
       one Mon Nov 12 23:39:07 UTC 2018
  5. Aumente gradualmente o valor de weight de v2 conforme ganha confiança na nova versão, até que v2 processe 100% do tráfego.

Limpar recursos

Após os testes, exclua os recursos criados neste tutorial para evitar cobranças desnecessárias.

  1. Exclua os recursos de roteamento do Istio no console do ASM:

    • Na página de detalhes da instância do ASM, acesse Traffic Management Center > VirtualService, localize tcp-echo e clique em Delete na coluna Actions.

    • Acesse Traffic Management Center > DestinationRule, localize tcp-echo-destination e exclua-o.

    • Acesse ASM Gateways > Gateway, localize tcp-echo-gateway e exclua-o.

    • Acesse ASM Gateways > Ingress Gateway e exclua o gateway de entrada criado para este tutorial.

  2. Exclua os recursos do Kubernetes no console do ACK:

    • Acesse Workloads > Deployments, localize tcp-echo-v1 e tcp-echo-v2 e exclua-os.

    • Acesse Network > Services, localize tcp-echo e exclua-o.