如何升级Debian上的Kubernetes
小樊
43
2025-11-15 11:33:38
升级前准备与版本策略
- 备份关键数据与配置:建议完整备份 /etc/kubernetes/、/var/lib/etcd/,并使用 etcdctl 对 etcd 做快照;同时确认集群健康(如 kubectl get nodes、kubectl get pods -A 状态正常)。
- 明确升级路径:遵循 Kubernetes 的版本倾斜策略,优先在同大版本内逐级升级小版本,避免跨多个大版本;必要时先在测试环境验证。
- 版本兼容要点:
- kube-apiserver:在 HA 场景下各实例小版本差不超过 1。
- kube-controller-manager / kube-scheduler / cloud-controller-manager:版本不能高于 apiserver,最好与其一致,最多低 1 个小版本。
- kubelet:不能高于 apiserver,最多比 apiserver 低 2 个小版本。
- kubectl:可高于或低于 apiserver 最多 1 个小版本。
- 系统层面:保持 Debian 与容器运行时(如 containerd/Docker)为稳定版本,并提前阅读目标版本的发行说明与变更点。
升级路线图
- 控制平面(推荐用 kubeadm 原地升级)
- 检查升级计划:kubeadm upgrade plan。
- 执行升级:kubeadm upgrade apply v<目标版本>。
- 逐台腾空并升级 kubelet/kubectl,然后重启 kubelet,最后恢复调度。
- 工作节点
- 逐台腾空:kubectl drain --ignore-daemonsets。
- 升级 kubelet/kubectl 并重启 kubelet。
- 恢复调度:kubectl uncordon 。
- 验证
- 组件版本:kubectl version --short、kubectl get nodes、kubectl get pods -A。
- 业务与网络:确认 CoreDNS、kube-proxy、网络插件(如 Calico/Flannel)运行正常,必要时升级网络插件至兼容版本。
控制平面节点升级步骤
- 准备与检查
- 备份 /etc/kubernetes/ 与 /var/lib/etcd/(etcd 快照)。
- 确认节点可维护:kubectl get nodes 状态为 Ready。
- 升级 kubeadm 并制定计划
- 下载并替换 kubeadm(示例为 amd64):
- wget https://dl.k8s.io/release/v<目标版本>/bin/linux/amd64/kubeadm
- chmod +x kubeadm && sudo mv kubeadm /usr/local/bin/
- 验证:kubeadm version
- 检查计划:kubeadm upgrade plan
- 执行控制平面升级
- 升级控制面:sudo kubeadm upgrade apply v<目标版本>
- 升级 kubelet 与 kubectl(Debian 包管理)
- 更新索引并指定版本:
- sudo apt update
- sudo apt install -y kubelet=<目标版本>-00 kubectl=<目标版本>-00
- 重启服务:
- sudo systemctl daemon-reload
- sudo systemctl restart kubelet
- 恢复节点调度
- 说明
- 若采用“静态 Pod 清单”方式运行控制面组件,kubeadm 会更新 /etc/kubernetes/manifests/ 中的镜像与清单并自动重启相关 kubelet 托管 Pod。
- 升级前确保 kubelet 未处于 hold 状态(若之前执行过 apt-mark hold,需先解除)。
工作节点升级步骤
- 逐台维护(避免同时升级多台,降低业务中断风险)
- 标记不可调度并腾空:
- kubectl drain --ignore-daemonsets
- 升级 kubelet 与 kubectl(Debian 包管理)
- sudo apt update
- sudo apt install -y kubelet=<目标版本>-00 kubectl=<目标版本>-00
- sudo systemctl daemon-reload && sudo systemctl restart kubelet
- 恢复调度:
- 验证
- 节点与系统 Pod 就绪:kubectl get nodes、kubectl get pods -n kube-system
- 容器运行时状态正常(如 containerd/Docker 服务运行正常)。
常见问题与回滚建议
- 版本不兼容导致异常
- 现象:节点 NotReady、组件 CrashLoopBackOff、调度失败等。
- 处置:核对 apiserver / controller-manager / scheduler / kubelet / kubectl 的版本倾斜是否满足策略;必要时将 kubelet 回退到允许范围内,或将控制面回滚到上一小版本后再逐步升级。
- 升级中断或失败
- 处置:根据 kubeadm upgrade plan 的输出与日志定位阶段;必要时从 etcd 快照与 /etc/kubernetes/ 备份恢复,再按步骤重做升级。
- 网络与插件问题
- 现象:Pod 间网络不通、DNS 解析失败。
- 处置:确认 kube-proxy 与网络插件(如 Calico/Flannel)已升级到与新版本 Kubernetes 兼容的版本,并重新应用其清单。
- 客户端与服务端版本差异
- 建议 kubectl 与 apiserver 版本差不超过 1 个小版本,避免 API 兼容性问题。