Kubernetes 集群升级
Kubernetes 升级前检查、组件兼容、节点滚动升级、验证清单和回滚预案。
Kubernetes 集群升级
Kubernetes 升级是高风险变更,涉及控制平面、节点组件、容器运行时、CNI、CSI、Ingress Controller、监控和业务工作负载。生产环境升级前必须完成兼容性检查、备份和回滚预案。
本文以 kubeadm 集群为主线说明升级流程。
升级原则
- 不跳过 Kubernetes minor 版本。
- 优先升级到目标 minor 的最新 patch 版本。
- 先升级控制平面,再升级工作节点。
- 每次只滚动升级一部分节点。
- 升级前备份 etcd 和关键配置。
- 升级后验证核心插件和业务链路。
升级顺序
升级前检查
-> 备份 etcd
-> 升级第一个控制平面
-> 升级其他控制平面
-> 升级 worker 节点
-> 升级 kubectl
-> 验证插件和业务
升级前检查
查看版本:
kubectl version
kubectl get nodes -o wide
kubeadm version
检查集群状态:
kubectl get nodes
kubectl get pods -A
kubectl get events -A --sort-by='.lastTimestamp'
kubectl top nodes
kubectl top pods -A
检查 kube-system:
kubectl get pods -n kube-system -o wide
kubectl get daemonset,deployment -n kube-system
检查 API 废弃:
kubectl get apiservice
kubectl api-resources
建议使用工具或平台能力提前扫描废弃 API,例如 Ingress、CronJob、PodSecurityPolicy 等历史版本迁移问题。
组件兼容性
升级前确认:
| 组件 | 检查内容 |
|---|---|
| CNI | 是否支持目标 Kubernetes 版本 |
| CSI | 是否支持目标 Kubernetes 版本和节点系统 |
| Ingress Controller | 是否支持目标版本 API |
| Metrics Server | 是否支持目标版本 |
| Cluster Autoscaler | 版本通常需要和 Kubernetes minor 对齐 |
| Helm Chart | 是否使用废弃 API |
| CRD / Operator | 是否支持目标 Kubernetes 版本 |
etcd 备份
在控制平面节点执行,按实际证书路径调整:
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-$(date +%F-%H%M%S).db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
验证快照:
ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-xxxx.db --write-out=table
同时备份:
cp -a /etc/kubernetes /backup/kubernetes-$(date +%F-%H%M%S)
cp -a /var/lib/kubelet/config.yaml /backup/kubelet-config-$(date +%F-%H%M%S).yaml
升级第一个控制平面
设置目标版本,例如:
export K8S_VERSION=1.28.15-00
升级 kubeadm:
apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=${K8S_VERSION}
apt-mark hold kubeadm
查看升级计划:
kubeadm upgrade plan
执行升级:
kubeadm upgrade apply v1.28.15
升级 kubelet 和 kubectl:
apt-mark unhold kubelet kubectl
apt-get install -y kubelet=${K8S_VERSION} kubectl=${K8S_VERSION}
apt-mark hold kubelet kubectl
systemctl daemon-reload
systemctl restart kubelet
验证:
kubectl get nodes
kubectl get pods -n kube-system
升级其他控制平面
在其他控制平面节点执行:
apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=${K8S_VERSION}
apt-mark hold kubeadm
kubeadm upgrade node
apt-mark unhold kubelet kubectl
apt-get install -y kubelet=${K8S_VERSION} kubectl=${K8S_VERSION}
apt-mark hold kubelet kubectl
systemctl daemon-reload
systemctl restart kubelet
升级 Worker 节点
升级前驱逐业务 Pod:
kubectl drain worker-01 \
--ignore-daemonsets \
--delete-emptydir-data \
--grace-period=60 \
--timeout=10m
在 worker 节点升级:
apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=${K8S_VERSION}
apt-mark hold kubeadm
kubeadm upgrade node
apt-mark unhold kubelet kubectl
apt-get install -y kubelet=${K8S_VERSION} kubectl=${K8S_VERSION}
apt-mark hold kubelet kubectl
systemctl daemon-reload
systemctl restart kubelet
恢复调度:
kubectl uncordon worker-01
kubectl get node worker-01 -o wide
升级后验证
集群状态:
kubectl get nodes -o wide
kubectl get pods -A
kubectl get events -A --sort-by='.lastTimestamp'
核心链路:
kubectl run nginx-test --image=nginx:1.27
kubectl expose pod nginx-test --port=80
kubectl run netshoot --image=nicolaka/netshoot -it --rm -- curl nginx-test.default.svc.cluster.local
kubectl delete pod nginx-test
kubectl delete service nginx-test
重点检查:
- CoreDNS 是否正常解析。
- CNI 是否正常跨节点通信。
- CSI 是否能挂载和扩容。
- Ingress 是否能正常访问。
- HPA 指标是否正常。
- 业务 Deployment 是否稳定。
回滚预案
Kubernetes 升级回滚通常不如普通应用简单。升级前必须明确:
- etcd 快照是否可恢复。
- 控制平面节点是否有系统盘快照。
- 旧版本 kubeadm、kubelet、kubectl 包是否可安装。
- CNI / CSI / Ingress Controller 是否能回退。
- 业务是否允许短时间只读或停机窗口。
如果升级控制面后出现严重问题,优先根据 kubeadm 和 etcd 备份流程恢复控制平面。不要在没有备份的情况下反复重置控制面。
常见问题
| 现象 | 排查方向 |
|---|---|
kubeadm upgrade plan 报错 | 版本跨度、组件健康、配置文件、证书 |
| 节点升级后 NotReady | kubelet、containerd、CNI、证书、cgroup |
| Pod 无法驱逐 | PDB、单副本服务、本地存储、DaemonSet |
| CoreDNS 异常 | CoreDNS 版本、ConfigMap、上游 DNS、CNI |
| HPA 指标异常 | Metrics Server 和 APIService |
| Ingress 异常 | Controller 版本、IngressClass、废弃注解 |
变更清单
升级前准备:
- 目标版本和兼容性确认。
- etcd 备份和恢复演练。
- 节点批次和维护窗口。
- 业务方通知和回滚策略。
- 监控大盘和告警静默策略。
升级中观察:
- 节点 Ready 状态。
- kube-system Pod 状态。
- API Server 延迟和错误率。
- 业务错误率和延迟。
- 事件和控制器日志。
升级后收尾:
- 移除临时变更。
- 更新运维文档和版本记录。
- 复盘异常项。
- 补齐废弃 API 改造计划。