1. 为什么要升级Kubernetes?

每次Kubernetes版本更新都会带来性能优化、安全补丁和新功能。1.30版本相较于1.29,不仅修复了CVE-2023-44487等安全漏洞,还优化了调度算法和CRD的扩展性。如果你的集群已经运行了多个生产环境应用,升级能让你的基础设施保持竞争力——就像给汽车换新引擎一样重要。


2. 应用场景分析

  • 版本维护周期:官方对每个版本提供约1年支持,超过期限将无法获取安全补丁。
  • 新功能依赖:例如1.30新增的kubectl events增强可观察性,需升级才能使用。
  • 跨版本兼容:当其他组件(如Istio、Prometheus)需要适配新版API时。

3. 技术栈与环境说明

本文以kubeadm管理的集群为例,底层操作系统为Ubuntu 22.04 LTS,网络插件为Calico 3.25。以下是当前环境状态:

kubectl version --short
# Client Version: v1.29.3
# Server Version: v1.29.5

# 检查节点状态
kubectl get nodes
# NAME       STATUS   ROLES           AGE   VERSION
# master01   Ready    control-plane   58d   v1.29.5
# worker01   Ready    <none>          58d   v1.29.5

4. 完整升级步骤(含代码示例)

4.1 准备工作:备份与健康检查
# 备份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 /opt/etcd-backup.db

# 检查集群健康状态
kubectl get componentstatus
# NAME                 STATUS    MESSAGE             ERROR
# scheduler            Healthy   ok                  
# controller-manager   Healthy   ok                  
# etcd-0               Healthy   {"health":"true"}
4.2 升级控制平面
# 升级kubeadm工具(在所有控制节点执行)
sudo apt-get update && sudo apt-get install -y --allow-change-held-packages kubeadm=1.30.0-00

# 检查升级计划
sudo kubeadm upgrade plan
# [upgrade/config] Making sure the configuration is correct...
# Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT       AVAILABLE
Kubelet     1 x v1.29.5   v1.30.0

# 应用升级(此处执行耗时约15分钟)
sudo kubeadm upgrade apply v1.30.0
# [upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.30.0". Enjoy!

# 更新kubelet配置(需逐节点操作)
sudo systemctl daemon-reload
sudo systemctl restart kubelet
4.3 升级Worker节点
# 对每个Worker节点执行以下操作:
# 1. 标记节点不可调度
kubectl cordon worker01

# 2. 驱逐节点上的Pod
kubectl drain worker01 --ignore-daemonsets --delete-emptydir-data

# 3. 升级kubelet组件
sudo apt-get update && sudo apt-get install -y kubelet=1.30.0-00 kubectl=1.30.0-00

# 4. 重启服务
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 5. 恢复节点调度
kubectl uncordon worker01

5. 升级验证与回滚

# 查看节点版本是否更新
kubectl get nodes -o wide
# NAME       STATUS   ROLES           VERSION   INTERNAL-IP  
# master01   Ready    control-plane   v1.30.0   10.0.0.1     
# worker01   Ready    <none>          v1.30.0   10.0.0.2

# 功能测试:创建测试Deployment
kubectl create deployment nginx-test --image=nginx:1.25
kubectl get pods -l app=nginx-test
# NAME                        READY   STATUS    RESTARTS   AGE
# nginx-test-79cd8b9f-7q2gj   1/1     Running   0          1m

# 如何回滚(仅限极端情况):
# 恢复ETCD备份,然后重新部署旧版本组件

6. 技术优缺点分析

优势:

  • 零停机:滚动升级可确保应用持续可用
  • 过程可控:分节点逐步验证
  • 兼容性保证:kubeadm提供版本迁移路径

潜在风险:

  • API弃用:需检查现有YAML是否使用废弃字段
  • 插件适配:如CNI网络插件可能需要同步升级
  • 资源占用:新版控制平面内存占用可能增加10%~15%

7. 必知的注意事项

  1. 顺序问题:先升级控制平面再处理Worker节点
  2. Pod中断预算:使用PDB保护关键应用
  3. 镜像缓存:提前拉取新版pause镜像避免卡顿
  4. 有状态服务:StatefulSet需特殊处理(如分片升级)
  5. 测试策略:在预发环境演练至少一次完整流程

8. 关联技术延伸

Calico网络插件升级示例:

# 查看当前Calico版本
kubectl get daemonset -n kube-system calico-node -o yaml | grep image:
# image: docker.io/calico/node:v3.25.0

# 升级到v3.26.1(需与K8s版本兼容)
kubectl set image daemonset/calico-node -n kube-system \
  calico-node=docker.io/calico/node:v3.26.1

9. 总结与展望

经过上述步骤,你的集群已经成功过渡到1.30版本。这就像给一架飞行中的飞机更换引擎,需要精密操作和充分预案。虽然整个流程可能需要2-3小时(取决于集群规模),但带来的安全性和性能提升值得投入。未来可以考虑建立自动化升级流水线,结合Argo CD等工具实现更丝滑的版本管理。