Ubuntu上使用 kubeadm 升级 Kubernetes 的标准流程
一 升级前准备
- 备份关键数据与清单:导出集群资源清单与应用配置,备份 etcd(快照),记录当前 kubeadm 配置与静态 Pod 镜像版本,便于回滚与比对。
示例:
kubectl get nodes -o wide
kubectl get pods -A -o yaml > backup-pods.yaml
kubectl get cm -n kube-system kubeadm-config -o yaml > backup-kubeadm-config.yaml
grep image: /etc/kubernetes/manifests/*.yaml
- 检查版本与兼容性:确认升级路径与组件匹配。
kubectl version --short
kubeadm version
查看可升级目标版本
sudo kubeadm upgrade plan
- 维护窗口与策略:生产环境建议按 PATCH → MINOR 节奏滚动升级,先控制面后工作节点,逐台节点操作,保持业务连续性。
- 容器运行时就绪:确保 containerd/docker 与目标 Kubernetes 版本兼容并已升级到稳定版。
- 源与版本锁定:配置可用的 APT 源(如官方或国内镜像),并使用 apt-mark hold/unhold 管理包版本,避免非计划升级。
以上准备动作与命令示例可参考业内实践与升级经验。
二 控制平面升级(逐个控制面节点)
- 将节点标记为不可调度并驱逐工作负载:
kubectl cordon
kubectl drain --ignore-daemonsets --delete-emptydir-data --force
- 升级 kubeadm(解除锁定→安装→重新锁定):
sudo apt-mark unhold kubeadm
sudo apt-get update && sudo apt-get install -y kubeadm=<目标版本号>
sudo apt-mark hold kubeadm
- 验证升级计划并应用:
kubeadm version
sudo kubeadm upgrade plan
如暂不升级 etcd,可加上:–etcd-upgrade=false
sudo kubeadm upgrade apply <目标版本号> [–etcd-upgrade=false]
- 升级 kubelet 与 kubectl(控制面节点):
sudo apt-mark unhold kubelet kubectl
sudo apt-get update && sudo apt-get install -y kubelet=<目标版本号> kubectl=<目标版本号>
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload && sudo systemctl restart kubelet
- 恢复节点调度:
kubectl uncordon
- 多控制面节点:重复以上步骤,逐台升级,确保控制面组件版本完全一致。
上述流程与命令示例适用于 Ubuntu 上的 kubeadm 集群升级。
三 工作节点升级(逐台滚动)
- 隔离与排空节点:
kubectl cordon
kubectl drain --ignore-daemonsets --delete-emptydir-data --force
- 升级 kubelet 与 kubectl:
sudo apt-mark unhold kubelet kubectl
sudo apt-get update && sudo apt-get install -y kubelet=<目标版本号> kubectl=<目标版本号>
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload && sudo systemctl restart kubelet
- 恢复节点调度:
kubectl uncordon
- 依次对全部工作节点执行,直至集群所有节点版本一致或满足兼容性要求。
以上节点升级“隔离-升级-恢复”的三步法与命令示例可直接用于生产滚动升级。
四 升级后验证与常见问题
- 集群与节点状态:
kubectl get nodes -o wide
kubectl get pods -n kube-system
kubectl version --short
kubectl api-versions
- 控制面健康:
kubectl get --raw=‘/healthz’
- 常见问题与处理:
- 节点 NotReady:检查 kubelet 日志(journalctl -u kubelet -f)、容器运行时状态与镜像拉取情况。
- 组件版本不一致:控制面组件必须同版本;kubelet 与控制面通常允许 ±1 个小版本差异,必要时对齐版本。
- etcd 升级谨慎:如选择不随控制面升级 etcd(–etcd-upgrade=false),需单独制定 etcd 升级与回滚方案,并在升级前完成快照备份。
- 升级失败回滚:使用已备份的 etcd 快照与 kubeadm 配置回滚,或按相反顺序降级相关组件版本。
这些验证与排错要点可显著提升升级可控性与成功率。