Tutorial > Introduzione a Kubernetes

Introduzione a Kubernetes

Introduzione

Nel Cloud Computing virtualizzare le applicazioni è una pratica fondamentale per distribuire prodotti scalabili e affidabili. Virtualizzare un’applicazione significa modularizzare il codice e dividerlo in microservizi distribuiti che andranno inseriti all’interno di Container. I Container sono moduli standard per la virtualizzazione del codice. Il servizio open-source leader nella containerizzazione è Docker. Tipicamente una singola applicazione viene deployata (rilasciata) all’interno di un Container su un server cloud. Un’applicazione in produzione ha spesso la necessità di essere replicata su più host, per questo motivo si devono predisporre più Container. Abbiamo quindi bisogno di un componente efficiente che si occupi di connettere, avviare, scalare e gestire tutti i Container e di distribuire il carico tra i diversi host.

Vantaggi e utilizzo generale di Kubernetes

Kubernetes permette di ottimizzare lo sviluppo di applicazioni distribuite ad alta scalabilità, tipicamente Cloud, garantendo la disponibilità di un numero opportuno di Container per supportare i carichi di lavoro richiesti. Quando ci troviamo in un ambiente distribuito con molti Container la complessità di tutte le operazioni aumenta significativamente. Niente panico, K8s garantisce l’orchestrazione e la gestione necessarie a distribuire i Container in maniera scalabile e automatica. Permette, anche, di amministrare la sicurezza dei container su più livelli e di programmare la distribuzione del carico. Possiamo riassumere gli utilizzi di Kubernetes come segue:
  • Orchestrazione di Container su host multipli;
  • Gestione della scalabilità delle applicazioni su Container;
  • Ottimizzare l’utilizzo delle risorse hardware;
  • Automatizzare il deployment e l’aggiornamento delle applicazioni;
  • Monitorare lo stato di integrità e la sicurezza delle applicazioni;
  • Gestire automaticamente il posizionamento e la replicazione delle applicazioni.
Dati i suoi principali utilizzi, i vantaggi che si ottengono dall’adottare Kubernetes all’interno delle soluzioni cloud sono evidenti. È inoltre possibile citare altre caratteristiche che rendono K8s estremamente interessante e che motivano la sua notevole diffusione:
  • Auto-scaling: Kubernetes è in grado di scalare automaticamente, regolando la dimensione dei cluster sulla base della domanda e di altre metriche di utilizzazione;
  • Ampia community open-source: gli sviluppatori possono contare su una vasta comunità per risolvere problemi implementativi, oltre che per ricevere formazione continua da parte dei vendor che hanno aderito al progetto CNCF;
  • Supporto per i cloud provider: Kubernetes può essere integrato come servizio in architetture implementate sugli ecosistemi cloud più noti;
  • Kubernetes funziona poggiando sulla quasi totalità dei sistemi operativi, device e data center attuali.

Minikube

Prima di addentrarci nei dettagli riguardanti la struttura e l’architettura di Kubernetes in Cloud presentiamo quindi una versione di K8s più semplice e leggera con cui poter fare pratica in locale: Minikube. Quest’ultimo è per l’appunto ideale se adoperato in locale ovvero per iniziare ad apprendere e utilizzare Kubernetes senza la complessità aggiuntiva del livello cloud. Minikube fornisce, infatti, tutti i componenti di K8s in un’unica installazione che può essere avviata all’interno di una macchina virtuale.

Setup di Minikube

Per iniziare a lavorare con Minikube necessitiamo di una macchina virtuale. Iniziamo, quindi, con l’installare VirtualBox, che fungerà da hypervisor. Dopodiché installeremo la Command-Line di Kubernetes, kubectl. A questo punto sarà possibile avviare Minikube connettendoci alla kubectl.

Installazione di VirtualBox

Andiamo alla url: https://www.virtualbox.org/wiki/Downloads (si apre in una nuova finestra) e scarichiamo la versione di VirtualBox compatibile con il nostro sistema operativo. Seguiamo le istruzioni e installiamo il VBox sulla nostra macchina. Kubectl è il command-line tool di K8s. Seguaimo le istruzioni per l’installazione sul nostro sistema operativo.

Kubectl per Ubuntu Linux

Digitiamo i seguenti comandi sul terminale per installare kubectl direttamente tramite apt-get:
$ sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
$ sudo apt-get install -y kubectl

Kubectl per MacOS

Usiamo il gestore di pacchetti Homebrew per installare kubectl su Mac. Se non disponiamo ancora di Homebrew, possiamo scaricarlo da riga di comando tramite:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Una volta installato Homebrew, installiamo kubectl sempre da riga di comando:
brew install kubectl
In alternativa, possiamo installare kubectl senza usare Homebrew, scaricando direttamente il pacchetto:
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl.sha256"
Rendiamo il file eseguibile:
chmod +x ./kubectl
Spostiamo l’eseguibile in una posizione all’interno del PATH di sistema, ad esempio:
sudo mv ./kubectl /usr/local/bin/kubectl && sudo chown root: /usr/local/bin/kubectl
Quindi verifichiamo l’avvenuta installazione di kubectl:
kubectl version --client
L’output sarà del tipo:
Client Version: version.Info{Major:"1", Minor:"20",
GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean",
BuildDate:"2021-01-13T13:28:09Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"darwin/amd64"}

Kubectl per Windows

Possiamo scaricare il gestore di pacchetti Chocolatery per installare direttamente kubectl sul nostro pc, quando questi è disponibile eseguiamo il comando seguente sul terminale:
choco install kubernetes-cli

Installazione di minikube

A questo punto possiamo procedere con l’istallazione di minikube.

Minicube per Linux

Scarichiamo l’eseguibile da terminale:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
Installiamo minikube:
sudo install minikube-linux-amd64 /usr/local/bin/minikube

Minikube per MacOs

Installiamo anche minikube direttamente da Homebrew:
brew install minikube

Minikube per Windows

Possiamo scaricare minikube usando Chocolatery:
choco install minikube

Avvio di minikube

Infine, per iniziare a costruire un cluster, avviamo minikube in locale usando VirtualBox come come hypervisor. A livello esemplificativo, su Linux:
$ minikube start --driver=virtualbox

Per gli utilizzi futuri, possiamo anche settare VBox come driver predefinito per minikube eseguendo:
$ minikube config set driver virtualbox

Architettura di Kubernetes

Un cluster Kubernetes è formato da un insieme di nodi worker organizzati secondo un pattern orchestrator. Il componente che gestisce i nodi worker del cluster è il Kubernetes Master, che si interfaccia direttamente con lo sviluppatore. Il nodo master di Kubernetes riceve i comandi dal DevOps e li invia ai nodi worker. I nodi worker, nei quali sono deployati i Container, vengono raggruppati da Kubernetes in Pod. I Pod costituiscono un livello di astrazione più alto e costituiscono le unità di elaborazione elementare di K8s, eseguibili su un qualsiasi nodo del cluster. Un Pod raggruppa più container che condividono le stesse risorse e che vengono eseguiti sullo stesso nodo. I Pod possono essere gestiti tramite le Kubernetes API o, più solitamente, tramite il controller di K8s, ovvero il Control Plane. Nella figura sottostante è possibile osservare lo schema di un generico cluster Kubernetes. Schema di un cluster Kubernetes
La parte bassa dell’architettura è composta dai nodi worker, dove vengono distribuiti i microservizi in container (es. Docker), i quali vengono a loro volta deployati nei Pod. Un Pod può essere replicato più volte su più nodi del cluster per mantenere una buona tolleranza ai guasti. Sui nodi worker si eseguono anche altri componenti software, fra essi il Kubelet che riceve le direttive del Master e stabilisce come distribuire i microservizi nei vari Pod, e il Kube-proxy, che espone all’esterno le porte di accesso ai Pod. Nei prossimi capitoli di questa serie di tutorial analizzeremo più in dettaglio Kubernetes e vedremo come effettuare il deploy di un’applicazione cloud-based.