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.
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.