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