规划 Amazon EKS 从 1.32 升级到 1.35:关键变更识别与逐版本实施路径¶
Ch11.107 规划 Amazon EKS 从 1.32 升级到 1.35:关键变更识别与逐版本实施路径¶
📊 Level ⭐⭐ | 9.3KB |
entities/规划-amazon-eks-从-132-升级到-135关键变更识别与逐版本实施路径.md
规划 Amazon EKS 从 1.32 升级到 1.35:关键变更识别与逐版本实施路径¶
概览¶
AWS 官方发布的 EKS Kubernetes 版本升级方法论,针对 1.32→1.35 跨三个 minor 版本的实战规划。核心约束:EKS 不允许跨 minor 升级,必须 1.32→1.33→1.34→1.35 逐版本进行。这套方法论可复用于所有 EKS 集群升级场景。
关键约束:不可跳版本¶
EKS 强制逐版本升级的原因: - Kubernetes API deprecation 政策:每个 minor 版本弃用 → 两个版本后删除 - 跨版本升级会一次性触发多个 deprecation 警告,diagnostics 信息丢失 - 生产风险:跳版本导致 1.32→1.35 的 API 变化累积到 ~30 个,单次升级失败概率指数级上升
升级路径四阶段¶
阶段 1:升级前评估(每个 minor 版本各做一次)¶
自管理组件风险评估: - 自定义 CRD(Cert Manager, ArgoCD, Istio 等):检查 vendor 的 Kubernetes 版本兼容矩阵 - Operator:每个 Operator 独立验证(OpenShift/Confluent/RabbitMQ) - DaemonSet:kube-proxy / CNI(Calico/Cilium)的版本对齐
托管组件确认清单: - [ ] EKS 托管 nodegroup AMI 更新到目标版本 - [ ] EKS Pod Identity 关联策略验证 - [ ] EBS CSI Driver / EFS CSI Driver 兼容性 - [ ] AWS Load Balancer Controller 版本
阶段 2:升级中(每次升级一个 minor)¶
# 1. 更新 kubeconfig
aws eks update-kubeconfig --name my-cluster --region us-east-1
# 2. 升级 control plane(AWS 托管,自动)
aws eks update-cluster-version --name my-cluster --kubernetes-version 1.33
# 3. 升级 managed nodegroup
aws eks update-nodegroup-version \
--cluster-name my-cluster \
--nodegroup-name my-ng \
--release-version 1.33-20250101
# 4. 升级 self-managed nodegroup
# (使用 AMI 替换 + 滚动重启)
阶段 3:升级后验证¶
kubectl get nodes确认所有节点 Ready + 新版本kubectl get pods -A检查 CrashLoopBackOff / ImagePullBackOff- 应用层 smoke test(关键业务 API + 数据库连接)
阶段 4:cgroup v1 → cgroup v2 迁移(1.32+ 默认)¶
关键变更:Kubernetes 1.32+ 节点默认使用 cgroup v2(统一 cgroup hierarchy) - 旧应用监控工具(cAdvisor 旧版本)可能不兼容 - JVM 应用的 -XX:+UseContainerSupport 行为变化(已自动,无需调整) - 内存 limit 行为:cgroup v2 严格按 limit 触发 OOMKill
AL2023 节点镜像迁移: - AL2 → AL2023 是 EKS 1.30+ 的推荐迁移 - AL2023 默认启用 cgroup v2 - 网络栈变更:nsswitch.conf 默认行为变化
关键变更识别表¶
| 变更项 | 影响范围 | 升级窗口期 |
|---|---|---|
| cgroup v1 → v2 | 所有节点 | 1.30+ |
| PodDisruptionBudget v1 API 移除 | 控制器 | 1.33+ |
| In-tree AWS VPC CNI → AWS VPC CNI Plugin | 网络 | 1.27+ 已完成 |
| PodSecurityPolicy 移除 | 准入控制 | 1.25+ 已完成 |
| HPA v2 → v2 API 调整 | 自动扩缩 | 1.26+ 已完成 |
升级时间窗口与回滚策略¶
- 时间窗口:每次 minor 升级 control plane 约 30 分钟,nodegroup 升级另算(依节点数)
- 回滚:EKS control plane 升级不可回滚——必须 forward fix
- 安全网:升级前 1 周全量 etcd 备份 + 关键 namespace 资源 snapshot
实践启示¶
深度分析¶
1. "不可跳版本"约束是 Kubernetes API deprecation 政策的必然结果¶
EKS 不允许跨 minor 版本升级的根本原因是 Kubernetes 的 API deprecation 政策:每个 minor 版本弃用的 API 在两个版本后删除。跨版本升级会导致 ~30 个 API 变化在单次升级中累积,任何一个兼容性问题都会导致升级失败且无法回滚。这个约束不是 AWS 的技术限制,而是 Kubernetes 社区的政策设计,其目的是确保集群升级的可预测性和可恢复性。Cilium Tetragon 中提到的运行时安全监控组件升级也遵循同样的 API 兼容性约束。
2. 自管理组件风险分级是 EKS 升级的核心工程复杂度¶
本文最有价值的方法论贡献是对自管理组件的三级风险分类(高/中/低)。真正拖慢 EKS 升级的不是 Kubernetes 本身,而是那些"挂着没人动"的自管理监控组件(Prometheus 2021年版本、Filebeat 2019年版本)。这些组件的 client-go 库与目标 K8s 版本不兼容,会在升级当天集中暴露。关键洞察:升级前评估阶段的自管理组件升级应该是独立于 Kubernetes 版本升级的独立工作项,两者解耦可以大幅简化故障排查路径。
3. cgroup v2 是 1.32+ 集群的隐形陷阱,AL2023 迁移是前置必选项¶
cgroup v1 → v2 是 Kubernetes 1.32+ 最重要的运行时变更,但它的影响是隐形的:cAdvisor 旧版本不兼容、JVM -XX:+UseContainerSupport 行为变化(已自动修复)、内存 limit 行为更严格。更关键的是 AL2 → AL2023 是 EKS 1.30+ 的推荐节点迁移路径,而 AL2023 默认启用 cgroup v2。这意味着如果你的集群还在用 AL2,在升级到 1.35 时节点将无法启动——而这个问题无法通过回滚解决,必须在升级前完成 OS 迁移。
4. cluster-autoscaler 版本必须与 Kubernetes 大版本同步¶
本文指出了一个容易被忽视的工程细节:cluster-autoscaler 的版本号需要与 Kubernetes 大版本保持一致,因此每升一个 K8s 大版本就需要同步升级一次 cluster-autoscaler,不能跨多个版本一次到位。这意味着 cluster-autoscaler 升级是每次 minor 版本升级的必做事项,而非可选的"等有空再处理"。Waylens OpenClaw EKS 实践 中的多租户 Operator 管理也涉及类似的组件版本对齐问题。
5. 四阶段升级路径是控制 blast radius 的工程方法论¶
本文的四阶段(升级前准备 → 1.32→1.33 → 1.33→1.34 → 1.34→1.35)揭示了一个关键的工程原则:每次只升级一个变量。阶段 1 的组件升级与 K8s 版本解耦,让后续任何版本升级阶段的故障排查都排除组件兼容性这个变量。这是 SRE 中"改变越小越安全"原则的具体应用。EKS 多租户 AI Agent 中提到的分阶段发布策略与此同构。
实践启示¶
- 不可跳版本是 EKS 强约束,把"升级 3 个版本"拆成 3 个独立项目更可控:每个阶段独立评估、独立验证、独立回滚方案
- cgroup v2 迁移是 1.32+ 的隐形陷阱,应用监控工具需提前升级:cAdvisor、node-exporter 等可观测组件必须支持 cgroup v2
- 升级期间禁止并发部署应用变更:blast radius 控制的原则是"每次只变一件事"
- AL2023 节点迁移是 1.30+ 集群的推荐路径,需重新验证 init 脚本:网络栈变更(nsswitch.conf)可能影响自定义初始化逻辑
- 升级前 1 周执行全量 etcd 备份 + 关键 namespace 资源 snapshot:EKS control plane 升级不可回滚,安全网是唯一保障
→ 原文存档