No ritmo acelerado da entrega de software, inovação e confiabilidade precisam andar juntas. A progressive delivery permite que os times lancem funcionalidades de forma segura, gradual e controlada. Em um ambiente dinâmico como o Kubernetes, ela tem papel fundamental para manter a estabilidade do serviço sem frear a inovação contínua.
Se você já conhece ferramentas como o Argo Rollouts, sabe o quanto elas são eficazes para gerenciar essas implantações em etapas. O Argo Rollouts pode usar opcionalmente um traffic provider para dividir o tráfego entre os pods de forma gradual e com controle total.
Até pouco tempo, integrar um novo traffic provider ao Argo Rollouts exigia código sob medida. Mas dois avanços recentes deixaram esse processo para trás.
- O primeiro é o suporte a traffic plugins no Argo Rollouts a partir da versão 1.5.
- O segundo é a nova Gateway API do Kubernetes, que oferece controle granular sobre o roteamento de tráfego e abre novas possibilidades para service mesh, ingress e muito mais.
Com a adoção da Gateway API no Argo Rollouts, a integração ficou bem mais simples: qualquer traffic provider que implemente a Gateway API passa a ser suportado automaticamente. O site da Gateway API traz a lista das implementações conhecidas.
Neste post, vamos ver como usar a Gateway API junto com os recursos do Argo Rollouts no Google Kubernetes Engine para fazer progressive delivery.
Pré-requisitos
- Um cluster GKE com a Gateway API habilitada.
- Argo Rollouts instalado no cluster.
- Instale o plugin do kubectl para gerenciar e visualizar os rollouts pela linha de comando.
Limitações
- O plugin Gateway API do Argo Rollouts não suporta a estratégia de implantação blue/green.
- O recurso só está disponível para Application Load Balancers baseados em Envoy no GCP. Classic Application Load Balancers ou Network Load Balancers não suportam essa funcionalidade diretamente.
Faça o deploy do plugin Gateway API do Argo Rollouts
- Aplique o manifest abaixo no cluster para criar um configmap. Consulte a página de Releases para ver as versões disponíveis e ajuste a arquitetura, se for o caso.
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: ConfigMap
metadata:
name: argo-rollouts-config # must be so name
namespace: argo-rollouts # must be in this namespace
data:
trafficRouterPlugins: |-
- name: "argoproj-labs/gatewayAPI"
location: "https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/releases/download/v0.3.0/gateway-api-plugin-linux-amd64"
EOF
- Reinicie o pod do Argo Rollouts; o plugin será baixado durante a inicialização.

Exemplo de log do pod mostrando a instalação do plugin
Faça o deploy do recurso Gateway
- Um recurso Gateway representa um data plane que roteia tráfego no Kubernetes. Dependendo da GatewayClass utilizada, um gateway pode representar diferentes tipos de balanceamento de carga e roteamento.
- Aplique o manifest abaixo para criar um Application Load Balancer externo global.
cat <<EOF | kubectl apply -f -
---
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
name: argo-rollouts-demo-external-http
spec:
gatewayClassName: gke-l7-global-external-managed
listeners:
- name: http
protocol: HTTP
port: 80
EOF

Exemplo de recurso da Gateway API
Permita que o Argo Rollouts edite os HTTP Routes
- Aplique o manifest abaixo para liberar o Argo Rollouts a editar recursos HTTP Routes.
cat <<EOF | kubectl apply -f -
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: gateway-controller-role
namespace: argo-rollouts
rules:
- apiGroups:
- gateway.networking.k8s.io
resources:
- httproutes
verbs:
- get
- patch
- update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: gateway-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: gateway-controller-role
subjects:
- namespace: argo-rollouts
kind: ServiceAccount
name: argo-rollouts
EOF
Crie o HTTPRoute e os services do Kubernetes
- Crie um HTTPRoute de exemplo e conecte-o ao recurso Gateway que você acabou de criar.
cat <<EOF | kubectl apply -f -
---
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
name: argo-rollouts-demo-http-route
spec:
parentRefs:
- kind: Gateway
name: argo-rollouts-demo-external-http
hostnames:
- "argo-rollouts-demo.example.com"
rules:
- backendRefs:
- name: argo-rollouts-demo-stable-service
port: 80
- name: argo-rollouts-demo-canary-service
port: 80
EOF
- Crie o canary service.
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Service
metadata:
name: argo-rollouts-demo-canary-service
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: argo-rollouts-demo
EOF
- Crie o stable service.
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Service
metadata:
name: argo-rollouts-demo-stable-service
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: argo-rollouts-demo
EOF

Load balancer externo com a configuração das rotas
Crie um Canary Rollout
- Um rollout é um custom resource do Kubernetes equivalente a um objeto Deployment. Ele foi pensado para substituir um Deployment em cenários que pedem funcionalidades mais avançadas de implantação ou de progressive delivery.
- Você pode criar um novo rollout ou vincular Deployments existentes a um recurso de rollout. O plugin Gateway API do Argo Rollouts só suporta canary deployment. Consulte a Rollout Specification para ver as opções disponíveis.
- Aplique o manifest abaixo no cluster, espere a aplicação ficar pronta e acesse o IP do Gateway pelo navegador.
cat <<EOF | kubectl apply -f -
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: argo-rollouts-demo
namespace: default
spec:
replicas: 5
strategy:
canary:
canaryService: argo-rollouts-demo-canary-service # canary service
stableService: argo-rollouts-demo-stable-service # stable service
trafficRouting:
plugins:
argoproj-labs/gatewayAPI:
httpRoute: argo-rollouts-demo-http-route # httproute
namespace: default
steps:
- setWeight: 50
- pause: {}
- setWeight: 100
- pause: {}
revisionHistoryLimit: 2
selector:
matchLabels:
app: argo-rollouts-demo
template:
metadata:
labels:
app: argo-rollouts-demo
spec:
containers:
- name: argo-rollouts-demo
image: argoproj/rollouts-demo:blue
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
EOF
- Descreva o recurso httproute e confira os logs do pod do Argo Rollouts para confirmar que a implantação foi bem-sucedida. O Argo Rollouts vai alterar o valor de weight no httproute, que será sincronizado com o load balancer.

Configuração inicial de roteamento do load balancer

Resposta da aplicação de exemplo. A extensão ModHeader do Chrome foi usada para definir um Host header customizado
Execute um Canary Deployment
- Rode o comando a seguir para alterar a imagem e disparar um novo processo de rollout.
kubectl argo rollouts set image argo-rollouts-demo argo-rollouts-demo=argoproj/rollouts-demo:yellow
- O Argo Rollouts vai criar a quantidade de pods necessária para atender ao percentual de tráfego. Neste caso, ele cria 3 novos pods para atender aos 50% de tráfego direcionados à nova versão.
- Rode o comando abaixo para acompanhar o progresso do rollout. O plugin Kubectl do Argo Rollouts pode subir um UI Dashboard local para você visualizar seus Rollouts.
kubectl argo rollouts get rollout rollouts-demo

Exemplo de status inicial do rollout
- Inspecione o HttpRoute e confirme que o Argo Rollouts alterou os pesos dos backend services.

Exemplo de HTTPRoute

Regras de roteamento do load balancer
- Neste momento, cada versão deve receber 50% das requisições. Dá para conferir direto no navegador.

Canary rollout inicial
- Promova o rollout com o comando a seguir para aumentar o percentual de tráfego direcionado à nova versão. Confira o HttpRoute e a configuração das regras de roteamento do load balancer.
kubectl argo rollouts promote rollouts-demo
- Rode o comando promote de novo para finalizar o rollout e aguarde até que os pods da versão antiga sejam destruídos. Se você alterar a imagem do Rollout outra vez, o processo recomeça.

Status do rollout após a conclusão

Regras de roteamento do load balancer atualizadas

Canary rollout concluído
Para fechar, a integração da Gateway API com o Argo Rollouts amplia bastante as possibilidades de progressive delivery no Kubernetes. Essa combinação simplifica o roteamento de tráfego e facilita executar canary deployments e gerenciar o tráfego entre versões com precisão e controle.
Espero que este post tenha trazido insights valiosos. Se você quer saber mais ou tem interesse nos nossos serviços, fale com a gente. É só entrar em contato aqui.