Docs / Kubernetes & Orchestration / How to Set Up Multi-Node Kubernetes with kubeadm

How to Set Up Multi-Node Kubernetes with kubeadm

By Admin · Mar 2, 2026 · Updated Apr 23, 2026 · 25 views · 3 min read

How to Set Up Multi-Node Kubernetes with kubeadm

kubeadm is the official tool for bootstrapping production-grade Kubernetes clusters. This guide walks you through setting up a multi-node cluster with one control plane and two worker nodes using Breeze instances running Ubuntu 22.04 or later.

Prerequisites (All Nodes)

Run these steps on every Breeze instance that will be part of the cluster:

# Disable swap (required by kubelet)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

# Load kernel modules
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

# Set sysctl parameters
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sudo sysctl --system

Installing containerd

sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
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

Installing kubeadm, kubelet, and kubectl

sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Initializing the Control Plane

On the control plane Breeze instance only:

sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=<CONTROL_PLANE_IP>

After initialization, configure kubectl access:

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

Installing a Pod Network (Calico)

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml

Wait for all system pods to become ready:

kubectl get pods -n kube-system -w

Joining Worker Nodes

The kubeadm init output includes a join command. Run it on each worker Breeze instance:

sudo kubeadm join <CONTROL_PLANE_IP>:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

If the token has expired, generate a new one on the control plane:

kubeadm token create --print-join-command

Verifying the Cluster

kubectl get nodes -o wide

All nodes should show Ready status. You now have a fully functional multi-node Kubernetes cluster running across your Breeze instances.

Post-Setup Recommendations

  • Taint the control plane to prevent workloads from scheduling on it unless intended
  • Label worker nodes with roles and hardware characteristics for pod scheduling
  • Deploy the Metrics Server for resource monitoring
  • Configure etcd backups on the control plane for disaster recovery
  • Set up RBAC and network policies before deploying production workloads

Was this article helpful?