Cos'è Kubernetes? La tua prossima piattaforma applicativa

Kubernetes è una popolare piattaforma open source per l' orchestrazione di container , ovvero per la gestione di applicazioni basate su runtime multipli, in gran parte autonomi, chiamati container. I container sono diventati sempre più popolari da quando il progetto di containerizzazione Docker è stato lanciato nel 2013, ma le applicazioni containerizzate distribuite di grandi dimensioni possono diventare sempre più difficili da coordinare. Rendendo le applicazioni containerizzate notevolmente più facili da gestire su larga scala, Kubernetes è diventato una parte fondamentale della rivoluzione dei container.

Cos'è l'orchestrazione dei contenitori?

I contenitori supportano la separazione delle preoccupazioni simile a quella delle VM, ma con un sovraccarico molto inferiore e una flessibilità molto maggiore. Di conseguenza, i container hanno rimodellato il modo in cui le persone pensano allo sviluppo, alla distribuzione e alla manutenzione del software. In un'architettura containerizzata, i diversi servizi che costituiscono un'applicazione vengono impacchettati in contenitori separati e distribuiti su un cluster di macchine fisiche o virtuali. Ma questo fa sorgere la necessità di orchestrazione dei container, uno strumento che automatizza la distribuzione, la gestione, la scalabilità, il networking e la disponibilità delle applicazioni basate su container.

Cos'è Kubernetes?

Kubernetes è un progetto open source che è diventato uno degli strumenti di orchestrazione dei contenitori più popolari in circolazione; ti consente di distribuire e gestire applicazioni multi-container su larga scala. Sebbene in pratica Kubernetes sia più spesso utilizzato con Docker, la piattaforma di containerizzazione più popolare, può anche funzionare con qualsiasi sistema di container conforme agli standard OCI (Open Container Initiative) per i formati di immagine dei container e i runtime. E poiché Kubernetes è open source, con relativamente poche restrizioni su come può essere utilizzato, può essere utilizzato liberamente da chiunque desideri eseguire container, quasi ovunque vogliano eseguirli: on-premise, nel cloud pubblico o entrambi .

Google e Kubernetes

Kubernetes è nato come progetto all'interno di Google. È il successore di Google Borg, un precedente strumento di gestione dei container utilizzato internamente, sebbene non sia un discendente diretto. Google ha reso Kubernetes open source nel 2014, in parte perché le architetture di microservizi distribuiti che Kubernetes facilita facilitano l'esecuzione delle applicazioni nel cloud. Google vede l'adozione di container, microservizi e Kubernetes come potenziale guida dei clienti verso i suoi servizi cloud (sebbene Kubernetes funzioni certamente anche con Azure e AWS). Kubernetes è attualmente gestito dalla Cloud Native Computing Foundation, che è a sua volta sotto l'ombrello della Linux Foundation.

Kubernetes contro Docker e Kubernetes contro Docker Swarm

Kubernetes non sostituisce Docker, ma lo amplia. Tuttavia, kubernetes non sostituire alcune delle tecnologie di livello superiore che sono emerse intorno Docker.

Una di queste tecnologie è Docker Swarm, un orchestrator in bundle con Docker. È ancora possibile utilizzare Docker Swarm invece di Kubernetes, ma Docker Inc. ha scelto di rendere Kubernetes parte della Docker Community e delle edizioni Docker Enterprise in futuro.

Non che Kubernetes sia un sostituto immediato di Docker Swarm. Kubernetes è significativamente più complesso di Swarm e richiede più lavoro per la distribuzione. Ma ancora una volta, il lavoro è inteso a fornire un grande guadagno a lungo termine: un'infrastruttura applicativa più gestibile e resiliente. Per il lavoro di sviluppo e per i cluster di container più piccoli, Docker Swarm presenta una scelta più semplice. 

Kubernetes contro Mesos

Un altro progetto di cui potresti aver sentito parlare come concorrente di Kubernetes è Mesos. Mesos è un progetto Apache originariamente emerso dagli sviluppatori di Twitter; in realtà è stato visto come una risposta al progetto Google Borg.

Mesos offre infatti servizi di orchestrazione di container, ma le sue ambizioni vanno ben oltre: vuole essere una sorta di sistema operativo cloud in grado di coordinare componenti sia containerizzati che non containerizzati. A tal fine, molte piattaforme differenti possono essere eseguite all'interno di Mesos, incluso lo stesso Kubernetes.

Architettura Kubernetes: come funziona Kubernetes

L'architettura di Kubernetes fa uso di vari concetti e astrazioni. Alcuni di questi sono variazioni di nozioni esistenti e familiari, ma altri sono specifici di Kubernetes.

Cluster Kubernetes

L'astrazione Kubernetes di livello più alto, il cluster , si riferisce al gruppo di macchine che eseguono Kubernetes (a sua volta un'applicazione in cluster) e ai contenitori da essa gestiti. Un cluster Kubernetes deve avere un master , il sistema che comanda e controlla tutte le altre macchine Kubernetes nel cluster. Un cluster Kubernetes a disponibilità elevata replica le strutture del master su più macchine. Ma solo un master alla volta esegue il pianificatore lavori e il controller-manager.

Nodi e pod Kubernetes

Ogni cluster contiene nodi Kubernetes . I nodi potrebbero essere macchine fisiche o VM. Anche in questo caso, l'idea è l'astrazione: qualunque sia l'app in esecuzione, Kubernetes gestisce la distribuzione su quel substrato. Kubernetes consente anche di garantire che determinati contenitori vengano eseguiti solo su VM o solo su bare metal.

I nodi eseguono pod , gli oggetti Kubernetes più elementari che possono essere creati o gestiti. Ogni pod rappresenta una singola istanza di un'applicazione o di un processo in esecuzione in Kubernetes ed è costituito da uno o più contenitori. Kubernetes avvia, arresta e replica tutti i contenitori in un pod come gruppo. I pod mantengono l'attenzione dell'utente sull'applicazione, piuttosto che sui contenitori stessi. I dettagli su come configurare Kubernetes, dallo stato dei pod in su, sono conservati in Etcd , un archivio di valori-chiave distribuito.

I pod vengono creati e distrutti sui nodi secondo necessità per conformarsi allo stato desiderato specificato dall'utente nella definizione del pod. Kubernetes fornisce un'astrazione chiamata controller per gestire la logistica del modo in cui i pod vengono ruotati, distribuiti e ridotti. I controller sono disponibili in diversi gusti a seconda del tipo di applicazione gestita. Ad esempio, il controller "StatefulSet" introdotto di recente viene utilizzato per gestire applicazioni che richiedono uno stato persistente. Un altro tipo di controller, la distribuzione , viene utilizzato per ridimensionare un'app verso l'alto o verso il basso, aggiornare un'app a una nuova versione o ripristinare un'app a una versione nota in caso di problemi.

Servizi Kubernetes

Poiché i pod vivono e muoiono in base alle necessità, abbiamo bisogno di un'astrazione diversa per gestire il ciclo di vita dell'applicazione. Si suppone che un'applicazione sia un'entità persistente, anche quando i pod che eseguono i contenitori che compongono l'applicazione non sono essi stessi persistenti. A tal fine, Kubernetes fornisce un'astrazione chiamata servizio.

Un servizio in Kubernetes descrive come è possibile accedere a un determinato gruppo di pod (o altri oggetti Kubernetes) tramite la rete. Come afferma la documentazione di Kubernetes, i pod che costituiscono il back-end di un'applicazione potrebbero cambiare, ma il front-end non dovrebbe saperlo o tenerne traccia. I servizi lo rendono possibile.

Alcuni altri pezzi interni a Kubernetes completano il quadro. Lo scheduler distribuisce i carichi di lavoro ai nodi in modo che siano bilanciati tra le risorse e in modo che le distribuzioni soddisfino i requisiti delle definizioni dell'applicazione. Il controller manager assicura che lo stato del sistema (applicazioni, carichi di lavoro, ecc.) Corrisponda allo stato desiderato definito nelle impostazioni di configurazione di Etcd.

È importante tenere presente che nessuno dei meccanismi di basso livello utilizzati dai contenitori, come Docker stesso, viene sostituito da Kubernetes. Piuttosto, Kubernetes fornisce un set più ampio di astrazioni per l'utilizzo di questi meccanismi allo scopo di mantenere le app in esecuzione su larga scala.

Kubernetes Ingress

Si pensa che i servizi Kubernetes siano in esecuzione all'interno di un cluster. Ma vorrai essere in grado di accedere a questi servizi dal mondo esterno. Kubernetes ha diversi componenti che lo facilitano con vari gradi di semplicità e robustezza, inclusi NodePort e LoadBalancer, ma il componente con la maggiore flessibilità è Ingress. Ingress è un'API che gestisce l'accesso esterno ai servizi di un cluster, in genere tramite HTTP.

Ingress richiede un po 'di configurazione per essere impostato correttamente: Matthew Palmer, che ha scritto un libro sullo sviluppo di Kubernetes, ti guida attraverso il processo sul suo sito web.

Dashboard Kubernetes

Un componente Kubernetes che ti aiuta a tenere sotto controllo tutti questi altri componenti è Dashboard, un'interfaccia utente basata sul Web con cui puoi distribuire e risolvere i problemi delle app e gestire le risorse del cluster. Dashboard non è installato per impostazione predefinita, ma aggiungerlo non è un problema.

Video correlato: che cos'è Kubernetes?

In questo video di 90 secondi, scopri Kubernetes, il sistema open source per l'automazione di applicazioni containerizzate, da uno degli inventori della tecnologia, Joe Beda, fondatore e CTO di Heptio.

Vantaggi di Kubernetes

Poiché Kubernetes introduce nuove astrazioni e concetti e poiché la curva di apprendimento per Kubernetes è elevata, è normale chiedersi quali sono i vantaggi a lungo termine per l'utilizzo di Kubernetes. Ecco una carrellata di alcuni dei modi specifici in cui l'esecuzione di app all'interno di Kubernetes diventa più semplice.

Kubernetes gestisce l'integrità delle app, la replica, il bilanciamento del carico e l'allocazione delle risorse hardware per te

Uno dei compiti più basilari che Kubernetes ti toglie di mano è il faticoso lavoro di mantenere un'applicazione attiva, funzionante e rispondente alle richieste degli utenti. Le app che diventano "malsane" o non sono conformi alla definizione di salute che descrivi per loro, possono essere automaticamente sanate.

Un altro vantaggio offerto da Kubernetes è l'ottimizzazione dell'utilizzo delle risorse hardware, tra cui memoria, I / O di archiviazione e larghezza di banda di rete. Le applicazioni possono avere limiti flessibili e rigidi impostati sull'utilizzo delle risorse. Molte app che utilizzano risorse minime possono essere raccolte insieme sullo stesso hardware; le app che devono allungarsi possono essere collocate su sistemi in cui hanno spazio per crescere. Inoltre, è possibile automatizzare la distribuzione degli aggiornamenti in un cluster o il rollback se gli aggiornamenti si interrompono.

Kubernetes semplifica la distribuzione di applicazioni preconfigurate con i grafici Helm

I gestori di pacchetti come APT di Debian Linux e Pip di Python risparmiano agli utenti la fatica di installare e configurare manualmente un'applicazione. Ciò è particolarmente utile quando un'applicazione ha più dipendenze esterne.

Helm è essenzialmente un gestore di pacchetti per Kubernetes. Molte applicazioni software popolari devono essere eseguite in Kubernetes come un gruppo di contenitori interdipendenti. Helm fornisce un meccanismo di definizione, un "grafico", che descrive come eseguire un'applicazione o un servizio come gruppo di contenitori all'interno di Kubernetes.

Puoi creare i tuoi grafici Helm da zero e potresti doverlo fare se stai creando un'app personalizzata da distribuire internamente. Ma se stai usando un'applicazione popolare che ha un modello di distribuzione comune, ci sono buone probabilità che qualcuno abbia già composto un grafico Helm per esso e lo abbia pubblicato nel repository ufficiale dei grafici Helm. Un altro posto dove cercare i grafici Helm ufficiali è la directory Kubeapps.com.

Kubernetes semplifica la gestione di spazio di archiviazione, segreti e altre risorse relative alle applicazioni

I contenitori devono essere immutabili; qualunque cosa ci metti dentro non dovrebbe cambiare. Ma le applicazioni richiedono uno stato, il che significa che hanno bisogno di un modo affidabile per gestire i volumi di archiviazione esterni. Ciò è reso ancora più complicato dal modo in cui i contenitori vivono, muoiono e rinascono nel corso della vita di un'app.

Kubernetes fornisce astrazioni per consentire ai contenitori e alle app di gestire l'archiviazione nello stesso modo disaccoppiato delle altre risorse. È possibile accedere a molti tipi comuni di storage, dai volumi Amazon EBS alle vecchie condivisioni NFS, tramite i driver di storage Kubernetes, chiamati volumi. Normalmente, i volumi sono associati a un pod specifico, ma un sottotipo di volume chiamato "Volume persistente" può essere utilizzato per i dati che devono vivere indipendentemente da qualsiasi pod.

I contenitori spesso devono lavorare con "segreti": credenziali come chiavi API o password di servizio che non si desidera vengano codificate in un contenitore o nascoste apertamente su un volume del disco. Sebbene siano disponibili soluzioni di terze parti per questo, come Docker secrets e HashiCorp Vault, Kubernetes ha il proprio meccanismo per la gestione nativa dei segreti, sebbene debba essere configurato con cura. Ad esempio, Etcd deve essere configurato per utilizzare SSL / TLS durante l'invio di segreti tra i nodi, piuttosto che in testo normale. 

Le applicazioni Kubernetes possono essere eseguite in ambienti ibridi e multi-cloud

Uno dei sogni di lunga data del cloud computing è quello di essere in grado di eseguire qualsiasi app in qualsiasi cloud o in qualsiasi combinazione di cloud pubblici o privati. Questo non è solo per evitare il vendor lock-in, ma anche per sfruttare le funzionalità specifiche dei singoli cloud.

Kubernetes fornisce una serie di primitive, note collettivamente come federazione, per mantenere più cluster sincronizzati tra loro su più regioni e cloud. Ad esempio, una data distribuzione di app può essere mantenuta coerente tra più cluster e cluster diversi possono condividere l'individuazione del servizio in modo che sia possibile accedere a una risorsa di back-end da qualsiasi cluster. La federazione può anche essere utilizzata per creare distribuzioni Kubernetes a disponibilità elevata o a tolleranza di errore, indipendentemente dal fatto che si stia estendendo o meno su più ambienti cloud.

La federazione è ancora relativamente nuova per Kubernetes. Non tutte le risorse API sono ancora supportate nelle istanze federate e gli aggiornamenti non dispongono ancora dell'infrastruttura di test automatico. Ma queste carenze dovrebbero essere affrontate nelle future versioni di Kubernetes.

Dove trovare Kubernetes