Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Deployment senza paura: Argo Rollouts, la rete di sicurezza per Kubernetes

By Chimbu ChinnaduraiFeb 6, 20247 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

Kubernetes ha rivoluzionato lo sviluppo software offrendo un modo lineare per distribuire e scalare applicazioni containerizzate. La sua strategia base di rolling update, però, mette a disagio anche gli sviluppatori più esperti: funziona come un interruttore on/off, si pubblica il nuovo codice e il risultato può essere solo un successo o un fallimento, senza alcun rilascio graduale né rete di sicurezza in caso di problemi.

I rolling update sono spesso considerati troppo rischiosi per ambienti di produzione su larga scala e ad alto volume: non offrono alcun controllo sul raggio d'azione, possono procedere in modo troppo aggressivo e non prevedono un rollback automatico in caso di errori.

La buona notizia? Esiste Argo Rollouts, parte di Argo Projects. Questo potente controller per Kubernetes porta i deployment a un livello superiore. Con Argo Rollouts è possibile:

  • Controllare velocità e portata degli aggiornamenti: niente più rilasci Big Bang. Si distribuiscono gradualmente le modifiche a un sottoinsieme controllato di utenti, riducendo al minimo i rischi e lavorando con maggiore serenità.
  • Indirizzare il traffico esattamente dove serve: si possono inviare gli utenti alla nuova versione, alla precedente o a una combinazione delle due, per testare le funzionalità, raccogliere feedback e garantire una transizione senza intoppi.
  • Validare gli aggiornamenti con controlli evoluti: oltre alle semplici verifiche del tipo "è in esecuzione?", Argo Rollouts esegue controlli avanzati che includono metriche esterne, stress test e check personalizzati, per avere la certezza che l'aggiornamento sia pronto al rilascio.
  • Automatizzare i rollback se qualcosa va storto: niente più ripristini manuali. Argo Rollouts esegue il rollback in autonomia in caso di errori, riducendo i tempi di inattività e mantenendo alta la soddisfazione degli utenti.

In questo articolo vedremo come usare Argo Rollouts per realizzare deployment Blue-Green e Canary, per rilasci più sicuri, fluidi e affidabili.

Cos'è Argo Rollouts?

Argo Rollouts è un potente controller per Kubernetes con una serie di CRD che potenziano le capacità di deployment, includendo blue-green, canary analysis, sperimentazione e progressive delivery in Kubernetes.

Argo Rollouts si integra con ingress controller e service mesh per spostare gradualmente il traffico verso le nuove versioni durante un aggiornamento. In più, Rollouts può raccogliere e analizzare metriche da diversi provider per verificare i KPI chiave e procedere automaticamente alla promozione o al rollback durante l'aggiornamento.

Analogamente all'oggetto deployment, il controller Argo Rollouts gestisce la creazione, lo scaling e l'eliminazione dei ReplicaSet. Questi ReplicaSet sono definiti dal campo spec.template all'interno della risorsa Rollout, che utilizza lo stesso pod template dell'oggetto deployment. Argo Rollouts non supporta StatefulSet o DaemonSet.

Quando spec.template viene modificato, il controller Argo Rollouts riceve il segnale che sta per essere introdotto un nuovo ReplicaSet. Il controller applica la strategia definita nel campo spec.strategy per stabilire come procedere dal vecchio al nuovo ReplicaSet. Una volta che il nuovo ReplicaSet è stato scalato (e, opzionalmente, ha superato un'Analysis), il controller lo contrassegna come "stable".

È inoltre possibile utilizzare spec.WorkoadRef per gestire deployment esistenti in Argo Rollouts senza eliminare la configurazione attuale.

Demo di Argo Rollouts

Prerequisiti

Installare Argo Rollouts

  • Eseguire i comandi seguenti per installare argo rollouts nel cluster. Per ulteriori opzioni, fare riferimento alla documentazione ufficiale.
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

Strategia di deployment Blue-Green

Un deployment blue-green prevede l'esecuzione simultanea di due ambienti identici. Il primo, chiamato ambiente blue, rappresenta l'attuale ambiente di produzione, mentre il secondo, l'ambiente green, ospita la nuova versione dell'applicazione che si intende rilasciare. In questa fase, soltanto la vecchia versione riceve il traffico di produzione. Questo approccio consente agli sviluppatori di testare la nuova versione prima di indirizzare il traffico live verso il nuovo ambiente.

rappresentazione visiva del deployment blue-green

Vediamo come utilizzare Argo Rollouts per la strategia Blue-Green con un deployment di esempio.

  • Distribuire un'applicazione nginx di esempio nel cluster con il comando seguente, che fungerà da ambiente blue.
kubectl create deployment nginx --image nginx:1.19.10 --replicas 2

Pod dell'applicazione di esempio

  • Creare due servizi Kubernetes per il deployment. Uno per l'ambiente attuale (blue) e l'altro per il nuovo 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

Servizi ed endpoint di esempio

  • Creare una risorsa Argo Rollout con le configurazioni necessarie per la strategia Blue-Green. Per tutte le opzioni, consultare la documentazione ufficiale.
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
  • Verificare il nuovo replicaset e la configurazione di argo rollout come mostrato di seguito.

Stato di pod, ReplicaSet e Argo Rollout

  • I pod gestiti dal replicaset iniziale non vengono rimossi automaticamente. È consigliabile scalare manualmente a 0 le repliche del deployment, dato che ora la gestione spetta ad argo rollout. Eseguire il comando seguente per ridurre i pod non gestiti.
kubectl scale deployment nginx --replicas 0

  • Modifichiamo ora la versione dell'immagine in latest: questo attiverà una nuova revisione.
kubectl set image deployment/nginx nginx=nginx:latest

Stato del deployment Blue-Green prima della promozione

  • L'ambiente Green è ora pronto: si può usare il servizio nginx-preview per testare le modifiche senza intaccare il traffico live servito da nginx-active.
  • È inoltre possibile monitorare lo stato del rollout dal dashboard di Argo Rollout. Eseguire il comando seguente per accedervi.
kubectl argo rollouts dashboard -n default

Stato del rollout nel dashboard di Argo Rollout

  • Promuovere la nuova versione in produzione con il comando seguente.
kubectl argo  rollouts promote nginx

Stato del deployment Blue-Green dopo la promozione

Strategia di deployment Canary

Il deployment canary è un rilascio per fasi di un'applicazione che ripartisce il traffico tra una versione già in produzione e una nuova, distribuendola gradualmente a un sottoinsieme di utenti prima di estenderla a tutti.

Ingress controller e service mesh come NGINX e Istio consentono un traffic shaping più evoluto per il canarying, ad esempio uno splitting del traffico a grana fine o basato su header HTTP.

rappresentazione visiva del deployment canary

Vediamo come utilizzare Argo Rollouts per il deployment Canary.

  • Distribuire un'applicazione di esempio nel cluster.
kubectl create deployment nginx-canary --image nginx:1.19.10 --replicas 5
  • Creare un servizio Kubernetes per il deployment. A differenza del Blue-Green, il canary non richiede due servizi Kubernetes distinti per lo stesso deployment, perché i nuovi endpoint dei pod vengono aggiunti al servizio in base alla percentuale di Canary impostata.
kubectl expose deployment nginx-canary --port 80 --target-port 80

Pod e servizio dell'applicazione di esempio

  • Creare una risorsa Argo Rollout per la strategia canary. Per tutte le opzioni, consultare la documentazione ufficiale.
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

Stato di pod, ReplicaSet e Argo Rollout

  • Come per il deployment blue-green, occorre azzerare le repliche del deployment attuale, in modo che argo rollout possa gestire tutti i nuovi pod del nuovo replicaset.
kubectl scale deployment nginx-canary --replicas 0
  • Distribuiamo ora una nuova versione dell'applicazione e osserviamo il deployment canary in azione.
kubectl set image deployment/nginx-canary nginx=nginx:latest

Stato iniziale (10%) del deployment canary

Stato del rollout Canary nel dashboard di Argo

  • Promuovere manualmente il rollout alle fasi successive del canary.
kubectl argo rollouts promote nginx-canary

Stato del rollout Canary al 30%

Stato del rollout Canary nel dashboard di Argo

Stato del rollout Canary al 100%

Stato del rollout Canary nel dashboard di Argo

Argo Rollouts mette a disposizione una funzionalità di analysis che permette di definire ed eseguire vari controlli e test sull'applicazione durante o dopo il deployment, validando stabilità e prestazioni della nuova versione prima di estenderla a tutto il traffico di produzione.

In sintesi, Argo Rollouts è uno strumento prezioso per chiunque lavori con Kubernetes e voglia perfezionare i propri processi di deployment, garantendo aggiornamenti applicativi affidabili e senza intoppi. Le sue funzionalità complete lo rendono la scelta privilegiata delle aziende che puntano alla progressive delivery, vogliono migliorare l'esperienza utente e ridurre al minimo i tempi di inattività durante il rilascio degli aggiornamenti software.