Con ogni innovazione arrivano nuove complicazioni. I container hanno consentito di impacchettare ed eseguire le applicazioni in un form-factor pratico e portatile, ma gestire container su larga scala è a dir poco impegnativo. Kubernetes, il prodotto del lavoro svolto internamente da Google per risolvere questo problema, fornisce un unico framework per la gestione di come i container vengono eseguiti su un intero cluster. I servizi che fornisce sono generalmente raggruppati sotto il termine orchestrazione, ma coprono molti altri aspetti tra cui pianificazione dei container, individuazione dei servizi tra i container, bilanciamento del carico tra sistemi, aggiornamenti/rollback, disponibilità elevata e altro ancora.

In questa guida illustreremo le basi della configurazione di Kubernetes e approfondiremo le applicazioni basate su container. Questa non vuole quindi essere un’introduzione ai concetti base di Kubernetes, ma piuttosto un modo per mostrare come questi si uniscano in semplici esempi di esecuzione di Kubernetes.

Usare una distribuzione di Kubernetes

Kubernetes è nato per gestire container Linux. Tuttavia, a partire da Kubernetes 1.5, Kubernetes supporta anche Windows Server Containers, sebbene il piano di controllo di Kubernetes debba continuare a funzionare su Linux. Naturalmente, con l’aiuto della virtualizzazione, potete iniziare con Kubernetes su qualsiasi piattaforma.

Se prevedete di eseguire Kubernetes sul vostro hardware o VM, un modo comune per farlo è quello di ottenere una distribuzione pacchettizzata, che in genere combina pezzi di Kubernetes con altri elementi (registro contenitore, rete, archiviazione, sicurezza, registrazione, monitoraggio, pipeline di integrazione continua) necessari per una distribuzione completa. Inoltre, le distribuzioni di Kubernetes possono generalmente essere installate ed eseguite in qualsiasi infrastruttura di macchine virtuali come Amazon EC2, Azure Virtual Machines, Google Compute Engine, OpenStack e così via.

Canonical Kubernetes, Cloud Foundry Container Runtime, Mesosphere Kubernetes Service, Oracle Linux Container Services, Pivotal Container Service, Rancher, Red Hat OpenShift e Suse CaaS Platform sono solo alcune delle dozzine di distribuzioni di Kubernetes disponibili. Da notare che le offerte Canonical, Red Hat e Suse raggruppano Kubernetes con una distribuzione Linux, che elimina la necessità di configurare Kubernetes su un dato sistema operativo; non ci riferiamo solo al processo di download e installazione, ma anche ad alcuni dei processi di configurazione e gestione.

Un altro approccio consiste nell’eseguire Kubernetes su una distribuzione Linux convenzionale, anche se in genere questo approccio richiede più attenzione e maggiori abilità “manuali. Red Hat Enterprise Linux ha Kubernetes nel suo repository di pacchetti, ad esempio, ma anche Red Hat ne consiglia l’uso solo per test e sperimentazioni. Piuttosto che cercare di mettere insieme qualcosa a mano, gli utenti dello stack di Red Hat sono invitati a utilizzare Kubernetes tramite OpenShift PaaS, poiché OpenShift ora usa Kubernetes come proprio orchestratore nativo.

Molte distribuzioni Linux convenzionali offrono strumenti speciali per la configurazione di Kubernetes e altri grandi stack di software. Ubuntu, ad esempio, fornisce uno strumento chiamato conjure-up che può essere utilizzato per distribuire la versione upstream di Kubernetes su istanze cloud e bare-metal. Canonical fornisce anche MicroK8, una versione di Kubernetes che si installa tramite il sistema di pacchetti Snap.

Utilizzare un servizio Kubernetes nel cloud

Kubernetes è disponibile come elemento standard in molti servizi cloud, sebbene appaia in modo predominante come funzione nativa in Google Cloud Platform (GCP). GCP offre due modi principali per eseguire Kubernetes. Il modo più conveniente e strettamente integrato è tramite Google Kubernetes Engine, che consente di eseguire gli strumenti da riga di comando di Kubernetes per gestire il cluster creato.

In alternativa si può utilizzare Google Compute Engine per configurare un cluster di calcolo e distribuire manualmente Kubernetes. Questo metodo richiede una maggior attenzione, ma consente personalizzazioni che non sono possibili con Container Engine. Scegliete Container Engine se state iniziando a lavorare con i container. In seguito, se volete provare qualcosa di più avanzato, come una versione personalizzata di Kubernetes o delle vostre modifiche, è possibile distribuire macchine virtuali che seguono una distribuzione Kubernetes.

Con Amazon si doveva originariamente eseguire Kubernetes distribuendo un cluster di calcolo in EC2. Questa opzione è ancora valida, ma Amazon ora l’Elastic Container Service for Kubernetes (EKS). Con EKS, Amazon esegue il piano di controllo e l’utente deve così concentrarsi solo sulla distribuzione dei container che utilizzerà con la configurazione che desidera. EKS esegue anche una versione upstream standard di Kubernetes. Una caratteristica intelligente è l’integrazione di Kubernetes con il resto del portafoglio AWS. I servizi AWS vengono visualizzati in EKS come definizioni di risorse personalizzate native di Kubernetes; pertanto eventuali modifiche ad AWS o Kubernetes non interromperanno tali connessioni.

Molte distribuzioni di Kubernetes vengono fornite con istruzioni dettagliate per essere configurate su AWS e altrove. Red Hat OpenShift, ad esempio, può essere installato su uno o più host tramite un programma di installazione interattivo o uno script, oppure utilizzando lo strumento di provisioning “infrastructure-as-code” Terraform. In alternativa, lo strumento Kops di Kubernetes può essere utilizzato per eseguire il provisioning di un cluster di VM generiche su AWS, con il supporto per Google Cloud Engine, VMware vSphere e altri cloud.

Microsoft Azure supporta Kubernetes tramite il servizio Azure Kubernetes. Qui Azure gestisce i nodi principali di Kubernetes mentre l’utente crea i cluster tramite i modelli di Resource Manager o Terraform. Se si desidera controllare sia il nodo master, sia quello agent, è sempre possibile installare una distribuzione Kubernetes su una macchina virtuale di Azure. Detto questo, un vantaggio chiave di AKS è che non si paga nullo per l’uso del nodo master ma solo per i nodi agent.

Un modo rapido per eseguire il provisioning di un cluster Kubernetes di base in una varietà di ambienti, cloud o meno, consiste nell’utilizzare un progetto chiamato Kubernetes Anywhere. Questo script funziona su Google Compute Engine, Microsoft Azure, VMware vSphere (è richiesto vCenter) e OpenStack. In ogni caso, Kubernetes Anywhere fornisce un certo grado di automazione per l’installazione.

Usare Minikube per eseguire localmente Kubernetes

Se eseguite Kubernetes solo in un ambiente locale come una macchina di sviluppo, ci sono alcuni modi per impostare Kubernetes solo per tale uso. Quello fornito dal team di sviluppo di Kubernetes si chiama Minikube. Eseguitelo e otterrete un cluster Kubernetes a nodo singolo distribuito in un host di virtualizzazione di vostra scelta. Minikube ha alcuni prerequisiti, ma sono tutti abbastanza facili da soddisfare su MacOS, Linux o Windows.

Eseguire un’app demo Kubernetes

Una volta eseguito Kubernetes, siete pronti per iniziare a distribuire e gestire i container. Potete semplificare le operazioni con il container attingendo a una delle tante app demo basate su container disponibili. Prendetene una, assemblatela per vedere come è composta, distribuitela e poi modificatela in modo incrementale finché non si avvicina a qualcosa che vi possa essere utile. Se avete scelto Minikube, potete utilizzare il tutorial Hello Minikube per creare un container Docker contenente una semplice app Node.js in un’installazione demo di Kubernetes a nodo singolo.

Il passo successivo consiste nel distribuire un’applicazione di esempio che assomiglia a quella che si potrebbe usare in produzione e acquisire familiarità con concetti di Kubernetes più avanzati come pod (uno o più contenitori che comprendono un’applicazione), servizi (set logici di pod), set di repliche (per fornire auto-riparazione in caso di guasto della macchina) e distribuzioni (versioning dell’applicazione).

Prendete per esempio l’applicazione sample di WordPress/MySQL e vedrete più che semplici istruzioni su come distribuire i pezzi in Kubernetes e farli funzionare. Scoprirete infatti anche i dettagli di implementazione per molti concetti usati dalle applicazioni di Kubernetes a livello di produzione. Imparerete come impostare i volumi persistenti per preservare lo stato di un’applicazione, come esporre i pod al mondo esterno tramite i servizi, come archiviare le password delle applicazioni e così via.

Weaveworks ha un’app di esempio (Sock Shop) che mostra come un modello di microservizi possa essere utilizzato per comporre un’applicazione in Kubernetes. Sock Shop sarà molto utile per le persone che hanno familiarità con le tecnologie di base (Node.js, Go kit e Spring Boot), ma i principi fondamentali sono pensati per trascendere particolari framework e illustrare tecnologie native del cloud.

Se avete dato un’occhiata all’applicazione di WordPress/MySQL e avete immaginato che ci potrebbe essere un’app di Kubernetes pre-confezionata che soddisfi le vostre esigenze, probabilmente avete ragione. Kubernetes ha infatti un sistema di definizione delle applicazioni chiamato Helm che fornisce un modo per creare pacchetti, versioni e condividere le applicazioni di Kubernetes. Un certo numero di app popolari (GitLab, WordPress) e blocchi di app (MySQL, Nginx) offrono “grafici” di Helm disponibili attraverso il portale di Kubeapps.

Gestire i container con Kubernetes

Kubernetes semplifica la gestione dei container tramite potenti astrazioni come pod e servizi, fornendo al contempo una grande flessibilità grazie a meccanismi come etichette e namespace, che possono essere utilizzati per separare pod, servizi e distribuzioni (sviluppo, staging e carichi di lavoro di produzione).

Se si prende uno degli esempi precedenti e si impostano istanze diverse in più namespace, è possibile esercitarsi ad apportare modifiche ai componenti in ogni namespace indipendentemente dagli altri. È quindi possibile utilizzare le distribuzioni per consentire il roll out di tali aggiornamenti tra i pod in un determinato namespace in modo incrementale.

Il prossimo passo è capire e imparare come Kubernetes possa essere guidato da strumenti per la gestione dell’infrastruttura. Puppet, ad esempio, ha un modulo per creare e manipolare le risorse in Kubernetes. Allo stesso modo Terraform di HashiCorp ha un crescente supporto per Kubernetes come risorsa. Se prevedete di utilizzare un gestore di risorse di questo tipo, dovete considerare il fatto che strumenti diversi potrebbero portare a supposizioni molto diverse. Puppet e Terraform, ad esempio, utilizzano rispettivamente infrastrutture mutevoli e immutabili. Queste differenze “filosofiche” e comportamentali possono determinare quanto sia facile o difficile creare la configurazione di Kubernetes che vi serve.