Ao implantar uma nova versão de serviço, valide-a com tráfego real de produção antes de direcionar os usuários para ela. O espelhamento de tráfego (shadowing) copia solicitações ativas para um serviço secundário sem afetar o caminho da solicitação principal. O serviço espelhado processa o tráfego real, mas descarta as respostas. Isso permite comparar comportamento, taxas de erro e latência entre versões sem impacto aos usuários.
O Service Mesh (ASM) oferece suporte ao espelhamento de tráfego por meio dos recursos DestinationRule e VirtualService do Istio.
Pré-requisitos
Conclua as etapas de preparação e implante os serviços helloworld e sleep. Para mais informações, consulte Preparações.
Etapa 1: Verifique o roteamento de base
Antes de configurar o espelhamento, confirme se tanto helloworld-v1 quanto helloworld-v2 recebem tráfego.
-
Use o kubectl para conectar-se ao cluster do Container Service for Kubernetes (ACK) com base nas informações do arquivo kubeconfig e abra um shell no pod
sleep:kubectl exec -it deploy/sleep -- sh -
Envie várias solicitações ao serviço
helloworld:curl helloworld:5000/helloAmbas as versões respondem aleatoriamente:
Hello version: v2, instance: helloworld-v2-6b96c5684-4**** Hello version: v1, instance: helloworld-v1-6d77f4c4cf-p**** -
Verifique os logs do
helloworld-v2para estabelecer uma linha de base. Registre a saída atual dos logs para comparação após a configuração do espelhamento:kubectl logs deploy/helloworld-v2 -c helloworld
Etapa 2: Configure o espelhamento de tráfego
Crie uma regra de destino e um serviço virtual que encaminhem todas as solicitações ao helloworld-v1 e, simultaneamente, espelhem uma cópia de cada solicitação ao helloworld-v2.
Crie uma regra de destino
Defina subconjuntos para v1 e v2. Para mais informações, consulte Gerencie regras de destino.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: helloworld
namespace: default
spec:
host: helloworld
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
Crie um serviço virtual
Encaminhe todo o tráfego ao subconjunto v1 e espelhe-o no subconjunto v2. O campo mirror especifica o alvo do espelhamento. Para mais informações, consulte Gerencie serviços virtuais.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: helloworld-vs
namespace: default
spec:
hosts:
- helloworld
http:
- mirror: # Mirror traffic to v2
host: helloworld
subset: v2
route:
- destination: # Route live traffic to v1
host: helloworld
subset: v1
Etapa 3: Verifique o espelhamento
Confirme que apenas a v1 responde ao tráfego ativo
-
Use o kubectl para conectar-se ao cluster ACK com base nas informações do arquivo kubeconfig e abra um shell no pod
sleep:kubectl exec -it deploy/sleep -- sh -
Envie uma solicitação ao serviço
helloworld:curl helloworld:5000/helloApenas o
helloworld-v1responde:Hello version: v1, instance: helloworld-v1-6d77f4c4cf-p****
Confirme que a v2 recebe o tráfego espelhado
Verifique os logs do pod helloworld-v2 para confirmar o recebimento da solicitação espelhada:
kubectl logs deploy/helloworld-v2 -c helloworld
Compare a saída com a linha de base registrada na Etapa 1. Novas entradas nos logs de acesso confirmam que o helloworld-v2 recebe tráfego espelhado.
Você também pode visualizar a topologia do serviço no console do ASM. O gráfico de topologia mostra o tráfego espelhado fluindo para o helloworld-v2. Para mais detalhes, consulte Usar a Topologia de Malha para visualizar a topologia de um aplicativo.
