Raspberry Pi — Installare Docker e Kubernetes

Andrea Scanzani
Architetture Digitali
7 min readNov 26, 2020
Photo by CHUTTERSNAP on Unsplash

Raspberry Pi nasce come un single-board computer per progetti hobbystici, ma negli ultimi anni molte aziende importanti hanno effettuato il porting dei loro prodotti a livello Enterprise anche su tecnologia ARM del Raspberry Pi; specialmente per progetti di IoT (Internet of Things).

In questa guida andremo a vedere come è possibile installare Docker e Kubernetes sul nostro Raspberry Pi. A questo scopo è consigliabile essere in possesso del modello Raspberry Pi 4 Model B con 4 o 8Gb RAM.

Installazione di Docker

Docker

Docker è una piattaforma software che semplifica il processo di deployment , e del loro ciclo di vita, delle applicazioni sviluppate. Docker fornisce le applicazioni in unità che sono chiamate container. A tutti gli effetti fornisce una virtualizzazione dell’applicazioni con tutto il necessario per la loro corretta esecuzione (librerie, spazio disco, networking, etc..).

Ogni container presete su Docker è isolato, indipendente dagli altri, e portabile su qualsiasi installazione di Docker (qualunque sia il Sistema Operativo ospitante).

Di seguito riportiamo un’illustrazione di come è composto Docker e la differenza rispetto a delle Macchine Virtuali:

Container vs Macchine Virtuali
Container vs Macchine Virtuali

Per installare Docker sul nostro Raspberry Pi, possiamo eseguire l’installatore automatico messo a disposizione dall’azienda:

curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh

Una volta eseguiti i comandi avremo Docker installato sul nostro RPi con architettura ARM a 64Bit.

Andiamo ad aggiungere il nostro utente al gruppo linux “docker” per eseguire i comandi e procedere con la verifica dell’installazione:

sudo usermod -aG docker MIOUTENTEsu - MIOUTENTE

Verifichiamo quale sia la versione di Docker installata con il comando:

docker --version

Ed eseguiamo il nostro primo container:

docker run hello-world

ed avremo un output a console simile a questo:

Hello Docker!
Hello from Docker!

Per stoppare e riavviare Docker i comandi sono:

systemctl stop dockersystemctl status dockersystemctl start docker

La nostra installazione di Docker è completata! Rimandiamo alla documentazione ufficiale per un approfondimento dei comandi.

Kubernetes — Introduzione

Kubernetes logo

Kubernetes è un sistema open-source che permette di orchestrare i container e semplificare la loro gestione. Inizialmente è stato sviluppato da Google, e funziona con molti sistemi di containerizzazione, compreso il più famoso che è appunto Docker.

Come riporta la Documentazione ufficiale, l’uso di Kubernetes comporta molti vantaggi:

Scoperta dei servizi e bilanciamento del carico Kubernetes può esporre un container usando un nome DNS o il suo indirizzo IP. Se il traffico verso un container è alto, Kubernetes è in grado di distribuire il traffico su più container in modo che il servizio rimanga stabile.

Orchestrazione dello storage Kubernetes ti permette di montare automaticamente un sistema di archiviazione di vostra scelta, come per esempio storage locale, dischi forniti da cloud pubblici, e altro ancora.

Rollout e rollback automatizzati Puoi utilizzare Kubernetes per descrivere lo stato desiderato per i propri container, e Kubernetes si occuperà di cambiare lo stato attuale per raggiungere quello desiderato ad una velocità controllata. Per esempio, puoi automatizzare Kubernetes per creare nuovi container per il tuo servizio, rimuovere i container esistenti e adattare le loro risorse a quelle richieste dal nuovo container.

Ottimizzazione dei carichi Fornisci a Kubernetes un cluster di nodi per eseguire i container. Puoi istruire Kubernetes su quanta CPU e memoria (RAM) ha bisogno ogni singolo container. Kubernetes allocherà i container sui nodi per massimizzare l’uso delle risorse a disposizione.

Self-healing Kubernetes riavvia i container che si bloccano, sostituisce container, termina i container che non rispondono agli health checks, e evita di far arrivare traffico ai container che non sono ancora pronti per rispondere correttamente.

Gestione di informazioni sensibili e della configurazione Kubernetes consente di memorizzare e gestire informazioni sensibili, come le password, i token OAuth e le chiavi SSH. Puoi distribuire e aggiornare le informazioni sensibili e la configurazione dell’applicazione senza dover ricostruire le immagini dei container e senza svelare le informazioni sensibili nella configurazione del tuo sistema

Per installare K8s (Kubernetes) sul nostro Raspberry Pi abbiamo 3 opzioni:

  1. MicroK8s
  2. Minikube
  3. k3s

Le opzioni che andremo a vedere sono:

  1. k3s → Perfetto per girare su Raspberry Pi, in quanto ottimizzato per dispositivi IoT. Può essere installato anche sulla versione di Raspberry Pi OS a 32bit. Questa installazione prosegue la nostra configurazione del Raspberry Pi iniziata in questo articolo “Raspberry Pi — Configurazione Headless”.
  2. MicroK8s → Sviluppato da Canonical, la stessa azienda di Ubuntu, ed è perfettamente integrato con esso. Può girare solo su macchine a 64bit, ed al momento della scrittura è possibile utilizzarlo solo con Raspberry Pi con a bordo Ubuntu 20.04 LTS a 64bit.

Installiamo Kubernetes con K3s

Prima di iniziare l’installazione dobbiamo effettuare una modifica ed abilitare il cgroups, che non è abilitato di default sulle macchine ARM.

Modifichiamo il file:

sudo nano /boot/cmdline.txt

ed aggiungiamo alla fine del file la seguente stringa:

cgroup_enable=memory cgroup_memory=1

Ora possiamo procedere all’installazione:

sudo curl -sfL https://get.k3s.io | sh -s - --docker

Con l’istruzione “--docker” stiamo dicendo a K3s di utilizzare Docker come sistema di runtime per i Container.

Terminata l’installazione controlliamo lo stato del servizio K3s:

sudo systemctl status k3s

e successivamente possiamo vedere il nostro nodo sul cluster Kubernetes:

sudo kubectl get nodes

Ed avremo un output simile a questo:

Nodi Kubernetes
Nodi Kubernetes

I comandi per stoppare e startare K3s sono i seguenti:

sudo systemctl stop k3ssudo systemctl status k3ssudo systemctl start k3s

Configurazione della Dashboard Kubernetes (K3s)

Per abilitare la dashboard di Kubernets dobbiamo eseguire i seguenti comandi:

GITHUB_URL=https://github.com/kubernetes/dashboard/releasesVERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')sudo k3s kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml

La modalità per accedere all’interfaccia è tramite Bearer Token, per recuperarlo dobbiamo prima creare una configurazione RBAC per la Dashboard.

Creiamo il file dashboard.admin-user.yml con il seguente contenuto:

apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard

Creiamo il file dashboard.admin-user-role.yml con il seguente contenuto:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard

e deployiamo le configurazioni:

sudo k3s kubectl create -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml

Ora per recuperare il Token possiamo utilizzare il comando:

sudo k3s kubectl -n kubernetes-dashboard describe secret admin-user-token | grep ^token

Abilitiamo il port-forwarding per esporre la dashboard verso l’esterno:

sudo k3s kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0

Ora da questo momento la dashboard sarà visibile dal seguente url https://<IP>:10443/

E scegliendo la modalità di Autenticazone con Token, ed inserendo il Token recuperato da linea di comando avremo completo accesso alla Dashboard:

Kubernets Dashboard
Kubernets Dashboard

Nota Bene: Se sulla macchina ubuntu avete abilitato il firewall ufw, è necessario dare la seguente istruzione per abilitare il traffico sulla interfaccia cni0 (creata e usata da K3s):

sudo ufw allow in on cni0 && sudo ufw allow out on cni0

Installiamo Kubernetes con MicroK8s

Noi proseguiremo l’installazione con MicroK8s, in quanto è stato sviluppato da Canonical che è la stessa azienda di Ubuntu, ed è maggiormente integrato nel nostro Sistema Operativo che stiamo utilizzando.

Ricordiamo che per installare MicroK8s è necessario avere installato Ubuntu >= 20.04 a 64bit.

Prima di installare MicroK8s verifichiamo di avere a disposizione il tool snap di ubuntu per l’installazione dei pacchetti:

snap list

Prima di iniziare l’installazione dobbiamo effettuare una modifica ed abilitare il cgroups, che non è abilitato di default sulle macchine ARM.

Modifichiamo il file:

sudo nano /boot/firmware/cmdline.txt

ed aggiungiamo alla fine del file la seguente stringa:

cgroup_enable=memory cgroup_memory=1

Ora possiamo procedere all’installazione:

sudo snap install microk8s --classic

E come già fatto per docker aggiungiamo il nostro utente al gruppo microk8s:

sudo usermod -a -G microk8s MIOUTENTEsudo chown -f -R MIOUTENTE ~/.kubesu - MIOUTENTE

Ora lanciando il comando per vedere i nodi sul Cluster di Kubernetes:

microk8s kubectl get nodes

Vedremo che il nostro nodo è in stato NotReady, ma dopo qualche secondo di attesa diventerà in uno stato Ready.

I comandi per stoppare e startare MicroK8s sono i seguenti:

microk8s stopmicrok8s statusmicrok8s start

Configurazione della Dashboard Kubernetes (MicroK8s)

Per abilitare la Web Dashboard standard di Kubernetes dobbiamo prima abilitare l’addons:

microk8s enable dashboard

La modalità per accedere all’interfaccia è tramite Token, che andremo a recuperare attraverso i seguenti comandi:

token=$(microk8s kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)microk8s kubectl -n kube-system describe secret $token

Ora abilitiamo il port-forwarding per esporre la dashboard verso l’esterno:

microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard 10443:443 --address 0.0.0.0

Ora da questo momento la dashboard sarà visibile dal seguente url https://<IP>:10443/

E scegliendo la modalità di Autenticazone con Token, ed inserendo il Token recuperato da linea di comando avremo completo accesso alla Dashboard:

Kubernets Dashboard
Kubernets Dashboard

Nota Bene: Se sulla macchina ubuntu avete abilitato il firewall ufw, è necessario dare la seguente istruzione per abilitare il traffico sulla interfaccia cni0 (creata e usata da MicroK8s):

sudo ufw allow in on cni0 && sudo ufw allow out on cni0

Link Utili

Alcuni link utili per approfondire alcune tematiche:

--

--

Andrea Scanzani
Architetture Digitali

IT Solution Architect and Project Leader (PMI-ACP®, PRINCE2®, TOGAF®, PSM®, ITIL®, IBM® ACE).