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.

Starting from Kubernetes v1.20, Docker support through the dockershim was deprecated, and as of v1.24, it has been completely removed. This means Kubernetes does not natively support Docker anymore. Containerd is now recommended container runtime for Kubernetes.