1. 为什么要关心节点升级?

就像我们定期保养汽车发动机需要换机油一样,Kubernetes集群的节点组件升级是保障集群长期健康运行的关键。最近在某电商平台的生产事故中,正是由于忽视kubelet版本兼容性问题,导致整个集群的Pod调度系统瘫痪12小时。本文将手把手带您完成从理论到实践的节点升级全过程。

2. 实战环境搭建

2.1 基础配置

# 查看当前版本信息(示例节点环境)
kubectl version --short  # Client:v1.23.5 / Server:v1.23.5
containerd --version     # containerd containerd.io 1.6.8
uname -a                 # Linux worker01 5.4.0-110-generic

2.2 节点信息获取

# 使用JSONPath过滤特定节点信息
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.kubeletVersion}{"\t"}{.status.nodeInfo.containerRuntimeVersion}{"\n"}{end}'

# 输出示例:
# worker01   v1.23.5  containerd://1.6.8
# worker02   v1.23.5  containerd://1.6.6

3. kubelet升级全流程

3.1 版本比对策略

考虑版本跨度策略时,应该遵守官方建议的N-2原则(最多跨两个次版本)。比如当前版本是v1.23.x:

  • 允许直接升级到v1.24.x或v1.25.x
  • 避免直接跳升到v1.26.x

3.2 实际操作示例

# 步骤1:标记节点为不可调度
kubectl cordon worker01

# 步骤2:驱逐Pod(优雅终止时间30秒)
kubectl drain worker01 --ignore-daemonsets --delete-emptydir-data --grace-period=30

# 步骤3:升级kubelet组件(Ubuntu系统示例)
sudo apt-get update
sudo apt-get install -y kubelet=1.24.3-00 kubectl=1.24.3-00 kubeadm=1.24.3-00

# 步骤4:重启服务
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 步骤5:验证升级结果
kubectl get node worker01 -o jsonpath='{.status.nodeInfo.kubeletVersion}'
# 预期输出:v1.24.3

4. 容器运行时升级详解

4.1 containerd升级示例

# 查看当前运行时版本
containerd config default | grep version
# 示例输出:version = 1.6.8

# 停止相关服务
sudo systemctl stop kubelet
sudo systemctl stop containerd

# 执行升级操作(Ubuntu/Debian)
sudo apt-get update && sudo apt-get install -y containerd.io=1.7.0

# 配置更新(关键步骤!)
sudo containerd config default > /etc/containerd/config.toml
sudo systemctl daemon-reload

# 启动服务链路
sudo systemctl start containerd
sudo systemctl start kubelet

# 验证运行时版本
kubectl describe node worker01 | grep Container\ Runtime
# 预期显示:containerd://1.7.0

5. 关联技术解析

5.1 CRI接口兼容性

新版containerd 1.7开始默认启用CRI v1版本接口,需要确保kubelet版本支持:

# kubelet配置示例(/var/lib/kubelet/config.yaml)
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
    KubeletPodResourcesGet: true  # 支持资源监控API
containerRuntimeEndpoint: unix:///run/containerd/containerd.sock

6. 滚动升级 vs 批量升级

滚动升级策略:

# 按节点标签分批升级(生产推荐方案)
kubectl get nodes -l upgrade-group=canary | xargs -I{} kubectl cordon {}
  • 优点:业务影响小,可随时终止
  • 缺点:总耗时较长

优缺点对照表:

方案类型 耗时 风险 资源需求
滚动升级(推荐) 无需扩容
蓝绿部署 最低 双倍资源
批量升级 正常

7. 必须知道的注意事项

7.1 证书续期策略

升级后需要检查证书有效期:

openssl x509 -noout -text -in /etc/kubernetes/pki/apiserver.crt | grep Not

# 输出示例:
Not Before: Jun  1 00:00:00 2023 GMT
Not After : May 30 00:00:00 2024 GMT

若剩余有效期小于90天,需要通过kubeadm certs renew更新

7.2 回滚操作指南

# containerd降级示例
sudo systemctl stop kubelet
sudo apt-get purge containerd.io
sudo apt-get install containerd.io=1.6.8 -y
sudo systemctl start containerd && systemctl start kubelet

8. 典型应用场景分析

某视频网站升级案例:

  1. 先升级测试集群到v1.24.3
  2. 运行负载测试工具检测调度性能:
# 创建测试负载
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
# 监控指标变化
kubectl top pod -l app=nginx
  1. 观测到CPU分配精度提升15%
  2. 分三批次完成生产集群升级

9. 总结与最佳实践

经过完整升级流程后,建议执行:

# 集群健康检查清单
kubectl get componentstatuses
kubectl get nodes -o wide
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.status.containerStatuses[0].restartCount}{"\n"}{end}' | sort -nr | head -5

核心经验:

  • 采用金丝雀发布模式
  • 保留至少一个旧版本节点
  • 在业务低峰期执行操作