Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Entregue software com segurança usando Gateway API e Argo Rollouts

By Chimbu ChinnaduraiOct 2, 20246 min read

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

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

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.