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
oneaos carimbos de data/hora das respostasv2 adiciona o prefixo
twoaos 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
O Container Service for Kubernetes (ACK) e o Classic Load Balancer (CLB) devem estar ativados.
Um cluster ACK deve estar criado. Para mais informações, consulte Criar um cluster dedicado ACK ou Criar um cluster gerenciado ACK.
O cluster ACK deve estar adicionado a uma instância do ASM. Para mais informações, consulte Criar uma instância do ASM e Adicionar um cluster a uma instância do ASM.
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
Faça login no console do 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, escolha Workloads > Deployments.
No topo da página Deployments, selecione um namespace na lista suspensa Namespace e clique em Create from YAML.
-
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-serverna porta 9000, mas com um argumento de prefixo diferente (onepara v1,twopara v2). Ambos os Deployments compartilham o rótuloapp: tcp-echopara 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.
Criar o Serviço tcp-echo
Na página de detalhes do cluster, escolha Network > Services no painel de navegação à esquerda.
Selecione o mesmo namespace e clique em Create.
-
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-echoaparece na página Services.Parâmetro
Valor
Name
tcp-echoService 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
appe Value comotcp-echo-v1. Os Deployments v1 e v2 compartilham o rótuloapp: 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 como9000, 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.
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
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.
No painel de navegação à esquerda, escolha ASM Gateways > Gateway. Clique em Create from YAML.
-
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.
No painel de navegação à esquerda, escolha Traffic Management Center > DestinationRule. Clique em Create from YAML.
-
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.
No painel de navegação à esquerda, escolha Traffic Management Center > VirtualService. Clique em Create from YAML.
-
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.
Na página de detalhes da instância do ASM, escolha ASM Gateways > Ingress Gateway no painel de navegação à esquerda.
-
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
TCPe a porta do serviço como31400. Clique em Create.
Etapa 4: Verificar o roteamento inicial
Confirme se todo o tráfego TCP está chegando à versão v1.
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.
-
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}') -
Conecte-se ao serviço
tcp-echovia TCP: Saída esperada:telnet $INGRESS_HOST $INGRESS_PORTTrying xxx.xxx.xxx.xxx... Connected to xxx.xxx.xxx.xxx. Escape character is '^]' 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.
Na página de detalhes da instância do ASM, escolha Traffic Management Center > VirtualService no painel de navegação à esquerda.
Localize o serviço virtual
tcp-echoe clique em YAML na coluna Actions.-
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
weightque 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 -
Envie 10 solicitações para verificar a divisão do tráfego: Saída de exemplo: Respostas com o prefixo
onevêm de v1; aquelas comtwovê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"; \ 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 2018 Aumente gradualmente o valor de
weightde 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.
-
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-echoe clique em Delete na coluna Actions.Acesse Traffic Management Center > DestinationRule, localize
tcp-echo-destinatione exclua-o.Acesse ASM Gateways > Gateway, localize
tcp-echo-gatewaye exclua-o.Acesse ASM Gateways > Ingress Gateway e exclua o gateway de entrada criado para este tutorial.
-
Exclua os recursos do Kubernetes no console do ACK:
Acesse Workloads > Deployments, localize
tcp-echo-v1etcp-echo-v2e exclua-os.Acesse Network > Services, localize
tcp-echoe exclua-o.