Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Use lanes for end-to-end canary release

Última atualização: Jun 28, 2026

As lanes de tráfego isolam versões específicas de serviços em ambientes de execução independentes e roteiam solicitações correspondentes por toda a cadeia de chamadas, sem exigir alterações no código da aplicação. Esse mecanismo permite executar canary releases de ponta a ponta em vários serviços simultaneamente.

Por que usar lanes de tráfego

Implantações canary padrão no Kubernetes acoplam a distribuição de tráfego à quantidade de réplicas: enviar 10% do tráfego para uma versão canary exige 1 réplica canary junto com 9 réplicas estáveis. Essa abordagem apresenta limitações em dois cenários:

  • Cadeias de chamadas entre múltiplos serviços. Solicitações que passam pelos serviços A, B e C exigem roteamento de versão consistente em cada salto, mas o Kubernetes não oferece um mecanismo nativo para isso.

  • Dimensionamento independente. Com lanes, a distribuição de tráfego e a contagem de réplicas são totalmente desacopladas. Uma única réplica canary recebe exatamente a porcentagem de tráfego especificada, independentemente da quantidade de réplicas estáveis em execução.

As lanes de tráfego do ASM resolvem ambos os problemas ao marcar solicitações no gateway de entrada e propagar essa marcação por toda a cadeia de chamadas.

Como funciona

Configurar lanes pelo console gera automaticamente três recursos do Istio:

Recurso

Finalidade

TrafficLabel

Atribui um rótulo a cada solicitação com base no rótulo de pod ASM_TRAFFIC_TAG

DestinationRule

Mapeia nomes de lanes para subconjuntos de versão de serviço

VirtualService

Roteia solicitações para o subconjunto correto com base no cabeçalho x-asm-prefer-tag e na URI

Fluxo de roteamento:

  1. Uma solicitação chega ao gateway de entrada com o cabeçalho x-asm-prefer-tag: <lane-name>.

  2. O VirtualService corresponde ao cabeçalho e à URI e roteia a solicitação para o subconjunto correspondente do primeiro serviço.

  3. O TrafficLabel propaga a tag da lane pelas chamadas subsequentes entre serviços e mantém a solicitação na mesma lane durante toda a cadeia de chamadas.

Visão geral do cenário

Este tutorial implanta três lanes (s1, s2, s3), cada uma contendo três serviços (mocka, mockb, mockc) vinculados a diferentes versões:

Lane

Tag de serviço

Serviços

s1

v1

mocka, mockb, mockc

s2

v2

mocka, mockb, mockc

s3

v3

mocka, mockb, mockc

Após a configuração, solicitações com x-asm-prefer-tag: s1 fluem exclusivamente pela versão v1 de todos os três serviços; solicitações com s2 passam pela v2; e solicitações com s3 seguem pela v3.

Lane mode end-to-end canary release

Pré-requisitos

Antes de começar, verifique se você possui:

Exemplo de yaml do Gateway

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway        # Match the ASM ingress gateway
  servers:
    - port:
        number: 80               # Listen on port 80
        name: http
        protocol: HTTP
      hosts:
        - '*'                    # Accept traffic for all hosts

Etapa 1: Implantar serviços de exemplo

Ativar injeção automática de proxy sidecar

  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 em nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Instance > Global Namespace.

  3. Na página Global Namespace, localize o namespace default e clique em Enable Automatic Sidecar Injection na coluna Automatic Sidecar Injection. Na mensagem Submit, clique em OK.

Para mais informações, consulte Ativar injeção automática de proxy sidecar.

Implantar os serviços

Implante as versões v1, v2 e v3 dos serviços de exemplo no cluster ACK:

kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/application-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/application-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/application-v3.yaml

Etapa 2: Criar um grupo de lanes e lanes

Criar um grupo de lanes

  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 em nome da instância do ASM. No painel de navegação à esquerda, escolha Traffic Management Center > Traffic Lane.

  3. Na página Traffic Lane, clique em Create Swimlane Group. No painel Create Swimlane Group, configure os parâmetros a seguir e clique em OK.

Parâmetro

Valor

Name of swim lane group

test

Entrance gateway

ingressgateway

Swimlane Services

Selecione o cluster ACK na lista suspensa Kubernetes Clusters e escolha default na lista suspensa Namespace. Marque mocka, mockb e mockc na lista de serviços e clique em ícone move para adicioná-los à seção selected

Após criar o grupo de lanes, o ASM gera um recurso TrafficLabel:

yaml do TrafficLabel gerado

apiVersion: istio.alibabacloud.com/v1beta1
kind: TrafficLabel
metadata:
  labels:
    asm-system: 'true'
    provider: asm
  name: asm-trafficlabel-global
  namespace: istio-system
spec:
  rules:
    - labels:
        - name: asm-label
          valueFrom:
            - $getLabel(ASM_TRAFFIC_TAG)   # Reads the ASM_TRAFFIC_TAG label from each pod

Criar lanes

Crie três lanes (s1, s2, s3) e vincule cada uma à versão de serviço correspondente. As etapas a seguir mostram como criar a lane s1. Repita o mesmo processo para s2 (tag de serviço: v2) e s3 (tag de serviço: v3).

  1. Na seção Traffic Rule Definition da página Traffic Lane, clique em Create swimlanes.

  2. Na caixa de diálogo Create swimlanes, configure os parâmetros abaixo e clique em OK.

Parâmetro

Valor

Swimlane Name

s1

Configure Service Tag

v1

Add Service

Selecione mocka(default), mockb(default) e mockc(default)

Nota

Solicitações com o cabeçalho x-asm-prefer-tag: s1 são roteadas para o subconjunto v1 de cada serviço.

Create lane

Depois de criar todas as três lanes, a seção Traffic Rule Definition as exibe da seguinte forma:

Lanes overview

A criação de cada lane gera um DestinationRule. O exemplo a seguir mostra o DestinationRule para a lane s1:

yaml do DestinationRule gerado (lane s1)

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test                              # Belongs to the "test" lane group
  name: trafficlabel-dr-test-default-mocka
  namespace: istio-system
spec:
  host: mocka.default.svc.cluster.local               # Target service
  subsets:
    - labels:
        ASM_TRAFFIC_TAG: v1                            # Lane s1 maps to version v1
      name: s1
    - labels:
        ASM_TRAFFIC_TAG: v1
      name: v1
    - labels:
        ASM_TRAFFIC_TAG: v2                            # Lane s2 maps to version v2
      name: v2
    - labels:
        ASM_TRAFFIC_TAG: v2
      name: s2
    - labels:
        ASM_TRAFFIC_TAG: v3                            # Lane s3 maps to version v3
      name: v3
    - labels:
        ASM_TRAFFIC_TAG: v3
      name: s3

Criar regras de tráfego de entrada

Defina uma regra de roteamento de tráfego para cada lane. Os passos a seguir demonstram a criação de uma regra para a lane s1. Repita o procedimento para s2 e s3.

Este exemplo considera que todos os serviços das lanes compartilham o caminho de solicitação de entrada /mock.

  1. Na seção Traffic Rule Definition da página Traffic Lane, encontre a lane desejada e clique em Ingress traffic rules na coluna Actions.

  2. Na caixa de diálogo Add drainage rule, preencha os parâmetros indicados e clique em OK.

Parâmetro

Valor

Ingress service

mocka.default.svc.cluster.local

Ingress traffic rules

Name: r1, realm name: *

Matching request URI

Method: Exact, Content: /mock

Ao concluir a criação das regras de roteamento para as três lanes, a seção Traffic Rule Definition as apresentará assim:

Ingress traffic rules

O ASM gera um VirtualService que roteia solicitações com base no cabeçalho x-asm-prefer-tag:

yaml do VirtualService gerado

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  labels:
    asm-system: 'true'
    istioGateway: ingressgateway
    provider: asm
  name: ingressgateway
  namespace: istio-system
spec:
  gateways:
    - istio-system/ingressgateway                      # Bind to the ingress gateway
  hosts:
    - '*'                                              # Match all hosts
  http:
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s1                                # Match requests tagged for lane s1
          uri:
            exact: /mock                               # Match the /mock path
      name: swimelane-ingress-route-test-s1-rule1
      route:
        - destination:
            host: mocka.default.svc.cluster.local      # Route to mocka
            subset: s1                                 # Use the s1 subset (version v1)
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s2                                # Match requests tagged for lane s2
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s2-rule2
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s2                                 # Use the s2 subset (version v2)
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s3                                # Match requests tagged for lane s3
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s3-rule3
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s3                                 # Use the s3 subset (version v3)

Etapa 3: Verificar o canary release de ponta a ponta

Obter o endereço ip do gateway

Obtenha o endereço ip público do gateway de entrada do ASM. Para detalhes, veja a Etapa 2 em Integrar o serviço de inferência nativo da nuvem KServe com o ASM.

Defina o endereço ip como uma variável de ambiente. Substitua <gateway-ip-address> pelo endereço ip público real.

export ASM_GATEWAY_IP=<gateway-ip-address>

Testar cada lane

Envie 100 solicitações para cada lane e verifique se o tráfego permanece dentro das versões de serviço esperadas.

Lane s1 (esperado: tudo v1):

for i in {1..100}; do curl -H 'x-asm-prefer-tag: s1' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;

Saída esperada:

-> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)

Todos os três serviços retornam v1, confirmando que solicitações marcadas com x-asm-prefer-tag: s1 são roteadas exclusivamente pela lane s1.

Lane s2 (esperado: tudo v2):

for i in {1..100}; do curl -H 'x-asm-prefer-tag: s2' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;

Saída esperada:

-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v2, ip: 172.17.0.126)-> mockc(version: v2, ip: 172.17.0.128)

Lane s3 (esperado: tudo v3):

for i in {1..100}; do curl -H 'x-asm-prefer-tag: s3' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;

Saída esperada:

-> mocka(version: v3, ip: 172.17.0.132)-> mockb(version: v3, ip: 172.17.0.127)-> mockc(version: v3, ip: 172.17.0.69)

Solucionar problemas de roteamento

Caso alguma solicitação retorne uma versão incorreta, verifique os itens a seguir:

Sintoma

Possível causa

Resolução

A resposta mostra a versão errada

Os rótulos de pod ASM_TRAFFIC_TAG não correspondem à tag de serviço configurada para a lane

Verifique os rótulos dos pods com kubectl get pods --show-labels e confirme se correspondem à configuração da lane

Sem resposta ou erro 404

A rota do VirtualService não corresponde ao valor do cabeçalho x-asm-prefer-tag ou à URI

Verifique o yaml do VirtualService para confirmar as regras de correspondência de cabeçalho e o caminho da URI

Vazamento de tráfego entre lanes

Os subconjuntos do DestinationRule não mapeiam corretamente os nomes das lanes para os rótulos de versão

Inspecione o yaml do DestinationRule e verifique se cada subconjunto mapeia o valor correto de ASM_TRAFFIC_TAG

Falhas intermitentes de roteamento

Proxy sidecar não injetado em alguns pods

Execute kubectl get pods -o jsonpath='{.items[*].spec.containers[*].name}' para confirmar se o contêiner istio-proxy existe em todos os pods

(Opcional) Etapa 4: Verificar a topologia da malha

Se a Topologia da Malha estiver ativada no console do ASM, inspecione o gráfico de topologia para visualizar os caminhos de solicitação entre as lanes. Para mais informações, consulte Ativar a Topologia da Malha para observar uma instância do ASM no console do ASM.

Próximos passos

  • Rotular tráfego — Saiba mais sobre conceitos de rotulagem de tráfego e configurações avançadas