Debian上Kubernetes版本升级实操指南
一 升级前准备与版本路径
- 备份关键数据与配置:优先备份 /etc/kubernetes/ 与 etcd(如使用外部 etcd,建议用 etcdctl 做快照),以便回滚。检查集群健康:kubectl get nodes、kubectl get pods -A 均为正常,控制面组件 Pod 为 Running。确认升级路径:仅支持相邻小版本递进(如 1.28 → 1.29),不可跨多个大版本;kubectl 与集群版本差距不应超过 1 个次要版本。环境要求:已禁用 Swap,系统时间同步,容器运行时与网络/存储插件与目标版本兼容。kubeadm 升级时会自动处理控制面临时证书的续期(可通过 –certificate-renewal=false 关闭)。
二 使用 kubeadm 的标准升级流程(Debian 包管理)
- 在所有节点准备新版本包:查看可用版本并固定目标版本
- apt update
- apt-cache policy kubeadm
- apt-mark unhold kubeadm && apt-get install -y kubeadm=1.29.x-00 && apt-mark hold kubeadm
- 升级第一个控制平面节点
- 检查升级计划:kubeadm upgrade plan
- 执行升级:sudo kubeadm upgrade apply v1.29.x(如需跳过证书续期:–certificate-renewal=false)
- 升级其余控制平面节点
- 在每个控制面节点:sudo kubeadm upgrade node
- 升级 kubelet 与 kubectl(所有节点)
- apt-mark unhold kubelet kubectl && apt-get install -y kubelet=1.29.x-00 kubectl=1.29.x-00 && apt-mark hold kubelet kubectl
- systemctl daemon-reload && systemctl restart kubelet
- 逐节点腾空、升级、恢复
- 驱逐:kubectl drain --ignore-daemonsets
- 升级 kubeadm/kubelet/kubectl 并重启 kubelet(同上)
- 恢复:kubectl uncordon
- 升级 CNI 插件与其他扩展
- 按所用网络插件(如 Calico/Flannel/Cilium)官方说明执行升级;若以 DaemonSet 部署,通常在首个控制面升级后自动更新,其余控制面无需重复。其他组件(如 Ingress Controller、Dashboard、Metrics Server、CSI)需检查与目标 K8s 版本的兼容性后再升级。
三 就地二进制替换升级方案(不依赖 apt,适用于特殊场景)
- 适用前提:无法立即通过仓库升级或需快速回滚二进制。流程要点:
- 在每个节点下载并替换二进制:kubeadm、kubelet、kubectl(示例:wget https://dl.k8s.io/release/v1.29.10/bin/linux/amd64/{kubeadm,kubelet,kubectl};chmod +x;mv 至 /usr/local/bin)
- 控制平面节点:先 kubeadm version 校验,再执行 kubeadm upgrade plan 与 kubeadm upgrade apply v1.29.10
- 逐节点 drain → 重启 kubelet(systemctl daemon-reload && systemctl restart kubelet)→ uncordon
- 注意:证书续期、配置漂移与回滚策略需自行把控,生产环境优先使用包管理升级。
四 升级后验证与回滚要点
- 验证:kubectl version --short、kubectl get nodes(均为 Ready)、kubectl get pods -A(无 CrashLoopBackOff/Error)、组件日志(journalctl -u kubelet -f)。如升级涉及 API 废弃/变更,按版本说明调整清单与代码。回滚:优先使用 kubeadm 的回滚能力(如 kubeadm upgrade rollback),若采用二进制替换方案,按备份的二进制与配置恢复;etcd 快照可用于灾难恢复。