Update the package list and upgrade installed packages:
sudo apt update && sudo apt upgrade -y
sudo rebootInstall required tools and packages:
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-releaseKubernetes requires swap to be disabled:
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstabKubernetes needs a container runtime. We'll use containerd (recommended).
sudo apt install -y containerdGenerate the default configuration file:
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.tomlRestart containerd:
sudo systemctl restart containerd
sudo systemctl enable containerdInstall kubeadm, kubelet, and kubectl.
The old repository (https://apt.kubernetes.io kubernetes-xenial) is deprecated.
Use the new pkgs.k8s.io repository instead.
# Create a keyring directory
sudo mkdir -p /etc/apt/keyrings
# Download and add the Kubernetes repository GPG key
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# Add the Kubernetes repository
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
# Update package list
sudo apt update💡 If a newer version (like v1.31) is available, replace
v1.30in the URL above.
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectlIf you see errors about Snap versions, remove them first:
sudo snap remove kubelet kubectl kubeadmRun the following command on the control-plane (master) node:
sudo kubeadm init --pod-network-cidr=192.168.0.0/16mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configThe output of kubeadm init will include a kubeadm join command for worker nodes.
Copy and save this for later.
Choose a CNI (Container Network Interface). We'll use Calico.
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yamlRun the kubeadm join command from Step 6.2 on each worker node:
sudo kubeadm join <master-ip>:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>On the master node, check the status of nodes:
kubectl get nodesVerify that the cluster is working by checking pods in the kube-system namespace:
kubectl get pods -n kube-systemsudo apt install -y bash-completion
echo 'source <(kubectl completion bash)' >>~/.bashrc
source ~/.bashrcIf the installation fails, reset kubeadm and try again:
sudo kubeadm reset -f
sudo rm -rf $HOME/.kubeUse the following commands to troubleshoot issues:
journalctl -xeu kubelet
kubectl describe pod <pod-name> -n kube-system✅ This guide is now compatible with modern Ubuntu (20.04, 22.04, 24.04) and Kubernetes v1.30+ repositories.
