Amazon EKS集群从1.33升级到1.35实战指南
1. 项目概述最近在帮客户升级Amazon EKS集群时从1.33版本升级到1.35版本的过程中积累了不少实战经验。EKS作为AWS托管的Kubernetes服务版本升级看似简单但实际操作中会遇到各种意想不到的问题。本文将详细记录整个升级过程包括前期准备、升级步骤、问题排查以及一些实用技巧。Kubernetes版本迭代速度很快每个新版本都会带来性能改进、安全增强和新功能。从1.33到1.35的升级虽然只是两个小版本跨度但涉及API变化、组件更新等关键变更。通过这次升级我深刻体会到魔鬼藏在细节中这句话的含义。2. 升级前的准备工作2.1 版本兼容性检查首先需要确认当前集群状态是否满足升级条件。EKS 1.35要求控制平面和节点组之间保持最多两个小版本的差异。也就是说如果你的节点组运行的是1.33版本那么控制平面可以安全升级到1.35。使用以下命令检查当前集群版本kubectl version --short aws eks describe-cluster --name cluster-name --query cluster.version2.2 备份关键资源升级前必须备份以下资源所有命名空间下的资源定义YAML文件关键配置如ConfigMap、Secret持久化卷数据我习惯使用Velero进行集群备份velero backup create pre-upgrade-backup --include-namespaces*2.3 检查废弃API1.35版本废弃了一些旧的API需要提前检查kubectl api-resources --verbslist --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -A重点关注以下API的变化networking.k8s.io/v1beta1 → v1storage.k8s.io/v1beta1 → v1batch/v1beta1 → batch/v13. 控制平面升级3.1 通过AWS控制台升级登录AWS管理控制台导航到EKS服务选择目标集群点击更新集群版本选择1.35作为目标版本确认变更并开始升级注意控制平面升级通常需要10-30分钟期间API服务器会有短暂不可用3.2 验证控制平面升级升级完成后验证控制平面版本aws eks describe-cluster --name cluster-name --query cluster.version同时检查核心组件状态kubectl get pods -n kube-system4. 节点组升级4.1 创建新节点组建议创建新节点组而不是原地升级现有节点组在EKS控制台选择添加节点组选择与集群相同的Kubernetes版本(1.35)配置与现有节点组相同的设置(实例类型、标签等)4.2 逐步迁移工作负载使用kubectl cordon和drain安全迁移Pod# 标记旧节点不可调度 kubectl cordon old-node # 排空节点上的Pod kubectl drain old-node --ignore-daemonsets --delete-emptydir-data4.3 验证节点版本确认所有节点运行1.35版本kubectl get nodes -o wide5. 核心组件升级5.1 CoreDNS升级1.35版本推荐使用CoreDNS 1.8.7kubectl apply -f https://raw.githubusercontent.com/aws/eks-charts/master/stable/coredns/coredns.yaml5.2 kube-proxy升级升级kube-proxy到匹配版本kubectl apply -f https://raw.githubusercontent.com/aws/eks-charts/master/stable/kube-proxy/kube-proxy.yaml5.3 VPC CNI插件升级建议升级到最新兼容版本kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/v1.12.0/aws-k8s-cni.yaml6. 常见问题与解决方案6.1 Pod无法调度症状Pod卡在Pending状态 排查kubectl describe pod pod-name kubectl get events --sort-by.metadata.creationTimestamp常见原因节点资源不足节点选择器/亲和性配置问题存储卷挂载失败6.2 网络连接问题症状Pod间通信失败 排查kubectl run -it --rm --restartNever test-pod --imagebusybox -- sh # 在测试Pod内尝试连接目标服务解决方案检查安全组规则验证网络策略确认VPC CNI插件正常运行6.3 API访问异常症状kubectl命令超时或返回错误 排查aws eks update-kubeconfig --name cluster-name --region region kubectl cluster-info解决方案检查IAM权限验证kubeconfig配置确认控制平面健康状态7. 升级后验证7.1 功能测试运行端到端测试验证核心功能部署测试应用验证服务发现测试自动扩展检查日志收集7.2 性能基准比较升级前后关键指标kubectl top nodes kubectl top pods重点关注API响应时间Pod启动时间网络吞吐量7.3 监控告警确认监控系统正常工作Prometheus指标收集Grafana仪表板自定义告警规则8. 回滚方案虽然EKS不支持控制平面降级但可以回滚节点组将流量切回旧节点组删除新节点组修复问题后重新尝试升级对于应用层问题可以使用备份恢复velero restore create --from-backup pre-upgrade-backup9. 实战经验分享在这次升级过程中我总结了几个关键经验分阶段升级先升级少量非关键节点组验证稳定后再全面升级监控黄金指标特别关注API服务器延迟、错误率和Pod启动成功率文档记录详细记录每个步骤和观察结果便于问题排查预留缓冲时间实际升级时间往往比预期长特别是遇到问题时利用AWS支持遇到棘手问题时AWS支持团队能提供有价值的建议一个特别有用的调试技巧是使用临时Pod检查网络连通性kubectl run -it --rm --restartNever debug-pod --imagenicolaka/netshoot -- /bin/bash在这个Pod中可以使用各种网络工具(telnet、dig、curl等)诊断连接问题。