GitOps è un paradigma volto ad implementare Continuous Deployment e/o Continuous Delivery per applicazioni Cloud Native. Tramite l’uso di strumenti già familiari allo sviluppatore si concentra su un’esperienza che veda lo sviluppatore coinvolto anche nelle attività inerenti all’infrastruttura.
Possiamo pensare a GitOps come a una raccolta di buone pratiche per gestire la consegna di applicazioni containerizzate e dell’infrastruttura sulla quale queste girano.
GitOps si basa su 4 principi:
Notiamo quindi che si rende necessario un nuovo attore per fare GitOps in Kubernetes: il GitOps Operator.
POTREBBE INTERESSARTI ANCHE: 3 errori comuni durante l’adozione di Kubernetes
Come accennato poco fa, si profila necessario un nuovo attore: il GitOps operator, ovvero un Kubernetes operator che segue il loop control pattern del Kubernetes controller e si occupa della parte di automazione della delivery e del monitoraggio. Ci sono diversi GitOps operators, tra cui i principali sono Flux CD, Argo CD e Jenkins-X.
Perchè ve lo stiamo dicendo? Non è raro che alcune funzionalità premium, dopo qualche release, passino anche alla versione free. Vale la pena quindi di tenere d’occhio questa funzionalità di GitLab e come si evolverà lo strumento nella sua versione free.
Prima di vedere la pipeline CI/CD di tipo GitOps, è bene analizzare una tipica pipeline CI/CD di Kubernetes, detta anche Push Model.
Credits: GitOps, Push-Based Deployments
Questo modello segue una pipeline che, come potete vedere, potremmo definire unilineare e unidirezionale: parte dallo sviluppatore, attraversa tutti i passaggi della CI e, infine, è lo stesso tool di CI che si occupa anche del Continuous Deployment dell’applicazione nel suo ambiente di destinazione.
Questo processo, sebbene non intrinsecamente errato, può dimostrare alcune debolezze: in primis la necessità di fornire al tool di CI/CD le credenziali dell’ambiente di destinazione. In secondo luogo vediamo un tool di CI che non è in grado di notificare discrepanze tra lo stato desiderato e quello attuale e ci costringe ad installare un secondo tool che si occupi di monitorare lo stato dell’applicazione.
Credits: GitOps, Pull-Based Deployments
Nel Modello Pull-Based, nonché il modello di pipeline CI/CD GitOps, vediamo invece una prima differenza principale, ovvero la presenza di due repository posti a inizio e fine del processo di CI. In questo modello infatti il tool di CI non si occupa più del deployment ma sarà un operator come quelli visti in precedenza, installato nell’ambiente target. Restando in ascolto di eventuali modifiche effettuate nel registry docker e nell’environment repository, il tool si occuperà di far coincidere lo stato attuale dell’ambiente con quello dell’environment repository, ovvero lo stato desiderato.
Vediamo quindi come in questo modello vengono spezzate l’unidirezionalità e l’unilinearità del modello Push-Based, aumentando sicurezza ed efficienza.
GitOps senza dubbio può portare molti benefici. Come prima cosa, rende il sistema totalmente osservabile, tanto da te quanto da un tool automatizzato. Esso ti assicura che ciò tu vedi nell’environment repository è effettivamente quello che c’è nel cluster Kubernetes, effettuando autonomamente le implementazioni necessarie per far coincidere lo stato attuale del sistema con lo stato desiderato (di conseguenza aumenta anche la verificabilità!).
Inoltre, GitOps condivide un essenziale benefit con Kubernetes: il modello dichiarativo su cui si basa il lavoro degli operator, grazie ai quali potrai aumentare la produttività. Infine il modello Pull rende i sistemi più sicuri semplificando il problema di dover esporre le API di Kubernetes alla tua Continuous Integration.
Per essere sicuri di godere appieno di questi benefici, però, occorre prestare attenzione a dei punti che, se non gestiti in modo opportuno, potrebbero risultare in problematiche. È importante sfruttare l’environment repository e le pipeline per prevenire più possibile il push simultaneo sullo stesso repository. Se Git trovasse il remote non più allineato perché, nel frattempo, un’altra pipeline ha pushato sullo stesso repository e sullo stesso branch non riuscirebbe più a pushare le modifiche.
Quali sono quindi i nostri suggerimenti per evitare queste problematiche?
Come prima cosa, se possibile, consigliamo di usare sempre due repository, uno per il codice della vostra applicazione e l’altro come storage per i vostri manifest. Inoltre, ricordiamo sempre di non mettere mai dati sensibili nell'environment repository. È vero che GitHub aiuta a rendere il sistema più sicuro, ma è comunque buona precauzione prendere questa accortezza.
Seguendo questi due semplici consigli e le best practices potrete creare applicazioni moderne e Cloud Native godendo di tutti i benefici che il paradigma GitOps ha da offrire e continuerà ad offrire con il suo sempre crescente sviluppo.