Introduzione

Kubernetes è uno strumento per la gestione di contenitori gratuito e open source. Viene utilizzato per distribuire automaticamente applicazioni basate su container in ambiente cluster, oltre a essere utilizzato anche per gestire i contenitori Docker attraverso gli host del cluster kubernetes. Kubernetes è anche conosciuto come K8s.

In questa guida configureremo il cluster Kubernetes il più semplice possibile composto da due nodi. Il primo nodo con hostname kubernetes-master fungerà da nodo principale.

Il secondo nodo, con hostname kubernetes-slave eseguirà anche Ubuntu 18.04 sarà un nodo slave che si unirà semplicemente al cluster di Kuberneets. Una volta ottenuto il cluster Kubernetes attivo e funzionante verrà implementato un contenitore del server Nginx.

Se il vostro intento è installare Kubernetes su di un server in remoto continuate a leggere, altrimenti se volete installare Kubernetes sul vostro computer locale saltate il primo paragrafo "Connessione al Server" e leggere il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno della password per l'autenticazione.

Per connettersi al server come utente root digitare questo comando:
ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare il primo parametro:
ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

Siete ora connessi al vostro server, siete pronti per iniziare l'installazione di Kubernetes su Ubuntu 18.04 LTS.

Installare Docker

Installare Docker su entrambi i server Ubuntu, quindi sia sul kubernetes-master che sul kubernetes-slave.
Docker è presente nei repository ufficiale di Ubuntu.

Aggiornare la lista dei pacchetti di Ubuntu:
sudo apt-get update

Per installare Docker ci basterà digitare da terminale:
sudo apt install docker.io

Una volta installato, assicurarsi che sia abilitato l'avvio automatico dopo un riavvio del server:
sudo systemctl enable docker

Installare Kubernetes

Ancora una volta abbiamo bisogno di installare Kubernetes su tutti i nodi. Eseguire quindi i comandi seguenti su entrambi i server (master e slave) per installare Kubernetes:

Aggiungere la chiave di firma di Kubernetes:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add

Aggiungere il repository necessario per scaricare Kubernetes:
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

Installare kudeadm:
sudo apt install kubeadm

Kubernetes non funzionerà se il tuo sistema utilizza la memoria di swap, quindi è necessario disabilitare la memoria di scambio su tutti i tuoi nodi (master e slave):
sudo swapoff -a

Assicurarsi che tutti i nodi abbiano un nome host univoco. Quindi, impostare l'hostname ad entrambi i nodi.
Il nodo principale con hostname kubernetes-master:
sudo hostnamectl set-hostname kubernetes-master

Il nodo secondario con hostname kubernetes-slave
sudo hostnamectl set-hostname kubernetes-slave

Refresh di bash:
exec bash

Importate è impostare correttamente la data e l'orario su tutti i nodi, altrimenti potrebbero riscontrarsi dei problemi con i certificati TLS.

Configurare Kubernetes-master

Ora siamo pronti per inizializzare il nodo master di Kubernetes. Per fare ciò, eseguite il seguente comando sul vostro nodo principale:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Attenzione: sono richieste almeno 2 CPU per inizializzare il nodo principale, se non si dispone di 2 CPU, è possibile aggiungere il flag --ignore-preflight-errors=NumCPU per procedere senza errori. Da non utilizzare su un server in produzione, ma solo per test.

Quindi:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU

Attenzione: copiare l'ultima parte del messaggio di ouput dell'inizializzazione del nodo master di Kubernetes, in quanto è presente un comando necessario un secondo momento per accedere dal nodo slave di Kubernetes.

Eseguire questi comandi suggeriti dall'inizializzazione di Kubernetes utilizzando un utente non root con privilegi sudo:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Il prossimo passo è implementare una rete pod. La rete pod viene utilizzata per la comunicazione tra i nodi all'interno del cluster Kubernetes. Per questo useremo la rete di pod Flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Usare il seguente comando per confermare lo stato:
kubectl get pods --all-namespaces

Configurare Kubernetes-slave

Adesso possiamo connetterci con il nodo slave al cluster di Kubernetes. Utilizzare il comando kubeadm join copiato precedentemente dall'output di inizializzazione di kubernetes-master:
Attenzione: non copiare il seguente codice di esempio, non funzionerebbe sul vostro server.
sudo kubeadm join 10.1.1.9:6443 --token qdjnpd.5glu39uxr92xarsj --discovery-token-ca-cert-hash sha256:ed0684156c718caf425ceae6c85a56c05f7b49037cde3a2f1fd57430a4f58f89

Potrebbero volerci diversi minuti.

Sul nodo principale Kubernetes-master dare il seguente comando per confermare la connessione con il nodo kubernetes-slave:
kubectl get nodes

Distribuire un servizio sul cluster Kubernetes

Per verificare l'implementazione è possibile utilizzare Nginx nel cluster di Kubernetes.
Eseguire questi comandi dal nodo principale, kubernetes-master:
kubectl run nginx --image=nginx --port 80
kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort

Ora dovreste visualizzare un nuovo contenitore docker di Nginx nel nodo secondario, slave:
sudo docker ps

Per confermare che il servizio Nginx è attivo e in esecuzione, elencare tutti i servizi disponibili sul nodo master e usare il comando curl per eseguire una richiesta HTTP sull'IP del cluster:
kubectl get svc

Dovreste ricevere un messaggio di output simile al seguente:

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        5m52s
nginx        NodePort    10.103.44.31   <none>        80:new_nginx_port/TCP   2m50s

Per verificare che tutto funzioni, connettersi all'indirizzo IP del nodo secondario, kubernetes-slave, utilizzando la porta visualizzata nell'ouput precedente. Dovreste visualizzare la pagina di benvenuto di Nginx:

http://INDIRIZZO_IP_NODO_SLAVE:new_nginx_port

Se si desidera rimuovere l'applicazione Nginx, eliminare innanzitutto il servizio Nginx dal nodo principale:
kubectl delete service nginx

Per assicurare l'eliminazione del servizio, dare il seguente comando:
kubectl get services

Dovreste ricevere un messaggio di output simile al seguente:

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   9m59s

Quindi per eliminare la distribuzione Nginx:
kubectl delete deployment nginx

Comando di conferma:
kubectl get deployments

Dovreste ricevere un messaggio di output simile al seguente:

No resources found.

L'installazione e la configurazione di Kubernetes su Ubuntu 18.04 LTS è terminata