Esercizio: Esplorare le funzionalità di un cluster Kubernetes

Completato

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:

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

  1. Scaricare e installare la versione più recente di MultiPASS per Windows da GitHub.

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

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

  1. 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
    
  2. 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
    
  3. 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.

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

  1. 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
    
  2. 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à.

  1. Eseguire il comando snap alias per eseguire l'alias di microk8s.kubectl in kubectl. 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.

  1. 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 comando kubectl 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
    
  2. 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 e kube-system. Vengono visualizzate le istanze di registry, kube-dns e kubernetes-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.

  1. 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
    
  2. 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
    
  3. 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.

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

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

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