Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Migrar tráfego TCP com o ASM

Última atualização: Sep 12, 2026

O Traffic Management Center do Service Mesh (ASM) migra suavemente o tráfego de aplicações TCP durante a otimização da topologia de rede, a expansão horizontal dos servidores de aplicação ou o ajuste do tráfego de service, garantindo a continuidade dos negócios e a alta disponibilidade. Este tópico usa a tarefa Istio TCP-Traffic-Shifting para descrever o deslocamento canário de tráfego entre duas versões de um service TCP.

Pré-requisitos

Serviços e recursos cloud

Ferramentas de cliente local

  • Instale o cliente kubectl e conecte-o ao cluster Kubernetes. Para obter instruções, consulte Obtain the kubeconfig file and use kubectl to connect to the cluster.

  • Disponibilize um cliente telnet e o Docker no computador usado para verificação. A Etapa 4 usa telnet para abrir uma conexão TCP com o service tcp-echo, e a Etapa 5 usa docker run para enviar solicitações de teste.

Etapa 1: Implantar a aplicação de exemplo

A aplicação de exemplo tcp-echo executa em duas versões: a v1 prefixa cada resposta com one, e a v2 prefixa cada resposta com two. O prefixo identifica a versão que processa a solicitação, permitindo observar a distribuição de tráfego posteriormente neste tópico.

  1. Implante duas versões da aplicação tcp-echo.

    1. Faça logon no console 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, clique em Workloads > Deployments.

    3. Na página Deployments, selecione o Namespace desejado na parte superior da página e clique em Create Resources in YAML no canto superior direito.

    4. Defina Sample Template como Custom, cole o seguinte YAML na caixa de texto Template e clique em Create.

      Show the YAML file

      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

      As duas novas versões da aplicação tcp-echo aparecem na página Deployments.

  2. Crie um Service para expor externamente a aplicação tcp-echo.

    1. Faça logon no console 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, clique em Network > Services.

    3. Na página Services, selecione o Namespace desejado na parte superior da página e clique em Create no canto superior direito.

    4. Na caixa de diálogo Create Service, configure os parâmetros descritos na tabela a seguir e clique em Confirm.

      Parâmetro

      Descrição

      Service

      Insira tcp-echo.

      Service Type

      Selecione o método de acesso para o Service. Os tipos compatíveis são ClusterIP, NodePort e LoadBalancer.

      Nota

      Só é possível definir Headless Service quando Service Type estiver definido como Cluster IP. Use um Headless Service para integrar-se a outros sistemas de descoberta de service em vez de vincular-se à implementação do Kubernetes.

      Backend

      Defina Name como app e Value como tcp-echo.

      Nota

      O Service usa o rótulo app do Deployment associado como seletor, determinando para qual Deployment o Service do Kubernetes encaminha o tráfego. Como os Deployments tcp-echo-v1 e tcp-echo-v2 compartilham o mesmo rótulo app:tcp-echo, o Service pode rotear o tráfego para qualquer um deles.

      External Traffic Policy

      As opções Local e Cluster são compatíveis.

      Nota

      Só é possível configurar External Traffic Policy quando o tipo de Service for Node Port ou Server Load Balancer.

      Port Mapping

      Neste tópico, defina Name como tcp, defina Service Port e Container Port como 9000 e defina Protocol como TCP.

      Annotations

      Adicione uma annotation ao Service para configurar parâmetros de balanceamento de carga. Por exemplo, service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20 define a largura de banda máxima do Service como 20 Mbit/s, controlando seu tráfego. Para mais informações sobre os parâmetros, consulte Configure a Classic Load Balancer (CLB) instance by using annotations.

      Label

      Adicione um rótulo para identificar o Service.

      Após criar o Service, o novo Service tcp-echo aparece na página Services.

Etapa 2: Configurar regras de roteamento

Configure um Istio Gateway, um VirtualService e um DestinationRule no Service Mesh para rotear todo o tráfego para a versão v1 do service tcp-echo. O Gateway escuta na porta 31400; portanto, o tráfego externo só alcançará essas regras após você adicionar a porta 31400 ao service do ingress gateway na Etapa 3.

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

  2. Na página Mesh Management, localize a instância do ASM que deseja configurar. Clique no nome da instância do ASM ou clique em Manage na coluna Actions.

  3. Crie um Gateway.

    1. Na página de detalhes da instância do ASM, escolha ASM Gateways > Gateway no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.

    2. Na página Create, defina Namespace como default, selecione qualquer Scenario Template, cole o seguinte YAML e clique em Create.

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: tcp-echo-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - port:
            number: 31400
            name: tcp
            protocol: TCP
          hosts:
          - "*"
  4. Crie um VirtualService.

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

    2. Na página Create, defina Namespace como default, selecione qualquer Scenario Template, cole o seguinte YAML e clique em Create.

      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
  5. Crie um DestinationRule.

    1. Na página de detalhes da instância do ASM, escolha Traffic Management Center > DestinationRule no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.

    2. Na página Create, defina Namespace como default, selecione qualquer Scenario Template, cole o seguinte YAML e clique em Create.

      apiVersion: networking.istio.io/v1alpha3
      kind: DestinationRule
      metadata:
        name: tcp-echo-destination
      spec:
        host: tcp-echo
        subsets:
        - name: v1
          labels:
            version: v1
        - name: v2
          labels:
            version: v2

Etapa 3: Implantar um ingress gateway

Importante

Aloque uma instância CLB para cada Service do Kubernetes. Se vários Services do Kubernetes compartilharem a mesma instância CLB, aplicam-se os seguintes riscos e limitações:

  • O uso de uma instância CLB existente sobrescreve forçosamente seus listeners atuais, o que pode tornar sua aplicação inacessível.

  • Não é possível reutilizar uma instância CLB criada pelo Kubernetes por meio de um Service. Apenas instâncias CLB criadas manualmente no console ou via chamada de operação OpenAPI podem ser reutilizadas.

  • Vários Services que compartilham a mesma instância CLB não podem usar a mesma porta de listener frontend. Caso contrário, ocorrerá um conflito de porta.

  • Ao reutilizar uma instância CLB, o Kubernetes usa o nome do listener e o nome do grupo de servidor virtual como identificadores únicos. Não modifique esses nomes.

  • Não é possível reutilizar uma instância CLB entre clusters diferentes.

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

  2. Na página Mesh Management, clique no nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.

  3. Na página Ingress Gateway, clique em Create, conclua a configuração e clique em Create.

    A tabela a seguir descreve alguns itens de configuração. Para mais informações, consulte Create an ingress gateway.

    Parâmetro

    Descrição

    Cluster

    Selecione o cluster onde deseja implantar o ingress gateway.

    CLB instance type

    Neste tópico, selecione Access over the Internet.

    Select CLB Instance

    Escolha uma das seguintes opções. Use Existing CLB Instance: selecione uma instância da lista de instâncias CLB existentes. Create CLB Instance: clique em Create SLB Instance e selecione a especificação CLB necessária na lista suspensa.

    Port Mapping

    Clique em Add Port, defina Name como tcp e defina Service Port como 31400.

Etapa 4: Verificar a implantação

Use o kubectl para confirmar se o tráfego para o service tcp-echo está sendo roteado conforme esperado.

  1. Execute os comandos a seguir para obter o endereço e a porta do service:

    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}')
  2. Execute o comando telnet para enviar uma solicitação de conexão ao service tcp-echo.

    telnet $INGRESS_HOST $INGRESS_PORT
    Trying xxx.xxx.xxx.xxx...
    Connected to xxx.xxx.xxx.xxx.
    Escape character is '^]'
  3. Insira qualquer string e pressione Enter.

    A string retornada tem o prefixo one, indicando que o service tcp-echo foi implantado e que todo o tráfego está roteado para a versão tcp-echo-v1.

Etapa 5: Roteamento de tráfego para v2 por peso

Esta etapa roteia 20% do tráfego para a versão tcp-echo-v2 e os 80% restantes para tcp-echo-v1.

Nota

Com uma amostra pequena de 10 solicitações, os resultados podem nem sempre mostrar exatamente 2 de 10 solicitações roteadas para tcp-echo-v2. No entanto, durante um período maior, a proporção geral se aproxima de 20%.

  1. Modifique a configuração do VirtualService da instância do ASM.

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

    2. Na página VirtualService, localize o service tcp-echo e clique em YAML na coluna Actions.

    3. Na caixa de texto da página Edit, insira o seguinte conteúdo YAML e clique em OK.

      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
          - destination:
              host: tcp-echo
              port:
                number: 9000
              subset: v2
            weight: 20
  2. Execute o comando a seguir para enviar 10 solicitações ao service tcp-echo:

    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

    A saída mostra que 20% do tráfego foi roteado para tcp-echo-v2.