Kubernetes

menu icon

Kubernetes

Kubernetes è una piattaforma di orchestrazione dei contenitori open source che automatizza l'implementazione, la gestione e la scalabilità delle applicazioni. Scopri come Kubernetes consente uno sviluppo nativo per cloud conveniente.

Cos'è Kubernetes?

Kubernetes, noto anche come "k8s" o "kube", è una piattaforma di orchestrazione di contenitori per la pianificazione e l'automazione della distribuzione, gestione e scalabilità delle applicazioni containerizzate.

Kubernetes è stato sviluppato inizialmente dagli ingegneri di Google, prima di diventare open source nel 2014. Si tratta di un discendente di Borg, una piattaforma di orchestrazione di contenitori utilizzata internamente a Google. Kubernetes in lingua greca significa timoniere o pilota, da qui il timone nel Logo di Kubernetes (link esterno a  IBM).

Oggi Kubernetes e il più ampio ecosistema di contenitori stanno evolvendo in una piattaforma di elaborazione e in un ecosistema per uso generale che compete, o forse sorpassa, con le macchine virtuali (VM) nel ruolo di base fondante delle moderne infrastrutture e applicazioni cloud. Questo ecosistema consente alle organizzazioni di fornire una piattaforma Piatform-as-a-Service (PaaS) ad elevata produttività, rivolta a molteplici attività correlate all'infrastruttura e all'operatività e che affronta le problematiche pertinenti lo sviluppo nativo per cloud in modo che i team di sviluppo possano concentrarsi esclusivamente sulla codifica e l'innovazione.     

Nel seguente video, Sai Vennam fornisce una spiegazione delle basi di Kubernetes (10:59):

Cosa sono i contenitori?

Cominciamo con una definizione: Un contenitore è un'unità eseguibile di software in cui il codice applicativo viene confezionato, insieme a librerie e dipendenze, con modalità comuni, così da poter essere eseguito ovunque, su desktop, IT tradizionale o cloud.

I contenitori usufruiscono di una forma di virtualizzazione del sistema operativo (OS) che consente a più applicazioni di condividere il sistema, isolando i processi e controllando la quantità di CPU, memoria e disco accessibile dai processi.

Contenitori, macchine virtuali e infrastruttura tradizionale

Può essere più facile o più utile considerare i contenitori come ultima fase del processo di automazione e astrazione dell'infrastruttura IT.

Nelle infrastrutture tradizionali, le applicazioni vengono eseguite su un server fisico e utilizzano tutte le risorse disponibili. Ciò lascia all'utente la scelta di eseguire più applicazioni su un singolo server, auspicando che un'applicazione non utilizzi risorse a scapito delle altre o di dedicare un server alle applicazioni, il che però costringe e rinunciare alla scalabilità.

Le macchine virtuali (VM) sono server astratti dall'hardware del computer fisico, che permettono di eseguire più VM su un solo server fisico o una singola VM, estesa su più di un server fisico. Ogni VM esegue la propria istanza del sistema operativo ed è possibile isolare ogni applicazione in una VM, riducendo la possibilità che le applicazioni in esecuzione sullo stesso hardware fisico si disturbino a vicenda. Le VM sfruttano meglio le risorse e sono molto più facili e convenienti da scalare rispetto alle infrastrutture tradizionali. E inoltre quando non hai più bisogno di eseguire l'applicazione, potrai spegnere la VM.

Per ulteriori informazioni sulle VM, leggi "Macchine virtuali: una guida essenziale".

I contenitori portano questa astrazione ad un livello superiore, nello specifico, oltre a condividere l'hardware virtualizzato sottostante, condividono anche un kernel di Sistema Operativo virtualizzato. I contenitori offrono lo stesso isolamento, la scalabilità e la disponibilità delle VM, ma poiché non devono gestire il carico dell'istanza del sistema operativo, sono più leggere (cioè occupano meno spazio) rispetto alle VM. Sono più efficienti in termini di risorse, consentono di eseguire più applicazioni su minori macchine (virtuali e fisiche), con meno istanze del Sistema Operativo. I contenitori sono più facilmente portatili su desktop, data center e ambienti cloud. Sono la soluzione ideale per i metodi di sviluppo Agile e DevOps.

"Contenitori: una guida essenziale" descrive in modo completo i contenitori e la containerizzazione. E il post del blog "Contenitori e VM: qual'è la differenza?" fornisce una descrizione completa delle differenze.

Cos'è Docker?

Docker è lo strumento più utilizzato per la creazione e l'esecuzione di contenitori Linux®. Mentre le forme iniziali di contenitore sono state introdotte decenni fa (con tecnologie quali FreeBSD Jails e le partizioni del carico di lavoro di AIX), i contenitori sono stati distribuiti al pubblico nel 2013 quando Docker li ha resi comunemente disponibili con una nuova implementazione adatta a sviluppatori e cloud.

Docker è iniziato come progetto open source, ma oggi fa anche riferimento alla Docker Inc., la società che produce Docker, un toolkit di contenitori commerciale che si basa sul progetto open source (e ne fornisce le migliorie alla comunità open source).

Docker è basato sulla tecnologia LXC (Linux Container) tradizionale, ma assicura una virtualizzazione maggiormente granulare dei processi del kernel Linux e aggiunge funzioni per semplificare lo sviluppo, la gestione e la protezione da parte degli sviluppatori.

Nonostante oggi esistano piattaforme per contenitori alternative (quali Open Container Initiative (OCI), CoreOS e Canonical (Ubuntu) LXD), Docker è così largamente preferito che è praticamente diventato sinonimo di contenitore e a volte viene scambiato come concorrente di tecnologie all'avanguardia come Kubernetes (guarda il video "Kubernetes e Docker: uno non esclude l'altro").

Orchestrazione dei contenitori con Kubernetes

Poiché i contenitori proliferano, oggi un'organizzazione può averne a centinaia o migliaia, i team operativi hanno dovuto pianificarne e automatizzarne la distribuzione, il networking, la scalabilità e la disponibilità. Così è nato il mercato dell'orchestrazione dei contenitori.

Mentre altre opzioni di orchestrazione di contenitori, soprattutto Docker Swarm e Apache Mesos, in principio hanno guadagnato popolarità, Kubernetes è diventata rapidamente la soluzione più ampiamente adottata (anzi, a un certo punto, è stato il progetto con la crescita più rapida nella storia del software open source).

Gli sviluppatori scelgono (e continuano a scegliere) Kubernetes per la sua ampiezza di funzionalità, il suo vasto e crescente ecosistema di strumenti di supporto open source, e il suo supporto e portabilità sui principali fornitori di cloud (alcuni dei quali ora offrono servizi Kubernetes completamente gestiti).

Per ulteriori info sull'orchestrazione di container, guarda il video "Spiegazione dell'orchestrazione del contenitore" (08:59):

Cosa fa Kubernetes?

Kubernetes pianifica e automatizza le seguenti attività correlate ai contenitori:

  • Implementazione: implementa un numero definito di contenitori su un host specificato e li esegue in uno stato desiderato.
  • Rollout: un rollout è una modifica di un'implementazione. Kubernetes consente di avviare, mettere in pausa, riprendere o eseguire il ripristino dei rollout.
  • Rilevamento dei servizi: Kubernetes può collegare automaticamente un contenitore a Internet o ad altri contenitori utilizzando un nome DNS o un indirizzo IP.
  • Provisioning dello storage: imposta Kubernetes per montare lo storage locale o cloud persistente per i tuoi contenitori, a seconda delle esigenze.
  • Bilanciamento del carico e scalabilità: quando si verificano picchi di traffico dei contenitori, Kubernetes può utilizzare il bilanciamento del carico e scalare per distribuirlo in tutta la rete, assicurando la stabilità.
  • Riparazione automatica per l'alta disponibilità: in caso di errore di un contenitore, Kubernetes può riavviarlo o sostituirlo automaticamente; può anche eliminare i contenitori che non soddisfano i requisiti di integrità.

Kubernetes e Docker

Se ha letto il documento fino a questo punto, hai già capito che mentre Kubernetes è un'alternativa al Docker Swarm, non è (contrariamente al persistente malinteso comune) un'alternativa o un concorrente di Docker.

Infatti, se hai scelto con entusiasmo Docker e stai creando implementazioni di contenitori su larga scala basate su Docker, l'orchestrazione di Kubernetes è un passo logico successivo per la gestione di questi carichi di lavoro. Per saperne di più, guarda il video "Kubernetes e Docker: non è una questione dell'uno o dell'altro" (08:03):

Architettura Kubernetes

I componenti principali dell'architettura Kubernetes includono:

Cluster e nodi (elaborazione)

I cluster sono i blocchi di creazione dell'architettura Kubernetes. I cluster sono composti da nodi, ognuno dei quali rappresenta un singolo host compatto (macchina virtuale o fisica).

Ogni cluster è composto da più nodi di lavoro che implementano, eseguono e gestiscono le applicazioni containerizzate e un nodo principale che controlla e monitora i nodi di lavoro.

Il nodo principale esegue un servizio di pianificazione che automatizza quando e dove i contenitori vengono implementati in base ai requisiti di implementazione impostati dagli sviluppatori e alla capacità di calcolo disponibile. Ciascuno nodo di lavoro include lo strumento che viene utilizzato per gestire i contenitori, come ad esempio Docker, e un agent software chiamato Kubelet che riceve ed esegue ordini dal nodo master.

Per ulteriori informazioni sui cluster Kubernetes, leggi questo post del blog: "Cluster Kubernetes: architettura per la distribuzione rapida e controllata delle app cloud".

Pod e implementazioni (software)

I pod sono gruppi di contenitori che condividono le stesse risorse di elaborazione e la stessa rete. Sono anche l'unità di scalabilità in Kubernetes: se un contenitore si trova in un pod sta ricevendo più traffico di quanto ne possa gestire, Kubernetes replicherà il pod su altri nodi nel cluster. Per questo motivo si consiglia di mantenere compatti i pod, in modo che contengano solo i contenitori che devono condividere le risorse.

L'implementazione controlla la creazione e lo stato dell'applicazione containerizzata e la mantiene in esecuzione. Specifica quante repliche di un pod devono essere gestite sul cluster. Se un pod si guasta, l'implementazione provvede a crearne uno nuovo.

Per saperne di più sulle implementazioni Kubernetes, guarda il video: "Implementazioni Kubernetes: iniziare rapidamente" (03:54):

Per una comprensione più approfondita degli elementi dell'architettura di Kubernetes, prova questo corso autodidattico online: "Kubernetes 101".

Puoi anche approfondire l'argomento con il post del blog "Architettura Kubernetes: quattro approcci alle soluzioni di contenitori".

Service mesh Istio

Kubernetes può implementare e scalare i pod, ma non può gestire o automatizzare il routing tra i pod e non fornisce strumenti per monitorare, proteggere o eseguire il debug di queste connessioni. Con il crescere del numero di contenitori in un cluster, aumenta in modo esponenziale il numero di possibili percorsi di connessione tra di essi (ad esempio, due contenitori hanno due connessioni potenziali, ma 10 pod ne hanno 90), creando potenzialmente una configurazione e gestione da incubo.

Qui fa il suo ingresso Istio, un livello di service mesh open source per i cluster Kubernetes. Ad ogni cluster Kubernetes, Istio aggiunge un contenitore sidecar, sostanzialmente invisibile al programmatore e all'amministratore, che configura, monitora e gestisce le interazioni tra gli altri contenitori.

Con Istio puoi definire un unico criterio che configura le connessioni tra i contenitori, in modo da non dover configurare singolarmente ogni connessione. Ciò semplifica il debug delle connessioni tra i contenitori.

Istio fornisce anche un dashboard che i team e gli amministratori DevOps possono utilizzare per monitorare la latenza, gli errori time-in-service e altre caratteristiche delle connessioni tra i contenitori. E incorpora funzioni di sicurezza - nello specifico, la gestione dell'identità che non consente agli utenti non autorizzati di effettuare una chiamata di servizio di spoofing tra contenitori - oltre a funzioni di autenticazione, autorizzazione e auditing (AAA) che i professionisti della sicurezza possono utilizzare per monitorare il cluster.

Leggi l'articolo "Cos'è Istio?" per maggiori dettagli, inclusi i video e alcuni esempi di Istio in uso.

Knative e l'elaborazione serverless

Knative (pronunciato 'kay-native') è una piattaforma open source che si snoda in cima a Kubernetes e fornisce due importanti tipologie di vantaggi per lo sviluppo nativo per cloud:

Knative fornisce un facile accesso all'elaborazione serverless

L'elaborazione serverless è un modo relativamente nuovo per implementare il codice che aumenta l'efficienza e la convenienza delle applicazioni native. Invece di distribuire un'istanza di codice che resta inattiva in attesa delle richieste, serverless attiva il codice  a seconda della necessità, scalandolo a seconda della domanda, e poi lo disattiva quando non è utilizzato. L'elaborazione serverless previene lo spreco della capacità di calcolo e riduce i costi, poiché solo il codice effettivamente eseguito è a pagamento.

Knative consente agli sviluppatori di progettare un contenitore una volta e di eseguirlo come servizio software o come funzione serverless. Tutto è trasparente per lo sviluppatore: Knative gestisce i dettagli in background e lo sviluppatore può concentrarsi sul codice.

Knative semplifica lo sviluppo e l'orchestrazione dei contenitori

Per gli sviluppatori, la containerizzazione del codice richiede una serie di passaggi ripetitivi e l'orchestrazione dei contenitori richiede molte attività di configurazione e creazione di script (come ad esempio la generazione di file di configurazione, installazione delle dipendenze, gestione della registrazione dei log e del tracciamento e la creazione di script CI/CD (continuous integration/continuous deployment).

Knative semplifica queste attività, automatizzandole attraverso tre componenti:

  • Build: il componente Build di Knative trasforma automaticamente il codice sorgente in una funzione o un contenitore nativo per il cloud. Nello specifico, esegue il pull del codice dal repository, installa le dipendenze richieste, crea l'immagine del contenitore e la trasferisce in un registro dei contenitori per essere utilizzata da altri sviluppatori. Gli sviluppatori devono specificare la posizione di questi componenti in modo che Knative possa trovarli, ma una volta eseguita questa operazione, Knative automatizza la build.
  • Serve: il componente Serve esegue i contenitori come servizi scalabili; può scalare fino a migliaia di istanze di contenitori o a zero (chiamata scaling to zero). Inoltre, Serve include due funzioni molto utili:
    • Configuration, che salva le versioni di un contenitore (chiamate istantanee) ogni volta che il contenitore viene passato alla fase di produzione e consente di eseguire queste versioni contemporaneamente.
    • Service routing, che permette di indirizzare diverse quantità di traffico verso queste versioni. È possibile utilizzare queste funzioni contemporaneamente per eseguire gradualmente il rollout del contenitore o per effettuare un canary test di un'applicazione containerizzata prima di avviarne la produzione globale.
  • Event: Event consente agli eventi specificati di attivare servizi o funzioni basati sui contenitori. Ciò è parte integrante soprattutto delle funzionalità serverless di Knative: è necessario che una risorsa indichi al sistema di fornire una funzione quando necessario. L'evento consente ai team di esprimere interesse per i tipi di eventi e quindi si connette automaticamente al produttore dell'evento ed esegue l'evento nel contenitore, eliminando la necessità di programmare queste connessioni.

Per ulteriori informazioni su Knative, leggi "Knative: una guida essenziale".

L'impegno di Kubernetes GitHub e ulteriori dimostrazioni della sua crescente popolarità

Kubernetes è uno dei progetti open source in più rapida crescita della storia, e il suo successo non accenna a diminuire. Gli sviluppatori e le aziende lo utilizzano sempre di più. È importante tenere presente alcuni punti cardine:

  • Attualmente, oltre 86.200 progetti sono stati eseguiti nel repository Kubernetes su GitHub (link esterno a IBM), inclusi quasi 6.000 progetti negli ultimi quattro mesi, con oltre 2.300 collaboratori attivi su progetto. Secondo Cloud Native Computing Foundation (link esterno a IBM), ci sono stati più di 148.000 progetti tra tutti i repository collegati a Kubernetes (tra cui Kubernetes Dashboard e  Kubernetes MiniKube).
  • Più di 1.500 aziende utilizzano Kubernetes nei loro stack di software di produzione. Tra queste vi sono note aziende come AirBnB, Bose, CapitalOne, Intuit, Nordstrom, Philips, Reddit, Slack, Spotify, Tinder e, ovviamente, IBM. Leggi questi e altri casi aziendali di adozione (link esterno a IBM)
  • Secondo un sondaggio di luglio 2019 citato in Container Journal (link esterno a IBM), negli ultimi sei mesi è stato riscontrato un aumento del 51% delle implementazioni di Kubernetes.
  • Oltre 12.000 persone hanno partecipato alla conferenza KubeCon + CloudNative Con North America 2019 (link esterno a IBM), 3.000  persone in più rispetto ai numeri record dell'evento dell'anno scorso.
  • Secondo ZipRecruzzo (link esterno a IBM), lo stipendio medio annuo (in Nord America) per un lavoro correlato a Kubernetes è di 144.628 Dollari USA. Attualmente sono più di 21.000 le posizioni correlate a Kubernetes disponibili su LinkedIn (link esterno a IBM).

Esercitazioni Kubernetes

Se sei pronto a iniziare a lavorare con Kubernetes o a cercare di sviluppare le tue competenze con Kubernetes e gli strumenti dell'ecosistema Kubernetes, prova una di queste esercitazioni:

Kubernetes e IBM Cloud

Una soluzione di orchestrazione dei contenitori gestita, IBM Cloud® Kubernetes Service automatizza l'implementazione, l'utilizzo, la scalabilità e il monitoraggio delle app containerizzate in un cluster di host di elaborazione, aggiungendo al contempo funzionalità specifiche di IBM. Consente la distribuzione rapida delle applicazioni e può integrare servizi avanzati quali blockchain e IBM Watson®.

Per una panoramica su come un servizio Managed Kubernetes può aiutarti nel tuo passaggio al cloud, guarda il video, "Vantaggi di Managed Kubernetes" (03:14):

Red Hat® OpenShift® on IBM Cloud è un servizio completo che offre cluster OpenShift interamente gestiti sulla piattaforma IBM Cloud. (OpenShift è una piattaforma Kubernetes enterprise gestita su Red Hat Enterprise Linux).

Scopri di più su OpenShift nel nuovo report Forrester Wave: Multicloud Container Development Platforms (PDF, 415 KB).

Per iniziare, registrati per ottenere un IBMid e creare il tuo account IBM Cloud.