Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Integrar o ASM ao Argo Rollouts para implementar canary releases

Última atualização: Jun 28, 2026

O Argo Rollouts é um controlador do Kubernetes e um conjunto de CustomResourceDefinitions (CRDs) para entrega progressiva. A integração do Service Mesh (ASM) com o Argo Rollouts permite canary releases que transferem gradualmente o tráfego de uma versão estável para uma nova versão, com base em porcentagens de peso configuráveis.

Nas atualizações contínuas nativas do Kubernetes, a proporção de tráfego está vinculada à quantidade de réplicas — rotear 1% do tráfego para um canary exige 99 réplicas estáveis. Os canary releases baseados em ASM desacoplam a divisão de tráfego da contagem de pods por meio de regras do Istio VirtualService. Assim, o dimensionamento automático não interrompe a proporção de tráfego, e porcentagens refinadas funcionam independentemente do número de réplicas em execução.

Como funciona

Um canary release com ASM e Argo Rollouts segue este ciclo de vida:

  1. Implante um recurso Rollout que defina a estratégia canary: etapas de peso de tráfego, durações de pausa e referências ao Istio VirtualService.

  2. Crie dois Services do Kubernetes — um para a versão estável e outro para o canary — e um Istio VirtualService para rotear o tráfego entre eles.

  3. Ao atualizar a imagem do Rollout, o controlador do Argo Rollouts ajusta automaticamente os pesos do VirtualService conforme as etapas definidas.

  4. Em cada etapa, o controlador pausa pela duração especificada (ou aguarda aprovação manual) antes de aumentar o peso do canary.

  5. Após a conclusão de todas as etapas, a versão canary se torna a nova versão estável.

Opcionalmente, anexe um AnalysisTemplate baseado no Prometheus para monitorar a taxa de sucesso da versão canary. Se a taxa cair abaixo de um limiar, o controlador reverte automaticamente para a versão estável.

Este guia demonstra a divisão de tráfego no nível de host, em que dois Services separados ( istio-rollout-stable e istio-rollout-canary ) gerenciam a distribuição de tráfego. O Istio também oferece suporte à divisão de tráfego no nível de subconjunto usando um DestinationRule, mais adequado para tráfego leste-oeste (intracluster), pois evita complicações de DNS. Para obter detalhes, consulte Gerenciamento de tráfego do Istio no Argo Rollouts .

Pré-requisitos

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

Instalar o Argo Rollouts

Para obter detalhes completos sobre a instalação, consulte Instalação do Argo Rollouts.

  1. Instale o controlador do Argo Rollouts:

    kubectl create namespace argo-rollouts
    kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
  2. Instale o plugin kubectl do Argo Rollouts para gerenciamento via CLI:

    brew install argoproj/tap/kubectl-argo-rollouts

Ativar o acesso à KubeAPI do plano de dados

Ative o acesso à KubeAPI para gerenciar recursos do Istio (VirtualServices, Gateways, DestinationRules) diretamente do cluster do plano de dados usando o kubectl.

  1. Faça logon 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 > Base Information.

  3. Clique em Enable à direita de Enable Data-plane KubeAPI access.

    Enable Data-plane KubeAPI access

  4. Na caixa de diálogo de confirmação, clique em OK.

Implementar um canary release

Esta seção apresenta um canary release completo: implantar uma versão estável (azul) e, em seguida, transferir progressivamente o tráfego para uma versão canary (amarela).

Etapa 1: Criar o Rollout e os Services

Criar o Rollout

  1. Crie um arquivo rollout.yaml com o seguinte conteúdo:

    Show rollout.yaml

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: istio-rollout
    spec:
      revisionHistoryLimit: 2               # Number of old ReplicaSets to retain
      selector:
        matchLabels:
          app: istio-rollout
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true"  # Enable Istio sidecar injection
          labels:
            app: istio-rollout
        spec:
          containers:
          - name: istio-rollout
            image: argoproj/rollouts-demo:blue  # Initial stable version
            ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: 32Mi
                cpu: 5m
      strategy:
        canary:
          canaryService: istio-rollout-canary   # Service that targets canary pods
          stableService: istio-rollout-stable   # Service that targets stable pods
          trafficRouting:
            istio:
              virtualService:
                name: istio-rollout-vsvc        # VirtualService whose weights the controller updates
                routes:
                - primary                       # Route name inside the VirtualService
          steps:
          - setWeight: 10          # Route 10% of traffic to canary
          - pause: {}              # Wait for manual approval (kubectl argo rollouts promote)
          - setWeight: 20          # Route 20% of traffic to canary
          - pause: {duration: 20s} # Wait 20 seconds, then auto-advance
          - setWeight: 30
          - pause: {duration: 20s}
          - setWeight: 40
          - pause: {duration: 20s}
          - setWeight: 50
          - pause: {duration: 20s}
          - setWeight: 60
          - pause: {duration: 20s}
          - setWeight: 70
          - pause: {duration: 20s}
          - setWeight: 80
          - pause: {duration: 20s}
          - setWeight: 90
          - pause: {duration: 20s}

    Campos principais em strategy.canary:

    Campo

    Descrição

    setWeight

    Porcentagem de tráfego roteada para a versão canary nesta etapa

    pause: {}

    Pausa indefinida até a execução de kubectl argo rollouts promote

    pause: {duration: 20s}

    Pausa de 20 segundos e avanço automático para a próxima etapa

  2. Implante o Rollout no cluster adicionado à sua instância do ASM:

    kubectl apply -f rollout.yaml

Criar os Services

  1. Crie um arquivo service.yaml com o seguinte conteúdo:

    Ambos os Services usam o mesmo seletor ( app: istio-rollout ). O Argo Rollouts gerencia quais pods cada Service direciona durante o canary release.
    apiVersion: v1
    kind: Service
    metadata:
      name: istio-rollout-canary    # Canary Service -- Argo Rollouts maps this to canary pods
    spec:
      ports:
      - port: 80
        targetPort: http
        protocol: TCP
        name: http
      selector:
        app: istio-rollout
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: istio-rollout-stable    # Stable Service -- Argo Rollouts maps this to stable pods
    spec:
      ports:
      - port: 80
        targetPort: http
        protocol: TCP
        name: http
      selector:
        app: istio-rollout
  2. Implante os Services:

    kubectl apply -f service.yaml

Etapa 2: Criar os recursos do Istio

Com o acesso à KubeAPI do plano de dados ativado, use o kubectl do cluster do plano de dados para criar recursos do Istio diretamente. Como alternativa, utilize o console do ASM ou o kubeconfig do plano de controle.

Criar o VirtualService

  1. Crie um arquivo istio-rollout-vsvc.yaml com o seguinte conteúdo:

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: istio-rollout-vsvc
    spec:
      gateways:
        - istio-rollout-gateway
      hosts:
        - '*'
      http:
        - match:
            - uri:
                prefix: /
          name: primary                   # Must match the route name in the Rollout
          route:
            - destination:
                host: istio-rollout-stable # All traffic goes to stable initially
              weight: 100
            - destination:
                host: istio-rollout-canary # Canary destination -- weight starts at 0
  2. Implante o VirtualService:

    kubectl apply -f istio-rollout-vsvc.yaml

Criar o Gateway

  1. Crie um arquivo istio-rollout-gateway.yaml com o seguinte conteúdo:

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: istio-rollout-gateway
    spec:
      selector:
        istio: ingressgateway            # Binds to the ASM ingress gateway
      servers:
        - hosts:
            - '*'
          port:
            name: http
            number: 80                   # Accept HTTP traffic on port 80
            protocol: HTTP
  2. Implante o Gateway:

    kubectl apply -f istio-rollout-gateway.yaml

Etapa 3: Implantar um gateway de entrada

Crie um gateway de entrada do ASM com a porta 80 habilitada para acesso ao serviço.

  1. Faça logon 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 Gateways > Ingress Gateway.

  3. Na página Ingress Gateway, clique em Create e configure os seguintes parâmetros: Para outros parâmetros, consulte Criar um gateway de entrada.

    Parâmetro

    Valor

    Name

    ingressgateway

    Gateway types

    North-South IngressGateway

    Port Mapping

    Protocolo: HTTP, Porta do serviço: 80

  4. Clique em Create.

Etapa 4: Verificar o status inicial do Rollout

Execute o comando a seguir para verificar se o Rollout está íntegro:

kubectl argo rollouts get rollout istio-rollout

Saída esperada:

Name:            istio-rollout
Namespace:       default
Status:           Healthy
Strategy:        Canary
  Step:          18/18
  SetWeight:     100
  ActualWeight:  100
Images:          argoproj/rollouts-demo:blue (stable)
Replicas:
  Desired:       1
  Current:       1
  Updated:       1
  Ready:         1
  Available:     1

NAME                                       KIND        STATUS     AGE  INFO
⟳ istio-rollout                            Rollout      Healthy  52s
└──# revision:1
└──⧉ istio-rollout-7f96d86486           ReplicaSet   Healthy  52s  stable
   └──□ istio-rollout-7f96d86486-vpqvb  Pod         Running  52s  ready:2/2

Um status Healthy com a imagem argoproj/rollouts-demo:blue (stable) confirma que a implantação inicial foi bem-sucedida.

Etapa 5: Testar a implantação inicial

  1. Obtenha o endereço IP do gateway de entrada:

    1. Faça logon no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Clique em nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.

    3. Copie o Service address do gateway de entrada.

  2. Abra http://<ingress-gateway-ip>/ em um navegador. A página faz chamadas simultâneas para /color e preenche a grade com a cor retornada. Como a versão estável usa a imagem blue e nenhum canary está em execução, todas as grades exibem azul.

    Initial blue grid display

Etapa 6: Executar o canary release

Neste exemplo, o amarelo representa a versão canary. À medida que a liberação avança, a grade transita gradualmente de azul para amarelo.

Atualizar a imagem do Rollout

  1. Defina a nova versão da imagem:

    kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow"
  2. Verifique se ambas as versões dos pods estão em execução:

    1. Faça logon no console do ACK e clique em Clusters no painel de navegação à esquerda.

    2. Clique em nome do cluster e escolha Workloads > Pods.

    3. Na coluna Name, confirme que existem pods tanto para a versão azul (estável) quanto para a amarela (canary).

    Both pod versions running

Observar a primeira mudança de tráfego

Abra http://<ingress-gateway-ip>/ em um navegador. Cerca de 10% das grades agora exibem amarelo. O controlador do Argo Rollouts atualizou os pesos do VirtualService: o estável (azul) caiu de 100 para 90, e o canary (amarelo) aumentou de 0 para 10.

10% canary traffic

A primeira etapa especifica pause: {} sem duração, portanto, o Rollout aguarda aprovação manual antes de prosseguir.

Continuar a liberação

  1. Aprove o Rollout para avançar além da pausa manual:

    kubectl argo rollouts promote istio-rollout
  2. Abra http://<ingress-gateway-ip>/ em um navegador. Os pesos do VirtualService continuam a se ajustar automaticamente nas etapas restantes (20%, 30%, ... 90%), com pausas de 20 segundos entre cada etapa.

    Progressive traffic shift

Verificar a liberação concluída

  1. Após a conclusão de todas as etapas, abra http://<ingress-gateway-ip>/ em um navegador. Todas as grades agora exibem amarelo, confirmando que a versão canary substituiu totalmente a versão estável.

    All yellow -- canary release complete

  2. Verifique o status do Rollout: Saída esperada: A imagem agora mostra argoproj/rollouts-demo:yellow (stable), confirmando que a versão canary foi promovida.

    kubectl argo rollouts get rollout istio-rollout --watch
    Name:            istio-rollout
    Namespace:       default
    Status:           Healthy
    Strategy:        Canary
      Step:          18/18
      SetWeight:     100
      ActualWeight:  100
    Images:          argoproj/rollouts-demo:yellow (stable)
    Replicas:
      Desired:       1
      Current:       1
      Updated:       1
      Ready:         1
      Available:     1
    
    NAME                                       KIND        STATUS        AGE  INFO
    ⟳ istio-rollout                            Rollout      Healthy     48m
    ├──# revision:4
    │  └──⧉ istio-rollout-5fcf5864c4           ReplicaSet   Healthy     27m  stable
    │     └──□ istio-rollout-5fcf5864c4-vw6kh  Pod          Running     26m  ready:2/2
    ├──# revision:3
    │  └──⧉ istio-rollout-897cb5b6d            ReplicaSet  ScaledDown  27m
    └──# revision:1
       └──⧉ istio-rollout-7f96d86486           ReplicaSet  ScaledDown  48m

Configurar reversão automática com o Prometheus

Em vez de depender de observação manual, configure uma análise baseada no Prometheus para reverter automaticamente um canary release quando a taxa de sucesso cair abaixo de um limiar.

Para reverter manualmente a qualquer momento durante um canary release, execute:
kubectl argo rollouts abort istio-rollout

Etapa 1: Ativar o Prometheus no ASM

Ative o monitoramento do Prometheus para a instância do ASM. Para obter mais informações, consulte:

Etapa 2: Criar um AnalysisTemplate

O AnalysisTemplate define uma consulta do Prometheus que calcula a taxa de sucesso de solicitações para a versão canary. Se a taxa de sucesso cair para 0,90 ou menos (significando que mais de 10% das solicitações retornam erros 5xx), o Rollout será marcado como Degraded e revertido automaticamente.

  1. Crie um arquivo istio-success-rate.yaml com o seguinte conteúdo: Substitua <your-prometheus-endpoint> pelo endpoint real da sua instância do Prometheus conectada ao ASM.

    apiVersion: argoproj.io/v1alpha1
    kind: AnalysisTemplate
    metadata:
      name: istio-success-rate
    spec:
      args:
      - name: service                       # Service name, passed from the Rollout
      - name: namespace                     # Namespace, auto-resolved from the Rollout
      metrics:
      - name: success-rate
        initialDelay: 60s                   # Wait 60s for traffic to flow before first check
        interval: 20s                       # Re-evaluate every 20 seconds
        successCondition: result[0] > 0.90  # Pass if success rate > 90%; fail otherwise
        provider:
          prometheus:
            address: http://<your-prometheus-endpoint>:9090/api/v1/prometheus/
            query: >+
              sum(irate(istio_requests_total{
                reporter="source",
                destination_service=~"{{args.service}}.{{args.namespace}}.svc.cluster.local",
                response_code!~"5.*"}[40s])
              )
              /
              sum(irate(istio_requests_total{
                reporter="source",
                destination_service=~"{{args.service}}.{{args.namespace}}.svc.cluster.local"}[40s])
              )
  2. Implante o AnalysisTemplate:

    kubectl apply -f istio-success-rate.yaml

Etapa 3: Associar o AnalysisTemplate ao Rollout

Atualize o Rollout para incluir uma seção analysis que faça referência ao AnalysisTemplate. A análise começa na segunda etapa (startingStep: 1), dando tempo para a versão canary receber tráfego antes da avaliação das métricas.

  1. Crie um novo arquivo rollout.yaml com o seguinte conteúdo:

    Show rollout.yaml

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: istio-rollout
    spec:
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          app: istio-rollout
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true"
          labels:
            app: istio-rollout
        spec:
          containers:
          - name: istio-rollout
            image: argoproj/rollouts-demo:yellow   # Current stable version
            ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: 32Mi
                cpu: 5m
      strategy:
        canary:
          canaryService: istio-rollout-canary
          stableService: istio-rollout-stable
          analysis:
            startingStep: 1                        # Start analysis from the second step
            templates:
            - templateName: istio-success-rate     # Reference the AnalysisTemplate
            args:
            - name: service
              value: canary
            - name: namespace
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace    # Auto-resolve namespace
          trafficRouting:
            istio:
              virtualService:
                name: istio-rollout-vsvc
                routes:
                - primary
          steps:
          - setWeight: 10
          - pause: {}              # Wait for manual approval
          - setWeight: 20
          - pause: {duration: 20s}
          - setWeight: 30
          - pause: {duration: 20s}
          - setWeight: 40
          - pause: {duration: 20s}
          - setWeight: 50
          - pause: {duration: 20s}
          - setWeight: 60
          - pause: {duration: 20s}
          - setWeight: 70
          - pause: {duration: 20s}
          - setWeight: 80
          - pause: {duration: 20s}
          - setWeight: 90
          - pause: {duration: 20s}
  2. Atualize o Rollout:

    kubectl apply -f rollout.yaml

Etapa 4: Acionar um canary release com análise

  1. Atualize a imagem para iniciar um novo canary release: Abra http://<ingress-gateway-ip>/ em um navegador. Grades laranjas começam a aparecer conforme o tráfego canary flui.

    kubectl argo rollouts set image istio-rollout "*=argoproj/rollouts-demo:orange"

    Orange canary traffic

  2. Aprove o Rollout para iniciar a progressão automática do canary com monitoramento do Prometheus:

    kubectl argo rollouts promote istio-rollout
  3. Monitore o status do Rollout:

    kubectl argo rollouts get rollout istio-rollout --watch

    Rollout status with analysis

Etapa 5: Testar a reversão automática

Para testar o comportamento de reversão, aumente a taxa de erro da versão canary usando o controle deslizante de taxa de erro na página do aplicativo de demonstração. Quando a taxa de erro exceder 10% (taxa de sucesso cair abaixo de 0,90), o AnalysisTemplate marcará o Rollout como Degraded, e o controlador reverterá automaticamente para a versão estável (amarela).

Canary release in progress with errors

Após um breve atraso, todo o tráfego retorna à versão estável:

Automatic rollback to stable version

Próximos passos