Questa pagina fornisce un punto di partenza per aiutarti a pianificare e progettare l'architettura delle pipeline GitOps CI/CD per Kubernetes, che possono aiutarti a ottenere il massimo da Config Sync.
GitOps è una best practice universale per le organizzazioni che gestiscono la configurazione ma quando si tratta di progettare la soluzione hai molte opzioni. Comprendere le opzioni a tua disposizione, nonché i vantaggi e i compromessi di queste decisioni, può aiutarti a evitare di riscrivere l'architettura in futuro.
Non è necessario seguire tutte le best practice elencate in questa pagina. Le best practice che scegli di adottare dipendono dalla tua situazione specifica. L'obiettivo di questa pagina è aiutarti a prendere decisioni consapevoli durante la configurazione dell'architettura GitOps.
Utilizza un repository di pacchetti privato e centralizzato
L'utilizzo di un repository centrale per i pacchetti pubblici o interni (come Helm o kpt
) può aiutare i team a trovare i pacchetti più facilmente. Puoi usare servizi come Artifact Registry
o repository Git.
Il team della piattaforma può implementare criteri in cui i team delle applicazioni possono usare i pacchetti solo dal repository centrale. In alternativa, potrebbero usare il repository centrale come insieme di pacchetti verificati.
Puoi limitare le autorizzazioni di scrittura nel repository solo a un numero limitato di ingegneri. Il resto dell'organizzazione può avere accesso in lettura. Consigliamo di implementare una procedura per promuovere i pacchetti nel repository centrale e la trasmissione degli aggiornamenti.
La tabella seguente elenca i vantaggi e gli svantaggi dell'utilizzo di un repository di pacchetti privato e centralizzato:
Vantaggi |
Svantaggi |
|
|
crea repository bagnati
Crea repository con l'output YAML che corrisponde allo stato desiderato del cluster o dello spazio dei nomi. Le modifiche al repository bagnato o completamente idratato dovrebbero essere facili da rivedere utilizzando un diff. È buona norma apportare modifiche al repository Wet tramite un processo di revisione (ad esempio, in GitHub, si tratta di una richiesta di pull).
La seguente tabella elenca i vantaggi e gli svantaggi della creazione di repository "bag":
Vantaggi |
Svantaggi |
|
|
Shift a sinistra per convalidare le configurazioni
Attendere l'avvio della sincronizzazione di Config Sync per verificare la presenza di problemi può creare commit Git non necessari e un lungo ciclo di feedback. È possibile rilevare molti problemi prima che una configurazione venga applicata a un cluster utilizzando le funzioni di convalida di kpt
come kubeval.
La tabella seguente elenca i vantaggi e gli svantaggi del controllo della presenza di problemi prima di applicare una configurazione:
Vantaggi |
Svantaggi |
|
|
Utilizzare le cartelle anziché i rami
Utilizza le cartelle per le varianti della configurazione anziché i rami. Con le cartelle,
puoi utilizzare il comando tree
per visualizzare le varianti. Ad esempio, con i rami, non è possibile capire se il delta tra un ramo di produzione e di fase sia un cambiamento imminente nella configurazione o una differenza permanente tra la fase e il ramo di produzione.
La seguente tabella elenca i vantaggi e gli svantaggi dell'utilizzo delle cartelle anziché dei rami:
Vantaggi |
Svantaggi |
|
|
Riduci al minimo l'utilizzo di ClusterSelectors
ClusterSelectors
consente di applicare determinate parti di una
configurazione a un sottoinsieme di cluster. Anziché configurare RootSync o RepoSync,
puoi modificare la risorsa applicata o aggiungere etichette
ai cluster. Tuttavia, nel tempo, con l'aumento del numero di ClusterSelectors
,
può diventare complicato comprendere lo stato finale del cluster.
Config Sync consente di sincronizzare più RootSyncs
e RepoSyncs
contemporaneamente, il che significa che puoi aggiungere la configurazione pertinente a un repository separato e quindi sincronizzarla con i cluster che preferisci.
La tabella seguente elenca i vantaggi e gli svantaggi del non utilizzare ClusterSelectors
:
Vantaggi |
Svantaggi |
|
|
Evita di gestire i job con Config Sync
Sebbene Config Sync possa applicare i job al posto tuo, questi non sono adatti al deployment di GitHub per i seguenti motivi:
Campi immutabili: molti campi Job sono immutabili. Per modificare un campo immutabile, l'oggetto deve essere eliminato e ricreato. Tuttavia, Config Sync non elimina l'oggetto a meno che non lo rimuovi dall'origine.
Esecuzione non intenzionale di job: se sincronizzi un job con Config Sync e poi il job viene eliminato dal cluster, Config Sync considera la deviazione dallo stato scelto e ricrea il job. Se specifichi un valore TTL (TTL), il job viene eliminato automaticamente e Config Sync lo ricrea automaticamente riavviando il job finché non lo elimini dalla fonte attendibile. Spesso questo non è ciò che intendevi, perché Config Sync esegue di nuovo il job.
Problemi di riconciliazione: Config Sync di solito attende la riconciliazione degli oggetti dopo l'applicazione. Tuttavia, i job vengono considerati riconciliati all'avvio dell'esecuzione. Ciò significa che Config Sync non attende il completamento del job prima di continuare ad applicare altri oggetti. Tuttavia, se in seguito il job non riesce, la riconciliazione viene considerata un errore. In alcuni casi, questa operazione può bloccare la sincronizzazione di altre risorse e causare errori finché non lo correggi. In altri casi, la sincronizzazione potrebbe riuscire e solo la riconciliazione non va a buon fine.
Per questi motivi, sconsigliamo di sincronizzare i job con Config Sync.
Nella maggior parte dei casi, i job e altre attività situazionali devono essere gestiti da un servizio che ne gestisce la gestione del ciclo di vita. Puoi quindi gestire il servizio con Config Sync, anziché con i job stessi.
La tabella seguente elenca i vantaggi e gli svantaggi del mancato utilizzo di Config Sync per gestire i job:
Vantaggi |
Svantaggi |
|
|
Utilizza repository non strutturati
Config Sync supporta due strutture per organizzare un repository:
non strutturato e gerarchico. Non strutturati è l'approccio consigliato, perché
ti consente di organizzare un repository nel modo che preferisci.
I repository gerarchici, invece, applicano una struttura specifica. Ad esempio, i CRD devono trovarsi in una directory specifica. Questo può causare problemi
quando devi condividere le configurazioni. Ad esempio, se un team pubblica un pacchetto che
contiene un CRD, un altro team che deve utilizzare quel pacchetto dovrebbe spostare
la CRD in una directory cluster
, aumentando il carico di lavoro al processo.
La tabella seguente elenca i vantaggi e gli svantaggi dell'utilizzo di repository non strutturati:
Vantaggi |
Svantaggi |
|
|
Per scoprire come convertire un repository gerarchico, vedi Convertire un repository gerarchico in un repository non strutturato.
Separa i repository di codice e di configurazione
Quando si fa lo scale up di un repository mono, richiede una build specifica per ogni cartella. Le autorizzazioni e i problemi per gli utenti che lavorano al codice e alla configurazione del cluster sono generalmente diversi. Mantenendo separati i repository di codice e configurazione, ogni repository può avere autorizzazioni e struttura proprie.
La seguente tabella elenca i vantaggi e gli svantaggi della separazione dei repository di codice e di configurazione:
Vantaggi |
Svantaggi |
|
|
Usa repository separati per isolare le modifiche
Quando si fa lo scale up di un repository mono, sono necessarie autorizzazioni diverse su cartelle diverse. Per questo motivo, la separazione dei repository consente di definire i confini di sicurezza tra la configurazione della sicurezza, della piattaforma e dell'applicazione. Inoltre, è una buona idea separare i repository di produzione da quelli non di produzione.
La seguente tabella elenca i vantaggi e gli svantaggi dell'isolamento delle modifiche in repository separati:
Vantaggi |
Svantaggi |
|
|
Fissa le versioni del pacchetto
Sia che utilizzi Helm o Git, devi bloccare la versione del pacchetto di configurazione su qualcosa che non venga accidentalmente spostato in avanti senza un'implementazione esplicita.
La tabella seguente elenca i vantaggi e gli svantaggi del blocco delle versioni dei pacchetti:
Vantaggi |
Svantaggi |
|
|
Utilizzo di Workload Identity
Puoi abilitare Workload Identity sui cluster GKE, per consentire ai carichi di lavoro Kubernetes di accedere ai servizi Google in modo sicuro e gestibile.
La tabella seguente elenca i vantaggi e gli svantaggi derivanti dall'utilizzo di Workload Identity:
Vantaggi |
Svantaggi |
|
|
Architettura di alto livello
A livello generale, probabilmente vorrai avere almeno quattro tipi di repository:
- Un repository di pacchetti in cui è archiviata la configurazione condivisa. Potrebbe anche trattarsi di un grafico Helm archiviato in Artifact Registry.
- Un repository della piattaforma in cui il team della piattaforma archivia la configurazione dell'intero parco risorse per cluster e spazi dei nomi.
- Un repository di configurazione delle applicazioni.
- Un repository di codice dell'applicazione.
Il seguente diagramma mostra il layout di questi repository:
![Architettura suggerita per un repository di pacchetti e piattaforma che confluisce nei repository di configurazione e di codice dell'applicazione.](https://cloud.google.com/static/kubernetes-engine/enterprise/config-sync/docs/img/gitops_package_flow.png?authuser=19&hl=it)
Il seguente diagramma mostra il flusso della configurazione dal codice dell'applicazione a un repository di configurazione dell'applicazione. I team di sviluppo eseguono il push del codice per le applicazioni e le configurazioni delle applicazioni. Il codice sia per le app che per le configurazioni viene archiviato nella stessa posizione e i team delle applicazioni hanno il controllo su questi repository. I team dedicati alle app possono quindi eseguire il push del codice in una build.
![Build consigliata dell'applicazione che mostra il codice e le configurazioni dell'applicazione
inviate tramite push a una build.](https://cloud.google.com/static/kubernetes-engine/enterprise/config-sync/docs/img/gitops_app_build.png?authuser=19&hl=it)