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:
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.
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.
Ao atualizar a imagem do Rollout, o controlador do Argo Rollouts ajusta automaticamente os pesos do VirtualService conforme as etapas definidas.
Em cada etapa, o controlador pausa pela duração especificada (ou aguarda aprovação manual) antes de aumentar o peso do canary.
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-stableeistio-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:
Uma instância do ASM na versão 1.12.4.50 ou posterior. Para obter mais informações, consulte Criar uma instância do ASM
Um cluster adicionado à instância do ASM. Para obter mais informações, consulte Adicionar um cluster a uma instância do ASM
O kubectl conectado à instância do ASM. Para obter mais informações, consulte Usar o kubectl no plano de controle para acessar recursos do Istio
Instalar o Argo Rollouts
Para obter detalhes completos sobre a instalação, consulte Instalação do Argo Rollouts.
-
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 -
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.
Faça logon no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Instance > Base Information.
-
Clique em Enable à direita de Enable Data-plane KubeAPI access.

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
-
Crie um arquivo
rollout.yamlcom o seguinte conteúdo:Campos principais em
strategy.canary:Campo
Descrição
setWeightPorcentagem de tráfego roteada para a versão canary nesta etapa
pause: {}Pausa indefinida até a execução de
kubectl argo rollouts promotepause: {duration: 20s}Pausa de 20 segundos e avanço automático para a próxima etapa
-
Implante o Rollout no cluster adicionado à sua instância do ASM:
kubectl apply -f rollout.yaml
Criar os Services
-
Crie um arquivo
service.yamlcom 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 -
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
-
Crie um arquivo
istio-rollout-vsvc.yamlcom 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 -
Implante o VirtualService:
kubectl apply -f istio-rollout-vsvc.yaml
Criar o Gateway
-
Crie um arquivo
istio-rollout-gateway.yamlcom 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 -
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.
Faça logon no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.
-
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
ingressgatewayGateway types
North-South IngressGateway
Port Mapping
Protocolo: HTTP, Porta do serviço: 80
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
-
Obtenha o endereço IP do gateway de entrada:
Faça logon no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Clique em nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.
Copie o Service address do gateway de entrada.
-
Abra
http://<ingress-gateway-ip>/em um navegador. A página faz chamadas simultâneas para/colore preenche a grade com a cor retornada. Como a versão estável usa a imagembluee nenhum canary está em execução, todas as grades exibem azul.
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
-
Defina a nova versão da imagem:
kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow" -
Verifique se ambas as versões dos pods estão em execução:
Faça logon no console do ACK e clique em Clusters no painel de navegação à esquerda.
Clique em nome do cluster e escolha Workloads > Pods.
Na coluna Name, confirme que existem pods tanto para a versão azul (estável) quanto para a amarela (canary).

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.

A primeira etapa especifica pause: {} sem duração, portanto, o Rollout aguarda aprovação manual antes de prosseguir.
Continuar a liberação
-
Aprove o Rollout para avançar além da pausa manual:
kubectl argo rollouts promote istio-rollout -
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.
Verificar a liberação concluída
-
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.
-
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 --watchName: 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.
-
Crie um arquivo
istio-success-rate.yamlcom 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]) ) -
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.
-
Crie um novo arquivo
rollout.yamlcom o seguinte conteúdo: -
Atualize o Rollout:
kubectl apply -f rollout.yaml
Etapa 4: Acionar um canary release com análise
-
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"
-
Aprove o Rollout para iniciar a progressão automática do canary com monitoramento do Prometheus:
kubectl argo rollouts promote istio-rollout -
Monitore o status do Rollout:
kubectl argo rollouts get rollout istio-rollout --watch
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).

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

Próximos passos
Configurar um canary release — Conheça os conceitos de canary release e opções adicionais de configuração.
Gerenciamento de tráfego do Istio no Argo Rollouts — Explore opções avançadas, incluindo divisão de tráfego no nível de subconjunto e configurações multicluster.