Tutorial > Creare e gestire un Cluster Kubernetes in locale

Creare e gestire un Cluster Kubernetes in locale

Pubblicato il: 20 marzo 2021

cluster deployment docker kubernetes microservices minikube

Kubernetes Cluster in locale

Kubernetes è uno strumento open-source per la gestione e orchestrazione di applicazioni in Cloud distribuite all'interno di Container, tipicamente container Docker. In questa serie di tutorial conosceremo le componenti di un cluster K8s. Per ora continuiamo a effettuare le nostre operazioni in locale a scopo meramente dimostrativo. Creeremo quindi un cluster Kubernetes usando minikube. Nei prossimi capitoli porteremo il nostro cluster sul cloud.
 

Componenti di un cluster Kubernetes

Un cluster Kubernetes è formato da un insieme di nodi worker che eseguono applicazioni distribuite in Container. I nodi worker ospitano dei Pod, le cui esecuzioni vengono gestite dal Control Plane. L'esecuzione di Control Plane su più macchine garantisce elevate affidabilità, scalabilità e tolleranza ai guasti. La figura mostra una rappresentazione astratta di un cluster K8s con i suoi principali componenti.

Rappresentazione schematica di un cluster K8 ed i suoi principali componenti

Vediamo in dettaglio il significato dei componenti principali di un cluster.
 

Control Plane

I component del Control Plane sono quelli che hanno in carico la gestione dei nodi worker e possono essere eseguiti su qualsiasi host del cluster. Tipicamente sono eseguiti su macchine differenti rispetto ai Pod.

I componenti più importanti sono:
  • kube-apiserver: è il componente del control plane che espone le API Kubernetes, queste costituiscono l'interfaccia front-end del cluster;
  • etcd (storage): si tratta di uno storage ad elevate prestazioni basato su uno schema di dati del tipo chiave-valore;
  • kube-scheduler: è il componente che assegna i Pod appena creati a un nodo worker per essere eseguiti;
  • kube-controller-manager: è il componente del control plane che esegue i processi controller;
  • cloud-controller-manager: è il componente che incorpora la logica di controllo del cloud e permette al tuo cluster di connettersi alle API del tuo Cloud Provider.

Nodi Kubernetes

Alcuni componenti vengono eseguiti su tutti i nodi worker, questi forniscono l'ambiente di esecuzione di Kubernetes. Nello specifico sono: kubelet che si occupa del controllo dell'esecuzione dei Container all'interno dei Pod e kube-proxy che gestisce la comunicazione e il traffico tra i Pod del cluster.
 

Creare un cluster con Minikube

Minikube è la versione leggera di Kubernetes per l'utilizzo in locale. Naturalmente Kubernetes è concepito per essere adoperato in ambiente distribuito tuttavia, eseguire alcune operazioni in locale, può risultare utile per fare pratica. Una volta installato minikube e settato il driver di esecuzione in ambiente Virtual Box è possibile avviare un cluster Kubernets semplicemente da riga di comando come segue:
$ minikube start
Kubernetes fornisce allo sviluppatore anche una dashboard per il controllo del cluster. Per accedere alla dashboard eseguiamo:
$ minikube dashboard
Ora che abbiamo avviato il runtime possiamo comunicare con il nostro cluster tramite la command-line tool di Kubernets, kubectl. Adoperando kubectl è possibile effettuare il deployment di un'applicazione ed esporre i Pod su porte specifiche.
Qualora sia necessario avviare un secondo cluster è possibile farlo eseguendo:
$ minikube start -p cluster2
Ricordiamo che tutti i cluster su minikube vengono eseguiti in locale ovvero sulla macchina virtuale. Per fermare l'esecuzione del cluster adoperiamo il comando:
$ minikube stop
In alternativa possiamo mettere in pausa Kubernetes:
$ minikube pause
Per eliminare definitivamente il cluster, invece, è possibile digitare:
$ minikube delete
È nostra facoltà eliminare tutti i cluster inizializzati sulla macchina virtuale eseguendo:
$ minikube delete --all

Gestione dei cluster

Potremo gestire il cluster direttamente dalla kubectl, la command-line di Kubernetes. Vediamo principali comandi per interfacciarci con il cluster:
$ minikube start
 
Output:
* minikube v1.6.2 on Ubuntu 18.04
* Selecting 'none' driver from user configuration (alternates: [])
* Running on localhost (CPUs=2, Memory=2461MB, Disk=47990MB) ...
* OS release is Ubuntu 18.04.3 LTS
* Preparing Kubernetes v1.17.0 on Docker '18.09.7' ...
  - kubelet.resolv-conf=/run/systemd/resolve/resolv.conf
* Pulling images ...
* Launching Kubernetes ...
* Configuring local host environment ...
* Waiting for cluster to come online ...
* Done! kubectl is now configured to use "minikube"


Possiamo ottenere informazioni su di esso eseguendo:
$ kubectl cluster-info
 
Output: 
Kubernetes master is running at https://172.17.0.19:8443
KubeDNS is running at https://172.17.0.19:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

Per vedere invece quali sono i nodi del tuo cluster, eseguiamo:
$ kubectl get nodes
 
Output:
NAME       STATUS   ROLES    AGE     VERSION
minikube   Ready    master   2m55s   v1.17.0
 

Comandi base kubectl

La command-line viene utilizzata all'interno di minikube, una volta che è stato eseguito il comando:
$ minikube start

Kubectl fornisce un accesso diretto al cluster consentendo di interagire con esso tramite comandi, vediamo a seguire i più importanti.
 
Ottenere i Pod attivi sul cluster:
$ kubectl get pod
Ottenere la descrizione di uno specifico Pod:
$ kubectl describe nomePod
Esporre un Pod all'esterno, su una specifica porta:
$ kubectl expose <nome> <identificatore> [--port = porta] [-target-port = container-port] [-type = service-type]
Ottenere l'accesso a Pod remoti, specificando la porta locale e il nome del Pod:
$ kubectl port-forware <nome pod> [LOCAL_PORT][REMOTE_PORT]
Ottenere i log memorizzati all'interno di un container:
$ kubectl attach <nome pod> -c <container>
Eseguire un commando all'interno di un container:
$ kubectl exec -it <nome pod> -c [container] -COMMAND [argomenti...]
Aggiornare la label di un Pod:
$ kubectl label [--overwrite] <type> KEY_1 = VAL_1
Creare un Pod direttamente da un'immagine (non da un file YAML):
$ kubectl run <nome> --image = image
 

Prossimamente

In questo capitolo della serie abbiamo introdotto l'utilizzo dei cluster Kubernetes con minikube e kubectl. Per completare l'apprendimento delle tecniche di utilizzo generale Kubernetes sfrutteremo la Cloud al fine di sperimentare il rilascio e la gestione di applicazioni. Nel prossimo capitolo vedremo quindi cosa si intende per deployment e come effettuare un deploying su cluster Kubernetes.