- Control plane — the cluster “brain” (API server, scheduler, controller-manager, etcd). It makes scheduling and cluster-control decisions.
- Worker nodes — the cluster “muscle” (kubelet, kube-proxy, and the pods that serve traffic).
Recommended staged plan
- Upgrade the control plane.
- Upgrade worker nodes one at a time (or in small safe batches).
- Use PodDisruptionBudgets (PDBs) and cordon/drain to protect availability.

- Cordon the node so the scheduler stops placing new pods on it.
- Drain the node so existing pods are gracefully evicted and rescheduled elsewhere.
- Perform the node upgrade (OS/kernel, kubelet/kube-proxy; or replace the VM/instance).
- Uncordon the node so it can accept new pods again.

When running
kubectl drain, include --ignore-daemonsets (daemonset pods are not evicted) and --delete-local-data only if you are certain local data can be discarded. If pods are not managed by a controller (Deployment, ReplicaSet, StatefulSet, etc.), drains may be blocked — consider adding or converting pods to be controller-managed.- Always upgrade the control plane first, then worker nodes.
- Upgrade nodes one-by-one, or in small batches if you’ve validated capacity and PDBs.
- Use PDBs to prevent simultaneous eviction of critical replicas.
- Prefer replacing nodes (create new, join to cluster, drain and remove old) when using cloud/managed environments — this reduces risk and is commonly used by managed Kubernetes providers.
- Test the upgrade process in a staging environment that mirrors production.
Compatibility warning: kubelets (node agents) must never be newer than the control plane. Upgrading worker nodes before the control plane can cause version skew issues. Always verify Kubernetes version skew policy for your target versions.
- Kubernetes official upgrade guide: https://kubernetes.io/docs/tasks/administer-cluster/cluster-upgrade/
- PodDisruptionBudget docs: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- Draining nodes: https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/