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