Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Deploys sem medo: Argo Rollouts, sua rede de proteção no Kubernetes

By Chimbu ChinnaduraiFeb 6, 20247 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

O Kubernetes revolucionou o desenvolvimento de software ao oferecer uma forma simples de fazer deploy e escalar aplicações em containers. Mas sua estratégia básica de rolling update costuma deixar até desenvolvedores experientes apreensivos. Afinal, é como apertar um interruptor: você sobe o código novo e o resultado é binário — deu certo ou deu errado. Não existe rollout gradual nem rede de proteção caso algo saia do esperado.

Os rolling updates são considerados arriscados demais para ambientes de produção de larga escala e alto volume. Isso porque não dão controle sobre o raio de impacto, podem ser aplicados de forma agressiva demais e não oferecem rollback automático em caso de falhas.

Mas temos boas notícias! Conheça o Argo Rollouts, do Argo Projects. Esse poderoso controlador do Kubernetes leva seus deploys para outro patamar. Com o Argo Rollouts, você pode:

  • Controlar a velocidade e o alcance das atualizações: chega de releases big bang. Aplique mudanças aos poucos, para um grupo controlado de usuários, reduzindo riscos e ganhando tranquilidade.
  • Direcionar o tráfego exatamente para onde você precisa: mande os usuários para a versão nova, para a antiga ou para uma combinação das duas. Assim dá para testar funcionalidades, coletar feedback e garantir uma transição suave.
  • Usar verificações sofisticadas para validar atualizações: além das checagens simples de "está rodando?", o Argo Rollouts faz validações avançadas — incluindo métricas externas, testes de stress e checagens customizadas — para garantir que sua atualização está pronta para entrar em produção.
  • Automatizar rollbacks quando algo dá errado: chega de reverter mudanças no braço. O Argo Rollouts automatiza rollbacks em caso de erros, reduzindo o downtime e mantendo os usuários satisfeitos.

Neste artigo, vou mostrar como usar o Argo Rollouts para fazer deploys Blue-Green e Canary de forma mais segura, fluida e confiante.

O que é o Argo Rollouts?

O Argo Rollouts é um poderoso controlador do Kubernetes com um conjunto de CRDs que amplia os recursos de deploy, incluindo blue-green, análise canary, experimentação e entrega progressiva no Kubernetes.

O Argo Rollouts pode ser integrado a ingress controllers e service meshes para deslocar o tráfego gradualmente para as novas versões durante uma atualização. Além disso, o Rollouts coleta e analisa métricas de diversos provedores para verificar KPIs essenciais e promover ou reverter automaticamente durante a atualização.

Assim como o objeto deployment, o controlador do Argo Rollouts gerencia a criação, o escalonamento e a exclusão de ReplicaSets. Esses ReplicaSets são definidos pelo campo spec.template dentro do recurso Rollout, que usa o mesmo template de pod do objeto deployment. O Argo Rollouts não oferece suporte a StatefulSet ou DaemonSet.

Quando o spec.template é alterado, isso sinaliza ao controlador do Argo Rollouts que um novo ReplicaSet será introduzido. O controlador usa a estratégia definida no campo spec.strategy para determinar como o rollout vai progredir do ReplicaSet antigo para o novo. Quando esse novo ReplicaSet sobe (e, opcionalmente, passa por uma Análise), o controlador o marca como "stable".

Você também pode usar spec.WorkoadRef para gerenciar deployments existentes no Argo Rollouts sem apagar a configuração atual.

Demo do Argo Rollouts

Pré-requisitos

Instalando o Argo Rollouts

  • Rode os comandos abaixo para instalar o Argo Rollouts no cluster. Consulte a documentação oficial para mais opções.
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

Estratégia de deploy Blue-Green

Um deploy blue-green consiste em manter dois ambientes idênticos rodando ao mesmo tempo. Um deles, o ambiente blue, representa a produção atual; o outro, o ambiente green, traz a nova versão da aplicação que você quer publicar. Durante essa fase, apenas a versão antiga recebe tráfego de produção. Essa abordagem permite testar a nova versão antes de redirecionar o tráfego real para o novo ambiente.

representação visual do deploy blue-green

Vamos ver como usar o Argo Rollouts para a estratégia Blue-Green com um deploy simples.

  • Faça o deploy de uma aplicação nginx de exemplo no cluster com o comando abaixo, que vai funcionar como ambiente blue.
kubectl create deployment nginx --image nginx:1.19.10 --replicas 2

Pods da aplicação de exemplo

  • Crie dois services do Kubernetes para o deployment. Um para o ambiente atual (blue) e outro para o novo ambiente (green).
kubectl expose deployment nginx --name nginx-active --port 80 --target-port 80
kubectl expose deployment nginx --name nginx-preview --port 80 --target-port 80

Service e endpoints de exemplo

  • Crie um recurso Argo Rollout com as configurações necessárias para a estratégia Blue-Green. Veja todas as opções na documentação oficial.
cat <<EOF | kubectl apply -f -
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  strategy:
    blueGreen: #Indicates that the rollout should use the Blue-Green strategy
      activeService: nginx-active # Reference to service that the rollout modifies as the active service.
      previewService: nginx-preview # Name of the service that the rollout modifies as the preview service.
      previewReplicaCount: 1 #The number of replicas to run under the preview service before the switchover.
      # Indicates if the rollout should automatically promote the new ReplicaSet
      # to the active service or enter a paused state. If not specified, the
      # default value is true. +optional
      autoPromotionEnabled: false
  # WorkloadRef holds a references to a workload that provides Pod template
  workloadRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
EOF
  • Confira o novo replicaset e a configuração do Argo Rollout, conforme mostrado abaixo.

Status de pods, replicasets e Argo Rollout

  • Os pods gerenciados pelo replicaset inicial não são removidos automaticamente. O recomendado é zerar manualmente as réplicas do deployment, já que o Argo Rollout assume o gerenciamento. Rode o comando abaixo para escalar para zero os pods que ficaram fora do controle.
kubectl scale deployment nginx --replicas 0

  • Vamos trocar a versão da imagem para latest, o que vai disparar uma nova revisão.
kubectl set image deployment/nginx nginx=nginx:latest

Status do deploy Blue-Green antes da promoção

  • O ambiente Green já está pronto, e você pode usar o service nginx-preview para testar as mudanças sem afetar o tráfego real, atendido pelo service nginx-active.
  • Você também pode usar o dashboard do Argo Rollout para acompanhar o status do rollout. Rode o comando abaixo para acessar o dashboard.
kubectl argo rollouts dashboard -n default

Status do rollout no dashboard do Argo Rollout

  • Promova a nova versão para produção com o comando abaixo.
kubectl argo  rollouts promote nginx

Status do deploy Blue-Green após a promoção

Estratégia de deploy Canary

Um deploy canary é uma implantação faseada que distribui o tráfego entre uma versão já no ar e uma nova versão, liberando-a aos poucos para um grupo de usuários antes de publicá-la por completo.

Ingress controllers e service meshes, como NGINX e Istio, permitem um traffic shaping mais avançado para canary, com divisão de tráfego refinada ou com base em headers HTTP, por exemplo.

representação visual do deploy canary

Vamos ver como usar o Argo Rollouts para o deploy Canary.

  • Faça o deploy de uma aplicação de exemplo no cluster.
kubectl create deployment nginx-canary --image nginx:1.19.10 --replicas 5
  • Crie um service do Kubernetes para o deployment. Diferente do deploy Blue-Green, o canary não exige dois services do Kubernetes para o mesmo deployment, já que os novos endpoints de pod vão sendo adicionados ao service conforme a porcentagem do Canary.
kubectl expose deployment nginx-canary --port 80 --target-port 80

Pods e service da aplicação de exemplo

cat <<EOF | kubectl apply -f -
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: nginx-canary
spec:
  replicas: 5
  selector:
    matchLabels:
      app: nginx-canary
  workloadRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-canary
  strategy:
    canary: #Indicates that the rollout should use the Canary strategy
      maxSurge: "25%"
      maxUnavailable: 0
      steps:
      - setWeight: 10
      - pause:
          duration: 1h #Pause for 1 hour and wait promote to next canary stage
      - setWeight: 30
      - pause: {} # pause indefinitely and requires manual promote action
      - setWeight: 100
      - pause: {} # pause indefinitely and requires manual promote action
EOF

Status de pods, replicaset e Argo Rollout

  • Como no deploy blue-green, é preciso zerar as réplicas do deployment atual para que o Argo Rollout consiga gerenciar todos os novos pods que fazem parte do novo replicaset.
kubectl scale deployment nginx-canary --replicas 0
  • Vamos publicar uma nova versão da aplicação e acompanhar o deploy canary.
kubectl set image deployment/nginx-canary nginx=nginx:latest

Status inicial (10%) do deploy Canary

Status do rollout Canary no dashboard do Argo

  • Promova manualmente o rollout para os próximos estágios canary.
kubectl argo rollouts promote nginx-canary

Status do rollout Canary em 30%

Status do rollout Canary no dashboard do Argo

Status do rollout Canary em 100%

Status do rollout Canary no dashboard do Argo

O Argo Rollout oferece um recurso de análise que permite definir e executar diversas verificações e testes na sua aplicação durante ou depois dos deploys, ajudando a validar a estabilidade e o desempenho da nova versão antes de promovê-la para 100% do tráfego de produção.

Resumindo, o Argo Rollouts é uma ferramenta valiosa para qualquer especialista em Kubernetes que queira aprimorar seus métodos de deploy e garantir atualizações de aplicação suaves e confiáveis. Seu conjunto completo de funcionalidades faz dele a escolha preferida de empresas que buscam entrega progressiva, melhor experiência do usuário e menos downtime na hora de publicar atualizações de software.