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. 典型应用场景分析
某视频网站升级案例:
- 先升级测试集群到v1.24.3
- 运行负载测试工具检测调度性能:
# 创建测试负载
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
# 监控指标变化
kubectl top pod -l app=nginx
- 观测到CPU分配精度提升15%
- 分三批次完成生产集群升级
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
核心经验:
- 采用金丝雀发布模式
- 保留至少一个旧版本节点
- 在业务低峰期执行操作
评论