Todos os produtos
Search
Central de documentação

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

Última atualização: Aug 20, 2026

Use faixas de tráfego em modo permissivo para isolar versões de aplicações. Esse processo propaga um cabeçalho de requisição de roteamento nos baggage headers 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 base. Isso garante a integridade da cadeia de chamadas e simplifica o gerenciamento de tráfego.

Importante

Antes de começar, leia e compreenda Use traffic lanes in permissive mode to manage end-to-end traffic 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, use a instrumentação automática do OpenTelemetry para ativar a propagação de baggage headers nos serviços. Em seguida, crie três faixas de tráfego no modo permissivo e direcione o tráfego usando uma política de roteamento baseada em peso.

Etapa 1: Implantar os serviços de exemplo

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

    Nota

    Para mais detalhes sobre injeção automática, consulte Configure sidecar injection policies.

  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 executar 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 dos serviços implantados propaguem automaticamente os baggage headers 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 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 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 em í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 como a faixa base. Também é possível alterar a faixa base. Quando o tráfego é enviado para um serviço inexistente em outra faixa de tráfego, um mecanismo de fallback encaminha a requisição para a faixa base. Para mais informações sobre como alterar a faixa base, consulte Change the baseline lane in permissive mode.

    No painel de navegação à esquerda do console, escolha Traffic Management Center > DestinationRule ou VirtualService para visualizar os recursos DestinationRule e VirtualService gerados automaticamente pelo ASM 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 unificada de roteamento baseada em peso.

    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 /mock como a API de entrada do serviço da faixa.

      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 em í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 o canary release de ponta a ponta

  1. Obtenha o endereço IP público do ingress gateway do ASM. Para mais informações, consulte Obtain the IP address of the ASM ingress gateway.

  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 o canary release 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 s1, s2 e s3 em uma proporção aproximada de 6:2:2. A faixa s1 atua como a faixa base. Quando um serviço na cadeia de chamadas não existe na faixa de destino, a requisição retorna ao serviço correspondente na faixa base (s1).