1. Kubernetes集群升级全景解析
作为一名长期维护生产环境Kubernetes集群的运维工程师,我经历过无数次版本升级的考验。今天要分享的是使用kubeadm工具升级集群的完整实战经验,特别是从1.34.x升级到1.35.x版本的全过程。不同于官方文档的标准化描述,这里会包含大量只有实际踩过坑才能获得的实操细节。
集群升级本质上是一个系统工程,涉及控制平面组件、工作节点、网络插件等多个维度的协同更新。在开始之前,我们必须明确几个关键原则:
- 版本跳跃限制:Kubernetes严格禁止跨次版本升级(如直接从1.33跳到1.35),必须逐版本升级
- 组件版本对齐:kubelet版本可以略低于kubeadm版本,但必须处于官方支持范围内
- 升级顺序铁律:先主控制节点→其他控制节点→工作节点的顺序不可颠倒
重要提示:生产环境升级前必须确保已禁用swap分区,否则kubelet服务将无法正常启动。这是很多工程师容易忽略的关键前置检查项。
2. 升级前的深度准备
2.1 环境检查清单
在真正执行升级命令前,我们需要完成以下准备工作:
-
发行说明研读:仔细阅读目标版本的CHANGELOG,特别关注Breaking Changes部分。例如1.35版本对某些API的弃用可能影响现有工作负载。
-
备份策略实施:
- 使用
etcdctl snapshot save备份etcd数据 - 备份/etc/kubernetes目录下的所有配置文件
- 对关键业务Pod进行快照备份(Velero是不错的选择)
- 使用
-
仓库配置验证:
bash复制# 检查当前启用的仓库 grep -r "pkgs.k8s.io" /etc/apt/sources.list.d/ # 更新仓库索引 sudo apt update sudo apt-cache madison kubeadm
2.2 特殊场景处理方案
对于使用外部etcd的集群,需要特别注意:
- 提前准备etcd的CA证书和客户端证书
- etcd升级应独立于控制平面升级
- 建议先升级etcd集群,再升级Kubernetes控制平面
3. 控制平面节点升级实战
3.1 首个控制节点升级
这是整个升级过程中最关键的环节,操作步骤如下:
-
kubeadm工具升级:
bash复制# 解除版本锁定并安装指定版本 sudo apt-mark unhold kubeadm && \ sudo apt-get update && \ sudo apt-get install -y kubeadm='1.35.2-*' && \ sudo apt-mark hold kubeadm # 验证版本 kubeadm version -o short -
升级预检:
bash复制
kubeadm upgrade plan这个命令会输出关键信息:
- 可升级的目标版本
- 各组件当前版本与目标版本对比
- 配置迁移提示
-
执行升级:
bash复制sudo kubeadm upgrade apply v1.35.2这个过程中会自动完成:
- 更新静态Pod清单(API Server、Controller Manager等)
- 生成新的证书(如有必要)
- 更新CoreDNS和kube-proxy配置
-
CNI插件升级:
根据使用的CNI插件类型(Calico/Flannel等),参照对应文档升级网络组件。
3.2 其他控制节点升级
从第二个控制节点开始,流程有所简化:
bash复制# 升级kubeadm工具(同首个节点)
sudo kubeadm upgrade node
# 特别注意:不需要执行apply和CNI升级
4. 工作节点升级策略
工作节点升级应采用滚动更新的方式,确保业务连续性:
4.1 标准升级流程
-
标记节点不可调度:
bash复制
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data这个命令会:
- 标记节点为不可调度(cordon)
- 驱逐所有Pod(DaemonSet除外)
- 等待优雅终止(默认15秒)
-
升级组件:
bash复制# 升级kubeadm sudo apt-mark unhold kubeadm && \ sudo apt-get install -y kubeadm='1.35.2-*' && \ sudo apt-mark hold kubeadm # 执行节点升级 sudo kubeadm upgrade node # 升级kubelet和kubectl sudo apt-mark unhold kubelet kubectl && \ sudo apt-get install -y kubelet='1.35.2-*' kubectl='1.35.2-*' && \ sudo apt-mark hold kubelet kubectl -
重启服务:
bash复制sudo systemctl daemon-reload sudo systemctl restart kubelet -
恢复调度:
bash复制
kubectl uncordon <node-name>
4.2 大规模集群升级技巧
对于超过50个节点的集群,建议:
-
使用节点标签分批升级:
bash复制
kubectl get nodes -l upgrade-group=group1 -
结合PodDisruptionBudget确保关键业务:
yaml复制apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: zk-pdb spec: minAvailable: 2 selector: matchLabels: app: zookeeper
5. 故障排查与回滚方案
5.1 常见问题处理
问题1:升级后kubelet无法启动
bash复制# 查看详细日志
journalctl -xeu kubelet | grep -i error
可能原因:
- 证书过期 → 手动轮换证书
- 配置冲突 → 检查/var/lib/kubelet/config.yaml
问题2:API Server不可用
bash复制# 检查静态Pod状态
sudo crictl pods --name kube-apiserver
解决方案:
- 检查/etc/kubernetes/manifests下的清单文件
- 从备份恢复(位于/etc/kubernetes/tmp)
5.2 紧急回滚步骤
如果升级失败且自动回滚未生效:
-
恢复etcd数据:
bash复制sudo systemctl stop kubelet sudo rm -rf /var/lib/etcd sudo cp -r /etc/kubernetes/tmp/kubeadm-backup-etcd /var/lib/etcd sudo systemctl start kubelet -
恢复组件清单:
bash复制sudo cp /etc/kubernetes/tmp/kubeadm-backup-manifests/* /etc/kubernetes/manifests/ -
降级软件包版本:
bash复制sudo apt-get install -y kubeadm='1.34.x-*' kubelet='1.34.x-*' kubectl='1.34.x-*'
6. 升级原理深度解析
理解kubeadm升级的内部机制有助于快速定位问题:
6.1 控制平面升级流程
-
版本验证阶段:
- 检查当前集群状态是否健康
- 验证版本偏差策略(kubelet不能比kubeadm高版本)
-
镜像准备阶段:
- 从k8s.gcr.io拉取新版本镜像
- 支持通过--image-repository参数自定义仓库
-
配置迁移阶段:
- 处理kubeadm-config ConfigMap的版本转换
- 生成新的组件配置文件
6.2 证书管理策略
kubeadm会自动处理证书更新:
- 检查现有证书有效期
- 距离过期不足180天时会自动轮换
- 旧证书备份在/etc/kubernetes/tmp目录
可以通过以下命令手动检查:
bash复制openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not
7. 实战经验与避坑指南
经过多次生产环境升级,总结出以下黄金法则:
-
etcd升级特别注意事项:
- 在升级包含etcd的控制节点前,先执行:
bash复制这样可以避免API请求在etcd升级过程中卡住sudo killall -s SIGTERM kube-apiserver sleep 20
- 在升级包含etcd的控制节点前,先执行:
-
版本锁定机制:
使用apt-mark hold防止意外升级:bash复制sudo apt-mark hold kubeadm kubelet kubectl -
升级后必检项:
- 检查所有节点Ready状态:
kubectl get nodes -o wide - 验证CoreDNS版本:
kubectl get deployment -n kube-system coredns -o yaml | grep image - 测试业务Pod网络连通性
- 检查所有节点Ready状态:
-
灰度验证策略:
- 先升级测试集群验证兼容性
- 使用kubectl diff检查资源变更
- 对关键业务进行全链路测试
升级完成后,建议运行集群一致性测试:
bash复制# 使用sonobuoy进行验证
sonobuoy run --mode=certified-conformance