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
-
Os seguintes serviços da Alibaba Cloud estão ativados:
Crie um cluster ACK. Para obter instruções, consulte Create an ACK managed cluster e Create an ACK dedicated cluster (Discontinued).
Adicione o cluster ACK a uma instância do ASM. Para obter instruções, consulte Create an ASM instance e Add a cluster to an ASM instance.
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
telnete o Docker no computador usado para verificação. A Etapa 4 usatelnetpara abrir uma conexão TCP com o servicetcp-echo, e a Etapa 5 usadocker runpara 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.
-
Implante duas versões da aplicação
tcp-echo.Faça logon no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
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.
-
Defina Sample Template como Custom, cole o seguinte YAML na caixa de texto Template e clique em Create.
As duas novas versões da aplicação
tcp-echoaparecem na página Deployments.
-
Crie um Service para expor externamente a aplicação
tcp-echo.Faça logon no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
Na página Services, selecione o Namespace desejado na parte superior da página e clique em Create no canto superior direito.
-
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.
NotaSó é 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.
NotaO Service usa o rótulo
appdo Deployment associado como seletor, determinando para qual Deployment o Service do Kubernetes encaminha o tráfego. Como os Deploymentstcp-echo-v1etcp-echo-v2compartilham o mesmo rótuloapp: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.
NotaSó é 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
annotationao Service para configurar parâmetros de balanceamento de carga. Por exemplo,service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20define 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.
Faça logon no console ASM. No painel de navegação à esquerda, escolha .
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.
-
Crie um Gateway.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
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: - "*"
-
Crie um VirtualService.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
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
-
Crie um DestinationRule.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
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
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.
Faça logon no console ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância do ASM. No painel de navegação à esquerda, escolha .
-
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.
-
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}') -
Execute o comando
telnetpara enviar uma solicitação de conexão ao servicetcp-echo.telnet $INGRESS_HOST $INGRESS_PORTTrying xxx.xxx.xxx.xxx... Connected to xxx.xxx.xxx.xxx. Escape character is '^]' -
Insira qualquer string e pressione Enter.
A string retornada tem o prefixo
one, indicando que o servicetcp-echofoi implantado e que todo o tráfego está roteado para a versãotcp-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.
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%.
-
Modifique a configuração do VirtualService da instância do ASM.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda.
Na página VirtualService, localize o service
tcp-echoe clique em YAML na coluna Actions.-
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
-
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"; \ doneone 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 2018A saída mostra que 20% do tráfego foi roteado para
tcp-echo-v2.