Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Automatizzare la configurazione multi-cluster di Kubernetes con Argo CD

By Mike SparrJul 27, 20204 min read

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

A mio avviso, uno degli aspetti più interessanti della soluzione enterprise Anthos di Google è Anthos Config Management (ACM). Basta configurare un repository Git, collegarvi i vari cluster e questi standardizzeranno le configurazioni evitando il drift secondo un approccio GitOps. Un aspetto particolarmente rilevante per le grandi aziende che gestiscono centinaia o migliaia di cluster distribuiti in sedi di hosting differenti.

Automatizzare la configurazione multi-cluster di Kubernetes con Argo CD

Ispirato da ACM, mi sono chiesto se fosse possibile ricreare lo stesso tipo di funzionalità con un'altra soluzione GitOps, Argo CD. Sono lieto di poter dire che ha funzionato come previsto: le modifiche apportate ai file di configurazione nel repository Git sono state applicate a entrambi i cluster senza alcun intoppo.

Panoramica dell'architettura

Il setup

Per semplicità ho creato due cluster sul servizio Kubernetes gestito di Google Cloud, GKE, in due region distinte per simulare uno scenario East e uno West. Naturalmente, Argo CD si può installare su cluster ovunque, purché possano accedere al repository Git.

Ho preparato il seguente shell script per fare il bootstrap di tutto l'ambiente; in produzione, però, consiglio di gestire l'infrastruttura con Terraform, ove possibile.

Cluster con bootstrap completato

Nel giro di 8-10 minuti entrambi i cluster erano attivi e i workloads di Argo CD erano stati distribuiti.

Cluster Kubernetes nelle region East e West

Argo CD distribuito su ciascun cluster

App of Apps

L'aspetto peculiare di questo setup è che su ogni cluster ho installato Argo CD con un'Application iniziale basata sul pattern App of Apps e collegata al mio repository GitHub. Questo permette di aggiungere in futuro un numero qualsiasi di configurazioni al repository e di personalizzare i cluster o le app distribuite.

La sincronizzazione automatica è del tutto opzionale. Con un numero elevato di cluster la consiglio, perché consente loro di auto-ripararsi e di gestire il drift. Uno svantaggio dell'auto-sync, però, è che la funzione di rollback non è disponibile.

La cartella (path) applications/ contiene un'app (per ora), denominata k8s-config.yaml, che a sua volta è un'altra app Argo che punta a un'altra cartella con le nostre configurazioni Kubernetes.

La cartella (path) k8s-config/ contiene tutti i file YAML che vogliamo applicare ai cluster Kubernetes. In alternativa, è possibile dichiarare un'app per applicare le configurazioni in modo ricorsivo, qualora si abbiano molti file da organizzare.

Repository del codice sorgente

Per il mio esperimento ho pubblicato un repository del codice sorgente su GitHub all'indirizzo mikesparr/multi-cluster-argo-demo con la seguente struttura di directory.

Struttura del repository del codice sorgente

In questo esempio è tutto contenuto in un unico repository, ma si possono separare le responsabilità utilizzando repository diversi e assegnando a team differenti i permessi per modificarli.

L'interfaccia di Argo

Da riga di comando si può effettuare il port-forward al servizio argo-server

kubectl -n argocd port-forward svc/argo-server 8080:443

Nel browser visiti http://localhost:8080 e, quando richiesto, accetti l'eccezione di sicurezza (no https). SUGGERIMENTO: per impostazione predefinita, il login si effettua con admin e il nome completo del pod del server argocd:

Copi argocd-server-XXXXXXX come password predefinita

All'inizio compare l'applicazione (app of apps) finché non viene sincronizzata

Una volta sincronizzata l'App of Apps (applications), questa riconoscerà la prima app, k8s-config.

Dopo la sincronizzazione di entrambe le applicazioni

Cliccando sul pannello dell'app k8s-config, si ottiene una vista dettagliata di tutto ciò che è stato installato sul server.

Tutti i file YAML nella directory /k8s-config del repository vengono applicati al server

Verifica delle configurazioni dei cluster

Cambi il contesto di kubectl su ciascun cluster e controlli namespaces, serviceaccounts, roles e rolebindings per il test-namespace. Li troverà installati su entrambi i cluster. Congratulazioni!

Il cluster ha installato automaticamente i workloads dal repository Git

Video demo

Demo dal vivo: aggiunta di un pod Nginx e deployment automatico su più cluster dal repository GitHub

Potenziale illimitato

Immagini di voler aggiungere un API Gateway al proprio stack scegliendo Ambassador o Kong, entrambi configurati con CRD e YAML. Basterebbe aggiungere un'altra cartella o un altro repository, poi un nuovo file YAML dell'app all'interno della cartella applications/, e ArgoCD lo installerebbe e configurerebbe automaticamente.

Per ogni applicazione pubblicata dal team di engineering, basterebbe modificare la versione dell'immagine Docker in un manifest di Deployment, aprire una pull request per la modifica e si avrebbero così controlli manuali integrati e una chiara separazione dei ruoli. Una volta effettuato il merge della PR, Argo CD si occuperà di distribuirla sul cluster e nell'ambiente di riferimento.

Un altro caso d'uso è il supporto a deployment multi-cloud, bilanciando il traffico tramite DNS per una vera configurazione active-active. Un ulteriore scenario può essere la migrazione da un cloud a un altro.

Non vedo l'ora di esplorare altre possibilità e spero che abbia trovato utile questo modo alternativo per mantenere i cluster sincronizzati nei vari ambienti.

Pulizia

Se ha utilizzato lo script e/o il repository, non dimentichi di fare pulizia e rimuovere le risorse per evitare costi superflui. Il modo più semplice è eliminare i cluster con il comando seguente (oppure eliminare l'intero progetto).

gcloud container clusters delete west --zone us-west2-b
gcloud container clusters delete east --zone us-east1-c