Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Cenário 3: Propagar headers de baggage

Última atualização: Jun 28, 2026

As faixas de tráfego em modo permissivo permitem isolar versões de aplicações. Esse processo propaga um header de requisição de roteamento nos headers de baggage para direcionar o tráfego a diferentes faixas. Quando os serviços dentro de uma faixa de tráfego se comunicam e o serviço de destino não existe na faixa atual, a requisição é encaminhada para a faixa baseline. Isso garante a integridade da cadeia de chamadas e simplifica o gerenciamento de tráfego.

Importante

Antes de começar, leia e compreenda o tópico Usar faixas de tráfego em modo permissivo para gerenciar tráfego de ponta a ponta e seu conteúdo relacionado.

Visão geral do cenário

Este exemplo simula uma cadeia de chamadas com três serviços (mocka, mockb e mockc) e três faixas de tráfego (s1, s2 e s3). Primeiro, você usará a instrumentação automática do OpenTelemetry para ativar a propagação de headers de baggage nos serviços. Em seguida, criará três faixas de tráfego em modo permissivo e direcionará o tráfego por meio de uma política de roteamento baseada em pesos.

Etapa 1: Implantar os serviços de exemplo

  1. Ative a injeção automática de proxy sidecar no namespace default. Para mais informações, consulte Gerenciar namespaces globais.

    Nota

    Para mais detalhes sobre a injeção automática, consulte Configurar políticas de injeção de sidecar.

  2. Crie um arquivo chamado mock.yaml com o seguinte conteúdo.

    Conteúdo de mock.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mocka
      labels:
        app: mocka
        service: mocka
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mocka
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v1
      labels:
        app: mocka
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mocka
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mockb
      labels:
        app: mockb
        service: mockb
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mockb
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v1
      labels:
        app: mockb
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mockb
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mockc
      labels:
        app: mockc
        service: mockc
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mockc
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v1
      labels:
        app: mockc
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mockc
            version: v1
            ASM_TRAFFIC_TAG: v1
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v2
      labels:
        app: mocka
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mocka
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v2
      labels:
        app: mockb
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mockb
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v2
      labels:
        app: mockc
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mockc
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v3
      labels:
        app: mocka
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mocka
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v3
      labels:
        app: mockb
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mockb
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v3
      labels:
        app: mockc
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mockc
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mockc
            ports:
            - containerPort: 8000

    Essas anotações declaram que o serviço é uma aplicação Java e instruem o OpenTelemetry Operator a realizar a instrumentação automática no contêiner chamado default.

  3. Execute o comando a seguir para implantar os serviços de exemplo.

    kubectl apply -f mock.yaml

    A instrumentação automática do OpenTelemetry permite que os pods de serviço implantados propaguem automaticamente os headers de baggage ao longo da cadeia de chamadas.

Etapa 2: Criar um grupo de faixas e suas faixas de tráfego

  1. Crie um grupo de faixas.

    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 no 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 e clique em OK.

      Parâmetro

      Descrição

      Name of swim lane group

      Insira test.

      Entrance gateway

      Selecione ingressgateway.

      Lane Mode

      Selecione Permissive Mode.

      Pass-through Mode of Trace Context

      Selecione Pass Through Baggage Header.

      Routing Request Header

      Insira x-asm-prefer-tag.

      Swimlane Services

      Selecione o cluster Kubernetes de destino e o namespace default. Na lista de serviços, selecione mocka, mockb e mockc e clique no ícone image.png para adicionar os serviços à área selected.

  2. Crie as faixas de tráfego s1, s2 e s3 e vincule-as às versões v1, v2 e v3, respectivamente.

    1. Na página Traffic Lane, vá até a seção Traffic Rule Definition e clique em Create swimlanes.

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

    Parâmetro

    Descrição

    Swimlane Name

    Insira s1, s2 e s3 para as três faixas de tráfego, respectivamente.

    Configure Service Tag

    Label Key: Insira ASM_TRAFFIC_TAG.

    Label Value: Insira v1, v2 e v3 para as três faixas de tráfego, respectivamente.

    Add Service

    • Faixa s1: Selecione mocka(default), mockb(default) e mockc(default).

    • Faixa s2: Selecione mocka(default) e mockc(default).

    • Faixa s3: Selecione mockb(default).

    Por padrão, o ASM define a primeira faixa de tráfego criada em um grupo de faixas como a faixa baseline. Também é possível alterar a faixa baseline. Quando o tráfego é enviado para um serviço que não existe em outra faixa de tráfego, um mecanismo de fallback encaminha a requisição para a faixa baseline. Para mais informações sobre como alterar a faixa baseline, consulte Alterar a faixa baseline no modo permissivo.

    No painel de navegação à esquerda do console, você pode escolher Traffic Management Center > DestinationRule ou VirtualService para visualizar os recursos DestinationRule e VirtualService que o ASM gera automaticamente para cada serviço no grupo de faixas. Por exemplo, o DestinationRule e o VirtualService a seguir são criados automaticamente para o serviço mocka.

    DestinationRule e VirtualService

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      labels:
        asm-system: 'true'
        provider: asm
        swimlane-group: test
      name: trafficlabel-dr-test-default-mocka
      namespace: istio-system
    spec:
      host: mocka.default.svc.cluster.local
      subsets:
        - labels:
            ASM_TRAFFIC_TAG: v1
          name: s1
        - labels:
            ASM_TRAFFIC_TAG: v2
          name: s2
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      labels:
        asm-system: 'true'
        provider: asm
        swimlane-group: test
      name: trafficlabel-vs-test-default-mocka
      namespace: istio-system
    spec:
      hosts:
        - mocka.default.svc.cluster.local
      http:
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s1
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s1
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s2
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s2
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
        - match:
            - headers:
                x-asm-prefer-tag:
                  exact: s3
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: s3
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: s1
  3. Crie uma regra de roteamento unificada baseada em pesos.

    1. Na página Traffic Lane, na seção Traffic Rule Definition, clique em Weight-based Routing na seção Routing Policy.

    2. Na caixa de diálogo Set Unified Routing Rules, configure os parâmetros e clique em OK. O exemplo a seguir mostra como configurar uma regra de roteamento unificada para as três faixas de tráfego, considerando que a API de entrada para o serviço da faixa seja /mock.

      Parâmetro

      Descrição

      realm name

      Defina como *.

      Matching request URI

      Defina Method como Prefix e Content como /.

  4. Defina os pesos de roteamento para as três faixas de tráfego. Os pesos determinam a proporção de tráfego enviada para cada faixa.

    1. Na página Traffic Lane, na seção Traffic Rule Definition, clique no ícone image.png ao lado do número na coluna Traffic Routing Weight de cada faixa. Na caixa de diálogo Edit Traffic Routing Weight, configure os parâmetros e clique em OK.

      Parâmetro

      Descrição

      Ingress service

      Defina como mocka.default.svc.cluster.local para todas as três faixas de tráfego.

      Weight Value

      • Para a faixa s1, insira 60.

      • Para a faixa s2, insira 20.

      • Para a faixa s3, insira 20.

Etapa 3: Verificar a liberação canary de ponta a ponta

  1. Obtenha o endereço IP público do gateway de entrada do ASM. Para mais informações, consulte Obter o endereço IP do gateway de entrada do ASM.

  2. Execute o comando a seguir para definir uma variável de ambiente. Substitua xxx.xxx.xxx.xxx pelo endereço IP obtido na etapa anterior.

    export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
  3. Verifique a liberação canary de ponta a ponta.

    1. Execute o comando a seguir para observar o comportamento de acesso nas três faixas de tráfego.

      for i in {1..100};  do curl http://${ASM_GATEWAY_IP}/ ;  echo ''; sleep 1; done;

      Saída esperada:

      # Traffic to lane s1 (baseline): all services are v1.
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)
      
      # Traffic to lane s2: mocka and mockc are v2, mockb falls back to v1 in the baseline lane.
      -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189)
      
      # Traffic to lane s3: mockb is v3, mocka and mockc fall back to v1 in the baseline lane.
      -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190)
      
      # The output will show a mix of the above patterns, with distribution approximating 6:2:2 for s1:s2:s3.

      A saída mostra que o tráfego é distribuído para as faixas de tráfego s1, s2 e s3 em uma proporção aproximada de 6:2:2. A faixa s1 atua como a faixa baseline. Quando um serviço na cadeia de chamadas não existe na faixa de destino, a requisição retorna para o serviço correspondente na faixa baseline (s1).