Esercizio: Esplorare le funzionalità di un cluster Kubernetes
Quando si esegue Kubernetes in locale, sono disponibili diverse opzioni. È possibile installare Kubernetes in computer fisici o macchine virtuali oppure usare una soluzione basata sul cloud, ad esempio il servizio Azure Kubernetes.
L'obiettivo di questo esercizio è esplorare un'installazione di Kubernetes ed esplorare un cluster a nodo singolo. In questo esercizio si apprenderà come configurare e installare un ambiente MicroK8s facile da configurare e rimuovere. Si distribuirà quindi un servizio Kubernetes e si aumenterà il rispettivo numero di istanze per ospitare un sito Web.
Nota
Questo esercizio è facoltativo e include i passaggi che illustrano come eliminare e disinstallare il software e le risorse da usare nell'esercizio.
Tenere presente che sono disponibili altre opzioni, ad esempio MiniKube, e il supporto di Kubernetes in Docker, per eseguire la stessa operazione.
Informazioni su MicroK8s
MicroK8s è un'opzione per la distribuzione di un cluster Kubernetes a nodo singolo come singolo pacchetto nelle workstation di destinazione e nei dispositivi IoT (Internet delle cose). Canonical, la società che ha creato Ubuntu Linux, in origine ha sviluppato MicroK8s e continua a gestirlo.
È possibile installare MicroK8s in Linux, Windows e macOS. Tuttavia, le istruzioni di installazione sono leggermente diverse per ogni sistema operativo. Scegliere l'opzione più adatta all'ambiente in uso.
Installare MicroK8s in Linux
L'installazione in Linux di MicroK8s è l'opzione di installazione con il minor numero di passaggi. Passare a una finestra del terminale ed eseguire i comandi delle istruzioni seguenti:
Installare l'app snap MicroK8s. Il completamento di questo passaggio potrebbe richiedere alcuni minuti, a seconda della velocità della connessione Internet e del desktop.
sudo snap install microk8s --classic
Se l'installazione viene eseguita correttamente, viene visualizzato il messaggio seguente.
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
A questo punto è possibile installare i componenti aggiuntivi nel cluster.
Installare MicroK8s in Windows
Per eseguire MicroK8s in Windows, usare MultiPASS. MultiPASS è un sistema di gestione di macchine virtuali leggero per Linux, Windows e macOS.
Scaricare e installare la versione più recente di MultiPASS per Windows da GitHub.
In una console dei comandi eseguire il comando launch di MultiPASS per configurare ed eseguire l'immagine microk8s-vm. Il completamento di questo passaggio potrebbe richiedere alcuni minuti, a seconda della velocità della connessione Internet e del desktop.
multipass launch --name microk8s-vm --memory 4G --disk 40G
Dopo aver ricevuto la conferma di avvio per microk8s-vm, eseguire il comando
multipass shell microk8s-vm
per accedere all'istanza della macchina virtuale.multipass shell microk8s-vm
Quando MultiPASS funziona, è possibile accedere alla macchina virtuale Ubuntu per ospitare il cluster e installare MicroK8s.
Installare l'app snap MicroK8s. Il completamento di questo passaggio potrebbe richiedere alcuni minuti, a seconda della velocità della connessione Internet e del desktop.
sudo snap install microk8s --classic
Se l'installazione viene eseguita correttamente, viene visualizzato il messaggio seguente:
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
A questo punto è possibile installare i componenti aggiuntivi nel cluster.
Installare MicroK8s in macOS
Per eseguire MicroK8s in macOS, usare MultiPASS. MultiPASS è un sistema di gestione di macchine virtuali leggero per Linux, Windows e macOS.
Sono disponibili due opzioni per installare MultiPASS in macOS. Scaricare e installare la versione più recente di MultiPASS per macOS da GitHub oppure usare Homebrew per installare MultiPASS con il comando
brew cask install multipass
.brew install --cask multipass
In una console dei comandi eseguire il comando launch di MultiPASS per configurare ed eseguire l'immagine microk8s-vm. Il completamento di questo passaggio potrebbe richiedere alcuni minuti, a seconda della velocità della connessione Internet e del desktop.
multipass launch --name microk8s-vm --memory 4G --disk 40G
Dopo aver ricevuto la conferma di avvio per microk8s-vm, eseguire il comando
multipass shell microk8s-vm
per accedere all'istanza della macchina virtuale.multipass shell microk8s-vm
A questo punto, è possibile accedere alla macchina virtuale Ubuntu che ospiterà il cluster. MicroK8s deve ancora essere installato. Effettuare i passaggi seguenti.
Installare l'app snap MicroK8s. Il completamento di questo passaggio potrebbe richiedere alcuni minuti, a seconda della velocità della connessione Internet e del desktop.
sudo snap install microk8s --classic
Se l'installazione viene eseguita correttamente, viene visualizzato il messaggio seguente:
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
A questo punto è possibile installare i componenti aggiuntivi nel cluster.
Preparare il cluster
È possibile usare il comando status in MicroK8s per visualizzare lo stato dei componenti aggiuntivi installati nel cluster. Questi componenti aggiuntivi offrono diversi servizi, alcuni dei quali sono stati descritti in precedenza. Un esempio è la funzionalità DNS.
Per controllare lo stato dell'installazione, eseguire il comando
microk8s.status --wait-ready
.sudo microk8s.status --wait-ready
Si noti che nel cluster sono presenti diversi componenti aggiuntivi disabilitati. Non preoccuparsi dei componenti aggiuntivi che non vengono riconosciuti.
microk8s is running addons: cilium: disabled dashboard: disabled dns: disabled fluentd: disabled gpu: disabled helm3: disabled helm: disabled ingress: disabled istio: disabled jaeger: disabled juju: disabled knative: disabled kubeflow: disabled linkerd: disabled metallb: disabled metrics-server: disabled prometheus: disabled rbac: disabled registry: disabled storage: disabled
Dall'elenco è necessario abilitare i componenti aggiuntivi DNS, Dashboard e Registro. Di seguito sono riportati gli scopi di ogni componente aggiuntivo:
Componenti aggiuntivi Scopo DNS Distribuisce il servizio coreDNS
.Dashboard Distribuisce il servizio kubernetes-dashboard
e molti altri servizi che ne supportano la funzionalità. È un'interfaccia utente basata sul Web per utilizzo generico per i cluster Kubernetes.Registro Distribuisce un registro privato e diversi servizi che ne supportano la funzionalità. Usare questo registro per archiviare i contenitori privati. Per installare i componenti aggiuntivi, eseguire il comando seguente.
sudo microk8s.enable dns dashboard registry
A questo punto è possibile accedere al cluster usando kubectl
.
Esplorare il cluster Kubernetes
MicroK8s offre una versione di kubectl
che è possibile usare per interagire con il nuovo cluster Kubernetes. Questa copia di kubectl
consente di eseguire un'installazione parallela di un'altra istanza di kubectl
a livello di sistema senza alcun effetto sulle funzionalità.
Eseguire il comando
snap alias
per eseguire l'alias dimicrok8s.kubectl
inkubectl
. Questo passaggio semplifica l'utilizzo.sudo snap alias microk8s.kubectl kubectl
Dopo l'esecuzione corretta del comando viene visualizzato l'output seguente:
Added: - microk8s.kubectl as kubectl
Visualizzare le informazioni sui nodi del cluster
Come si è visto in precedenza, un cluster Kubernetes esiste all'esterno dei piani di controllo e dei nodi di lavoro. Si analizzerà il nuovo cluster per verificare gli elementi installati.
Controllare i nodi in esecuzione nel cluster.
Poiché MicroK8s è un'installazione cluster a nodo singolo, si prevede di visualizzare un solo nodo. Tenere presente, tuttavia, che questo nodo rappresenta sia il piano di controllo che un nodo di lavoro nel cluster. Confermare questa configurazione eseguendo il comando
kubectl get nodes
. È possibile usare il comandokubectl get
per recuperare informazioni su tutte le risorse nel cluster:sudo kubectl get nodes
Il risultato sarà simile all'esempio seguente che mostra che è presente un solo nodo nel cluster con il nome microk8s-vm. Si noti che lo stato del nodo è Ready. Lo stato Ready indica che il piano di controllo potrebbe pianificare i carichi di lavoro in questo nodo.
NAME STATUS ROLES AGE VERSION microk8s-vm Ready <none> 35m v1.17.3
È possibile ottenere altre informazioni per la risorsa specifica richiesta. Si supponga, ad esempio, di dover trovare l'indirizzo IP del nodo. Usare il parametro
-o wide
per recuperare informazioni aggiuntive dal server API:sudo kubectl get nodes -o wide
Il risultato è simile all'esempio seguente. Si noti che ora è possibile visualizzare l'indirizzo IP interno del nodo, il sistema operativo in esecuzione nel nodo, la versione del Kernel e il runtime del contenitore.
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME microk8s-vm Ready <none> 36m v1.17.3 192.168.56.132 <none> Ubuntu 18.04.4 LTS 4.15.0-88-generic containerd://1.2.5
Il passaggio successivo consiste nell'esplorare i servizi in esecuzione nel cluster. Come per i nodi, eseguire il comando
kubectl get
per trovare informazioni sui servizi in esecuzione nel cluster.sudo kubectl get services -o wide
Il risultato è simile all'esempio seguente, ma si noti che è elencato solo un servizio. Questi componenti aggiuntivi sono stati installati precedentemente nel cluster, quindi si suppone di visualizzare anche questi servizi.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 37m <none>
Il motivo per cui è elencato il singolo servizio è che Kubernetes usa un concetto denominato spazi dei nomi per dividere logicamente un cluster in più cluster virtuali.
Passare il parametro
--all-namespaces
per recuperare tutti i servizi in tutti gli spazi dei nomi:sudo kubectl get services -o wide --all-namespaces
Il risultato è simile all'esempio seguente. Si noti che nel cluster sono presenti tre spazi dei nomi. Si tratta degli spazi dei nomi default,
container-registry
ekube-system
. Vengono visualizzate le istanze diregistry
,kube-dns
ekubernetes-dashboard
installate. Sono inoltre disponibili servizi di supporto installati insieme ad alcuni componenti aggiuntivi.NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR container-registry registry NodePort 10.152.183.36 <none> 5000:32000/TCP 28m app=registry default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 37m <none> kube-system dashboard-metrics-scraper ClusterIP 10.152.183.130 <none> 8000/TCP 28m k8s-app=dashboard-metrics-scraper kube-system heapster ClusterIP 10.152.183.115 <none> 80/TCP 28m k8s-app=heapster kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 28m k8s-app=kube-dns kube-system kubernetes-dashboard ClusterIP 10.152.183.132 <none> 443/TCP 28m k8s-app=kubernetes-dashboard kube-system monitoring-grafana ClusterIP 10.152.183.88 <none> 80/TCP 28m k8s-app=influxGrafana kube-system monitoring-influxdb ClusterIP 10.152.183.232 <none> 8083/TCP,8086/TCP 28m k8s-app=influxGrafana
Ora che è possibile visualizzare i servizi in esecuzione nel cluster, è possibile pianificare un carico di lavoro nel nodo di lavoro.
Installare un server Web in un cluster
Si vuole pianificare un server Web nel cluster per offrire un sito Web ai clienti. È possibile scegliere tra diverse opzioni. Per questo esempio si userà NGINX.
Come affermato in precedenza, è possibile usare i file manifesto dei pod per descrivere i pod, i set di repliche e le distribuzioni per definire i carichi di lavoro. Poiché i file non sono stati descritti in dettaglio, si esegue kubectl
per passare direttamente le informazioni al server API.
Anche se kubectl
è utile, è consigliabile usare i file manifesto. I file manifesto consentono di eseguire facilmente il roll forward e il rollback delle distribuzioni nel cluster. Questi file consentono anche di documentare la configurazione di un cluster.
Eseguire il comando
kubectl create deployment
per creare la distribuzione di NGINX. Specificare il nome della distribuzione e l'immagine del contenitore per creare una singola istanza del pod.sudo kubectl create deployment nginx --image=nginx
Il risultato è simile all'esempio seguente:
deployment.apps/nginx created
Eseguire
kubectl get deployments
per recuperare le informazioni sulla distribuzione:sudo kubectl get deployments
Il risultato è simile all'esempio seguente. Si noti che il nome della distribuzione corrisponde al nome assegnato e che una distribuzione con questo nome ha lo stato pronto ed è disponibile.
NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 18s
La distribuzione ha creato un pod. Eseguire il comando
kubectl get pods
per recuperare informazioni sui pod del cluster:sudo kubectl get pods
Il risultato è simile all'esempio seguente. Si noti che il nome del pod è un valore generato preceduto dal nome della distribuzione, mentre lo stato del pod è Running (In esecuzione).
NAME READY STATUS RESTARTS AGE nginx-86c57db685-dj6lz 1/1 Running 0 33s
Testare l'installazione del sito Web
Testare l'installazione di NGINX connettendosi al server Web tramite l'indirizzo IP del pod.
Passare il parametro
-o wide
per trovare l'indirizzo del pod:sudo kubectl get pods -o wide
Il risultato è simile all'esempio seguente. Si noti che il comando restituisce sia l'indirizzo IP del nodo che il nome del nodo in cui è pianificato il carico di lavoro.
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-86c57db685-dj6lz 1/1 Running 0 4m17s 10.1.83.10 microk8s-vm <none> <none>
Per accedere al sito Web, eseguire
wget
nell'indirizzo IP elencato prima:wget <POD_IP>
Il risultato è simile all'esempio seguente:
--2020-03-16 13:34:17-- http://10.1.83.10/ Connecting to 10.1.83.10:80... connected. HTTP request sent, awaiting response... 200 OK Length: 612 [text/html] Saving to: 'index.html' index.html 100%[==============================================================================================>] 612 --.-KB/s in 0s 2020-03-16 13:34:17 (150 MB/s) - 'index.html' saved [612/612]
Ridimensionare la distribuzione di un server Web in un cluster
Si supponga di osservare improvvisamente un aumento degli utenti che accedono al sito Web e che inizino a verificarsi problemi nel sito Web a causa del carico. È possibile distribuire più istanze del sito nel cluster e suddividere il carico tra le istanze.
Eseguire il comando kubectl scale
per ridimensionare il numero di repliche nella distribuzione. Specificare il numero di repliche necessarie e il nome della distribuzione.
Eseguire il comando
kubectl scale
per aumentare il numero totale di pod NGINX a tre:sudo kubectl scale --replicas=3 deployments/nginx
Il risultato è simile all'esempio seguente:
deployment.apps/nginx scaled
Il comando scale consente di ridimensionare il numero di istanze.
Per controllare il numero di pod in esecuzione, eseguire il comando
kubectl get
e passare di nuovo il parametro-o wide
:sudo kubectl get pods -o wide
Il risultato è simile all'esempio seguente. Si noti che ora vengono visualizzati tre pod in esecuzione, ognuno con un indirizzo IP univoco.
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-86c57db685-dj6lz 1/1 Running 0 7m57s 10.1.83.10 microk8s-vm <none> <none> nginx-86c57db685-lzrwp 1/1 Running 0 9s 10.1.83.12 microk8s-vm <none> <none> nginx-86c57db685-m7vdd 1/1 Running 0 9s 10.1.83.11 microk8s-vm <none> <none> ubuntu@microk8s-vm:~$
Sarebbe necessario applicare diverse configurazioni aggiuntive al cluster per esporre efficacemente il sito Web come sito Web pubblico. Tra gli esempi sono inclusi l'installazione di un servizio di bilanciamento del carico e il mapping degli indirizzi IP del nodo. Questo tipo di configurazione fa parte degli aspetti avanzati che verranno descritti più avanti. Nel riepilogo sono disponibili istruzioni necessarie se si sceglie di disinstallare e pulire la macchina virtuale.