升级Kubernetes集群是每一个运维工程师的必修课,但如果没做好版本兼容性验证或数据备份,轻则服务中断,重则数据丢失。今天我们就以「煮咖啡」的视角,带大家摸透升级的核心门道,让你既能体验新功能,又不会因踩坑毁掉整个下午的好心情。


1. 升级前的"咖啡豆筛选":版本兼容性

Kubernetes的版本迭代就像咖啡豆产地不同,如果混用不兼容的组件,煮出来的咖啡绝对会酸涩难咽。

1.1 核心原则:主版本不能跨代跳跃

官方要求控制平面组件(如kube-apiserver)和kubelet之间的版本差异不能超过2个次版本。例如:

  • 若主节点运行v1.24.0,则节点最高支持到v1.26.0
  • 错误示范:若集群存在v1.22.0的kubelet,直接升级到v1.25.0会导致通信故障
1.2 实操验证:用kubectl做"豆子检测"
kubectl version --short
# 输出示例:
# Client Version: v1.24.0
# Server Version: v1.24.0

# 若某节点返回kubelet版本为v1.22.0,必须优先升级该节点
1.3 隐藏雷区:ETCD版本绑定

假设从K8s v1.24升级到v1.26,需同步升级ETCD:

# 查看当前ETCD版本
kubectl describe pod etcd-master -n kube-system | grep Image
# 输出示例:k8s.gcr.io/etcd:3.5.3-0

# 升级到ETCD 3.5.4后再升级kube-apiserver

2. 数据备份:防止手抖打翻咖啡杯

数据备份就像提前准备一条干毛巾,即使咖啡洒了也能迅速收拾残局。

2.1 核心数据分类
  • 有状态服务数据:MySQL、Redis等持久化存储
  • 集群元数据:ETCD快照、RBAC配置
  • 应用配置:Deployment、Secret等YAML文件
2.2 Velero实战备份

(技术栈:AWS S3 + Velero 1.10)

# 安装Velero
velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.6.1 \
  --bucket my-k8s-backup \
  --backup-location-config region=us-west-1 \
  --snapshot-location-config region=us-west-1

# 手动触发全量备份
velero backup create full-backup-202311 --include-namespaces=*

# 验证备份状态
velero backup describe full-backup-202311 --details
2.3 ETCD快照双保险
# 获取当前快照
sudo ETCDCTL_API=3 etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /tmp/etcd-snapshot-202311.db

3. 技术搭档:Helm的角色扮演

在升级过程中,Helm相当于你的"咖啡糖罐",帮助管理复杂的Chart配置:

# 查看当前Chart版本
helm list -n monitoring
# 输出示例:
# NAME    NAMESPACE   REVISION  STATUS    CHART          APP VERSION
# prometheus monitoring  2         deployed  prometheus-15.7.0  v2.35.0

# 优先回滚Chart到兼容版本
helm rollback prometheus 1 -n monitoring

4. 应用场景与避坑逻辑

4.1 典型场景
  • 开发环境:可尝试夜间自动滚动升级(但需设置PodDisruptionBudget)
  • 生产环境:蓝绿升级 + 流量镜像验证
  • 混合版本集群:控制平面先升级,逐步替换旧节点
4.2 版本跳跃的风险比价
升级跨度 风险等级 耗时预估
次版本+1 ★☆☆☆☆ 1小时
次版本+2 ★★★☆☆ 3小时
主版本+1 ★★★★★ 需重建集群

5. 那些年我们踩过的坑

  • 滚动升级卡死:某DaemonSet未设置terminationGracePeriodSeconds,导致旧Pod无法退出
  • CNI网络异常:Calico从v3.20升级到v3.24后,因IPAM配置冲突导致跨节点不通
  • 证书过期连锁反应:升级后发现apiserver证书有效期仅剩1天,被迫降级续签

6. 总结

升级Kubernetes就像驾驶一辆高速行驶的汽车更换轮胎——必须严格遵循操作手册。坚持「一次跨越一个版本、双重备份验证、灰度流量观察」三原则,你会惊喜地发现,这杯升级后的"咖啡"居然比之前更香醇了。