Kubernetes 升级与维护
升级原则
- 只升级到上游和发行版/云厂商共同支持的版本。
- 次要版本逐级升级,不能跳过;先把当前分支升到最新补丁,再升目标分支最新补丁。
- 控制面先于 kubelet;组件偏差必须符合官方版本偏差策略。
- 集群升级不等于只升级核心:CNI、CSI、Ingress/Gateway、DNS、Metrics、Operator、CRD 和客户端都有兼容矩阵。
- 先演练、备份和验证恢复,再变更;明确停止条件和回退/前滚策略。
截至 2026-08-12,上游维护 1.36、1.35、1.34,最新稳定补丁为 v1.36.3。执行时重新核对 Releases、stable.txt 和供应商公告。
升级前清单
- 阅读目标次要版发布公告、完整 Changelog、Urgent Upgrade Notes、弃用/移除和已知问题。
- 盘点 API 使用:清单、Helm Chart、CRD、Webhook、Operator、客户端库。
- 核对所有插件和云服务兼容矩阵,升级必要的前置组件。
- 当前集群健康:API/etcd、节点、系统 Pod、存储、网络和备份无未解决告警。
- 容量足够逐节点 drain、Deployment surge 和故障域冗余;PDB 不会无解阻塞。
- 保存配置和资源清单;对 etcd/持久数据执行可恢复备份,并在隔离环境验证。
- 在接近生产的预发环境运行安装、升级、回滚/前滚、冒烟和性能测试。
- 通知业务、值班和供应商,设置变更窗口、观察期、负责人和停止条件。
kubectl version
kubectl get nodes -o wide
kubectl get pods -A --field-selector='status.phase!=Running'
kubectl get apiservices
kubectl get --raw='/readyz?verbose'
kubectl get pdb -AAPI 弃用扫描可使用组织批准的工具和 API Server 审计/指标;不要仅搜索 Git,因为运行中的 CR、Webhook 和外部客户端也可能调用旧 API。
上游支持的组件顺序
从 1.35 升 1.36 的通用顺序:
- 所有 API Server 升到目标版本(HA 逐实例,混合期最多差一版)。
- controller-manager、scheduler、cloud-controller-manager 升级。
- kubelet 逐节点 drain 后升级;次要版 kubelet 不支持不驱逐 Pod 的原地升级。
- kube-proxy 升级。
kubectl 和客户端需保持在 API Server 前后一个次要版本内。这是组件兼容顺序,不是发行版命令;具体流程以厂商文档为准。
节点维护:cordon、drain、uncordon
先确认节点上的 Pod、PDB 和本地数据:
node='worker-01'
kubectl get node "$node"
kubectl get pods -A --field-selector="spec.nodeName=$node" -o wide
kubectl get pdb -A
kubectl cordon "$node"
kubectl drain "$node" --ignore-daemonsets --delete-emptydir-data --timeout=20m
# 完成维护并验证节点健康后
kubectl uncordon "$node"drain 参数
--delete-emptydir-data 会删除该节点被驱逐 Pod 的 emptyDir 数据;应用必须把它视为临时数据。不要默认加 --disable-eviction,它绕过 PDB。带非控制器 Pod、Local PV 或特殊系统 Pod 的节点要用专用 Runbook。
逐节点操作,每步等待业务副本 Ready、错误率/延迟恢复后再继续。故障域内不要同时 drain 过多节点。
kubeadm 集群
kubeadm 通常先在第一个控制面节点升级 kubeadm 并运行 kubeadm upgrade plan/apply,再处理其余控制面和逐节点 drain 后的 kubelet。包 hold/unhold、配置 API 和准确命令必须使用目标版本的 kubeadm 升级指南,不得照抄旧教程;外部 etcd 与 stacked etcd 的流程也不同。
托管集群
- 核对控制面与节点池可选版本、强制升级日期和 EOL。
- 阅读供应商变更:OS 镜像、运行时、CNI/CSI、LB、身份、自动修复。
- 先升控制面,再滚动新节点池;高风险升级可新建节点池迁移工作负载。
- 回退控制面通常不被支持,要以修复/前滚为主要方案。
etcd 备份与恢复
etcd 快照必须来自一致、受支持的端点,包含正确证书,并加密保存到独立故障域。备份成功日志不代表可恢复:
- 记录 Kubernetes/etcd 版本、集群 ID、证书和加密配置依赖。
- 定期在隔离环境恢复,验证 API 对象和关键控制器。
- 恢复是集群级灾难操作,所有 API Server/etcd 成员必须按一致流程处理。
- 恢复旧快照会回退 Kubernetes API 状态,但不会自动回退外部云资源和业务数据库。
不要在通用文档中复制带生产证书路径的 etcdctl 命令;按集群拓扑的灾备 Runbook 执行。
升级中观察
kubectl get nodes --watch
kubectl get pods -A -o wide
kubectl get --raw='/readyz?verbose'
kubectl get apiservices
kubectl get events -A --field-selector=type=Warning同时监控用户成功率/延迟、API Server、etcd、调度、DNS、CNI/CSI、Ingress、Webhook、Pending、重启和 PDB。停止条件应是可量化阈值,而非“感觉异常”。
升级后验证
- 所有节点和控制面版本、运行时版本符合计划,无长期偏差。
- 系统组件、扩展 API、Webhook、CRD Controller 和插件 Ready。
- 创建/更新/删除测试工作负载,验证调度、DNS、Service、Ingress/Gateway、NetworkPolicy 和存储挂载。
- 执行应用冒烟、Job、HPA、日志/指标/告警和备份测试。
- 检查废弃 API 调用、新 Warning、审计和资源使用变化。
- 保留观察期,完成变更记录和新基线快照。
回退边界
工作负载镜像通常可回滚,但 Kubernetes 控制面/etcd 降级一般不受支持;API 存储转换、组件状态和外部控制器可能已经前进。升级计划必须优先设计安全前滚。若达到停止条件,暂停后续节点、隔离问题、保留证据,并调用发行版支持流程,不擅自降级二进制或恢复旧 etcd。
继续阅读
- 命令
- 故障排查
- 故障排查