Post

Kubernetes da Zero: Guida Completa all'Installazione e Gestione di un Cluster - Parte 2

Guida pratica a Kubernetes: installa un cluster su Debian 13 con kubeadm, gestisci Deployment, RBAC, Helm e risolvi i problemi più comuni.

Kubernetes da Zero: Guida Completa all'Installazione e Gestione di un Cluster - Parte 2

Installazione del Cluster su Debian 13 con Kubeadm

Setup

Topologia del cluster:

1
2
3
k8s-master     → 192.168.0.100  (Control Plane)
k8s-worker01   → 192.168.0.101  (Worker Node)
k8s-worker02   → 192.168.0.102  (Worker Node)

Nota: Debian 13 utilizza systemd come init system, pienamente compatibile con Kubernetes e containerd. A differenza di CentOS/RHEL o altre distribuzioni, su Debian non è presente firewalld: si gestisce con ufw oppure iptables direttamente.

2.1 Configurazione Iniziale (su tutti i nodi del cluster)

Aggiorna il sistema e installa i prerequisiti

1
2
3
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget gnupg2 apt-transport-https \
    ca-certificates software-properties-common lsb-release

Imposta gli hostname del nostro cluster

1
2
3
4
5
6
7
8
9
10
11
# Sul Master Node

sudo hostnamectl set-hostname "k8s-master"

# Sul 1° Worker Node

sudo hostnamectl set-hostname "k8s-worker01"

# Sul 2° Worker Node

sudo hostnamectl set-hostname "k8s-worker02"

Aggiorna /etc/hosts (su tutti i nodi)

1
sudo nano /etc/hosts

Aggiungi in fondo al file (adatta gli IP al tuo ambiente):

1
2
3
192.168.0.100   k8s-master
192.168.0.101   k8s-worker01
192.168.0.102   k8s-worker02

Disabilita la Swap

Kubernetes richiede swap disabilitata su entrambi i nodi che formano il cluster:

1
2
3
4
5
6
7
8
9
sudo swapoff -a

# Rendi permanente commentando la riga swap in fstab

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# Verifica (deve mostrare 0 per Swap)

free -h

Gestisci ufw (se presente)

1
2
3
4
5
6
7
8
9
10
# Opzione A — disabilita ufw completamente (ATTENZIONE: consigliato per ambienti lab/home server non esposti pubblicamente)
sudo ufw disable

# Opzione B — apri solo le porte necessarie (ambienti production panoramica delle porte necessarie)
sudo ufw allow 6443/tcp        # API Server
sudo ufw allow 2379:2380/tcp   # etcd
sudo ufw allow 10250/tcp       # kubelet
sudo ufw allow 10251/tcp       # kube-scheduler
sudo ufw allow 10252/tcp       # kube-controller-manager
sudo ufw allow 30000:32767/tcp # NodePort range

Abilita i moduli kernel necessari

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Parametri sysctl per Kubernetes

sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

2.2 Installazione di Containerd (su tutti i nodi)

Usiamo i repository ufficiali Docker per installare containerd su Debian 13:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Aggiungi la chiave GPG di Docker

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Aggiungi il repository Docker per Debian

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y containerd.io

# Configura containerd con systemd cgroup driver (obbligatorio per K8s)

containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' \
    /etc/containerd/config.toml

sudo systemctl restart containerd
sudo systemctl enable containerd

# Verifica
sudo systemctl status containerd

2.3 Installazione di kubeadm, kubelet, kubectl (su tutti i nodi)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Aggiungi la chiave GPG di Kubernetes

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | \
    sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# Aggiungi il repository Kubernetes

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
    https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | \
    sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update
sudo apt install -y kubelet kubeadm kubectl

# Blocca gli aggiornamenti automatici (importante!)

sudo apt-mark hold kubelet kubeadm kubectl

# Verifica le versioni installate

kubeadm version && kubectl version --client && kubelet --version

Nota: apt-mark hold impedisce che un possibile apt upgrade incauto aggiorni i componenti K8s rompendo la compatibilità del cluster.

2.4 Inizializzazione del Cluster (solo Master)

1
sudo kubeadm init --control-plane-endpoint=k8s-master

Al termine, configura kubectl per l’utente corrente:

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Attenzione: Copia e salva il comando kubeadm join ... che appare nell’output Ti servirà nel passo 2.6. Ha il seguente formato:

1
2
3
kubeadm join k8s-master:6443 \
    --token <TOKEN> \
    --discovery-token-ca-cert-hash sha256:<HASH>

2.5 Plugin di Rete Calico (solo sul Master)

Senza un plugin CNI i nodi rimangono in stato NotReady. Installiamo Calico:

1
2
3
4
5
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/\
v3.29.1/manifests/calico.yaml

# Attendi che tutti i pod di sistema siano Running (1-3 minuti)
kubectl get pods -n kube-system -w

2.6 Aggiunta dei Worker Nodes

Esegui il comando kubeadm join (salvato dal passaggio 2.4) su ciascun Worker Node:

1
2
3
sudo kubeadm join k8s-master:6443 \
    --token <TOKEN> \
    --discovery-token-ca-cert-hash sha256:<HASH>

Token scaduto? I token durano 24 ore. Per rigenerarne uno esegui:

1
sudo kubeadm token create --print-join-command

2.7 Verifica del Cluster

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Verifica lo stato dei nodi
kubectl get nodes

# Output atteso:
# NAME           STATUS   ROLES           AGE   VERSION
# k8s-master     Ready    control-plane   10m   v1.34.x
# k8s-worker01   Ready    <none>          5m    v1.34.x
# k8s-worker02   Ready    <none>          5m    v1.34.x

# Verifica tutti i pod di sistema
kubectl get pods -n kube-system

# Test rapido: deploy nginx su 2 repliche
kubectl create ns demo-app
kubectl create deployment nginx-app --image=nginx --replicas=2 -n demo-app
kubectl get pods -n demo-app -o wide

Se tutti i Pod sono in stato Running e i nodi in stato Ready, il cluster in questo caso è operativo.


Questo post è sotto licenza CC BY 4.0 a nome dell'autore.