KubernetesLXXVII · Kubernetes UpgradesKubernetes upgrades
CNI and add-on upgrades — the post-control-plane migrations
What you'll learn
- Upgrade the CNI after the control plane
- Upgrade CoreDNS, kube-proxy, and ingress controllers
- Verify compatibility with the new Kubernetes version
- Validate the cluster after the add-on upgrades
Prerequisites
Verified against Kubernetes 1.34.x · kubeadm 1.34.x · kubectl 1.34.x · etcd 3.6.x · CoreDNS 1.11.x · containerd 1.7.x / 2.x · 2026-08-16
The CNI and add-ons run after the control plane upgrade. They are the cluster’s data plane and DNS layer; upgrading them requires the control plane to be at the new version. This lesson walks the post-control-plane upgrades.
The order
flowchart LR
A[Control plane at new version] --> B[Upgrade CNI]
B --> C[Upgrade CoreDNS]
C --> D[Upgrade kube-proxy]
D --> E[Upgrade ingress controller]
E --> F[Validate]
The CNI is first because it owns the cluster’s network fabric. CoreDNS is next because it depends on the cluster DNS. kube-proxy follows. Ingress controllers are last.
The CNI upgrade
Cilium
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--version 1.16.x \
--values cilium-values.yaml
The upgrade is rolling: Cilium’s DaemonSet replaces the agent pods one at a time. The cluster’s network is uninterrupted.
Calico
kubectl apply -f calico-v3.28.yaml
The Calico manifests include the Typha (if used), the DaemonSet, and the CRDs. The upgrade is rolling.
Flannel
kubectl apply -f flannel-v0.24.yaml
Flannel is a simple CNI; the upgrade is a manifest replacement.
The CNI compatibility check
Each CNI publishes a compatibility matrix:
| CNI | Kubernetes 1.34 | Lower | Notes |
|---|---|---|---|
| Cilium 1.16.x | yes | 1.30 | Most recent; supports eBPF host routing |
| Calico 3.28.x | yes | 1.30 | Tigera operator recommended |
| Flannel 0.24.x | yes | 1.28 | Basic L2; limited features |
Verify the CNI’s compatibility with the new version before the upgrade.
The CoreDNS upgrade
helm upgrade coredns coredns/coredns \
--namespace kube-system \
--version 1.11.x \
--values coredns-values.yaml
The CoreDNS upgrade is a Deployment rollout. The pods are replaced one at a time.
kubectl rollout status deployment/coredns -n kube-system
The rollout is complete when all replicas are at the new version.
The kube-proxy upgrade
The kube-proxy is updated via the kubeadm upgrade:
sudo kubeadm upgrade apply v1.34.1
The upgrade apply command updates the kube-proxy
manifest in /etc/kubernetes/manifests/. The kubelet
restarts the kube-proxy pods on each host.
Alternatively, kube-proxy can be installed via a DaemonSet:
kubectl -n kube-system set image ds/kube-proxy \
kube-proxy=registry.k8s.io/kube-proxy:v1.34.1
The DaemonSet rollout replaces the pods one at a time.
The ingress controller upgrade
nginx ingress
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--version 4.10.x \
--values ingress-values.yaml
The upgrade is rolling; the ingress controller’s pods are replaced one at a time.
Traefik
helm upgrade traefik traefik/traefik \
--namespace traefik \
--version 3.0.x \
--values traefik-values.yaml
HAProxy
helm upgrade haproxy haproxytech/kubernetes-ingress \
--namespace haproxy-controller \
--version 1.10.x
The CRD upgrade
Some add-ons (Cilium, Calico, cert-manager) ship with CRDs. The CRDs are upgraded first:
kubectl apply -f crds-v1.16.x.yaml
The CRD upgrade is one-way; the CRDs evolve to the new schema. Pre-existing CRs are preserved.
flowchart LR
A[Read CRD release notes] --> B[Apply new CRDs]
B --> C[Update chart values]
C --> D[helm upgrade]
D --> E[Validate]
The validation
After all add-ons are upgraded:
kubectl get pods -n kube-system
# All add-on pods Running at the new version
kubectl get nodes -o wide
# All nodes Ready at v1.34.1
# Smoke test
kubectl run nginx-test --image=nginx --rm -it --restart=Never --command -- nginx -v
# DNS test
kubectl run dns-test --image=busybox --rm -it --restart=Never -- nslookup kubernetes.default
# Service test
kubectl expose deployment nginx-test --port=80
kubectl run curl-test --image=curlimages/curl --rm -it --restart=Never -- curl -s http://nginx-test
The cluster is fully upgraded.
Cross-course references
- The Terraform course covers IaC-managed add-on upgrades.
- The Observability course covers alerting during add-on upgrade windows.
- The Helm course covers chart versioning and rollout strategies.
Quiz
Knowledge check · 4 questions
Q1. Which add-on is upgraded first after the control plane?
Q2. CRD upgrades can be safely rolled back to the previous version.
Q3. Walk the post-control-plane upgrade of CNI, CoreDNS, kube-proxy, and ingress controller.
Cluster is at 1.34.1 control plane. CNI is Cilium 1.15.x; CoreDNS is 1.10.x; kube-proxy is 1.34.0; ingress is nginx-ingress 4.9.x. The team upgrades to Cilium 1.16.x, CoreDNS 1.11.x, kube-proxy 1.34.1, ingress 4.10.x.
Q4. Why is checking the compatibility matrix critical before any add-on upgrade?
Passing score: 75%. Answers are checked in this browser.
Production discipline
- Check the compatibility matrix first. Always.
- Upgrade in order: CNI, CoreDNS, kube-proxy, ingress. Network first, then DNS, then ingress.
- Backup CRDs before upgrading. The CRDs may evolve.
- Validate at each step. kubectl get pods -n kube-system; smoke tests.
- Test on staging. Add-on upgrades are cluster-specific.
- Document the upgrade. The chart versions, the values, the rollback path.
The post-control-plane upgrades are the cluster’s data plane. Operating them well is following the order, checking compatibility, and validating at each step.