Skip to content

Upgrade Kubernetes with kubeadm

Official Docs

Upgrade (1.25 > 1.26) to Version 1.26.x is just an example. Do not copy paste like a maniac! :D

Upgrade Packages

  • Add Version you want to upgrade to
Bash
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.26/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.26/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Bash
sudo apt update

Master Main

  • Check available versions and pick (the lastest recommended)
Bash
sudo apt update
sudo apt-cache madison kubeadm

  • Upgrade kubeadmin and hold
Bash
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.26.15-1.1' && \
sudo apt-mark hold kubeadm
  • Check | dry run
Bash
sudo kubeadm upgrade plan
  • Upgrade master cluster
Bash
sudo kubeadm upgrade apply v1.26.15
  • Drains the node (evict pods) and make it unschedulable
Bash
kubectl drain <node-to-drain> --ignore-daemonsets
  • Update kubelet and kubectl
Bash
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.26.15-1.1' kubectl='1.26.15-1.1' && \
sudo apt-mark hold kubelet kubectl
  • This will apply the upgrade
Bash
sudo systemctl daemon-reload
sudo systemctl restart kubelet
  • Make the node available again
Bash
kubectl uncordon controlplane
  • done!

Workers

  • Add Version you want to upgrade to
Bash
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.26/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.26/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Bash
sudo apt update

Bash
sudo apt update
sudo apt-cache madison kubeadm
Bash
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.26.15-1.1' && \
sudo apt-mark hold kubeadm
  • It is mostly the same as upgrading master node except this command
Bash
sudo kubeadm upgrade node
  • Drain
Bash
kubectl drain <node-to-drain> --ignore-daemonsets
  • Upgrade kublet | Final step
Bash
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.26.15-1.1' kubectl='1.26.15-1.1' && \
sudo apt-mark hold kubelet kubectl
Bash
sudo systemctl daemon-reload
sudo systemctl restart kubelet
Bash
kubectl uncordon node