EKS 安全升级 Hands-on
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| AMI | Amazon Machine Image | Amazon 系统镜像 |
| API | Application Programming Interface | 应用程序编程接口 |
| AWS | Amazon Web Services | 亚马逊云服务 |
| AZ | Availability Zone | 可用区 |
| CLI | Command-Line Interface | 命令行接口 |
| CNI | Container Network Interface | 容器网络接口 |
| CRD | Custom Resource Definition | Kubernetes 自定义资源定义 |
| CSI | Container Storage Interface | 容器存储接口 |
| DNS | Domain Name System | 域名系统 |
| EBS | Elastic Block Store | AWS 块存储服务 |
| EC2 | Elastic Compute Cloud | AWS 云服务器服务 |
| EFS | Elastic File System | AWS 弹性文件存储服务 |
| EKS | Elastic Kubernetes Service | AWS 托管 Kubernetes 服务 |
| ENI | Elastic Network Interface | AWS 弹性网络接口 |
| GitOps | GitOps | 以 Git 保存期望状态、由自动化持续协调实际状态的运维方式 |
| IaC | Infrastructure as Code | 基础设施即代码 |
| IAM | Identity and Access Management | 身份与访问管理 |
| ID | Identifier | 标识符 |
| IP | Internet Protocol | 网际协议;IP 地址是网络寻址标识 |
| IRSA | IAM Roles for Service Accounts | 通过 Kubernetes 服务账号关联 AWS IAM 角色 |
| KMS | Key Management Service | 密钥管理服务 |
| LB | Load Balancer | 负载均衡器 |
| OS | Operating System | 操作系统 |
| PDB | Pod Disruption Budget | Pod 中断预算,约束自愿驱逐 |
| PV | Persistent Volume | 持久卷 |
| PVC | Persistent Volume Claim | 持久卷申领 |
| RBAC | Role-Based Access Control | 基于角色的访问控制 |
| RDS | Relational Database Service | AWS 关系型数据库服务 |
| SLO | Service Level Objective | 服务等级目标 |
| vCPU | Virtual CPU | 虚拟处理器 |
| VPC | Virtual Private Cloud | 虚拟私有云网络 |
主流程适用于 EKS + Managed Node Group(MNG)+ EKS 优化 AMI;Fargate、Auto Mode、自管节点见分支说明。只操作工作节点和 EKS API,不对托管控制面运行 kubeadm 或自行恢复 etcd。命令按 Bash 逐段执行。
1. 版本与升级顺序#
| 场景 | 路径 |
|---|---|
| 控制面补丁/平台更新 | AWS 管理,用户不指定 Kubernetes patch;关注平台发布记录与应用验证 |
| 节点安全补丁 | minor 不变,更新并固定 AMI release;会替换节点,也要做排空和数据检查 |
| N → N+1 | 当前节点先对齐 N → 兼容插件准备 → 控制面 → 插件/节点分批升级 → 验收 |
| N → N+2 及以上 | 每次一个 minor;完成整跳观察再继续,不能一次跳过中间版本 |
| 真正 1.x → 2.x / 很旧集群 | 另查迁移规则;无法满足中间版本依赖时采用新集群迁移 |
日常所说“大版本”通常是 minor;不能按软件包的主版本理解。控制面更新发起后不能暂停/取消,必须先完成检查。EKS 升级规则
2. 升级前检查与备份#
| 项目 | 必须确认 |
|---|---|
| 恢复 | Git/Helm/IaC、CRD、自定义配置有版本记录;对象/PV 备份已在隔离集群还原;RDS 等外部数据另备份 |
| API | Upgrade insights 无未解决风险;另查代码、Helm、审计日志、CRD/webhook 的废弃 API,不能仅依赖实时扫描 |
| 插件 | VPC CNI、CoreDNS、kube-proxy、EBS/EFS CSI、LB Controller、metrics-server、Mesh、监控与安全组件支持目标版本 |
| 扩缩容 | Cluster Autoscaler 对应 Kubernetes minor;Karpenter 单独查兼容矩阵,防止 consolidation 与升级同时驱逐 |
| 网络/容量 | 控制面配置的子网有升级所需空闲 IP(最多需 5 个);另预留节点/Pod IP、EC2/vCPU/ENI、各 AZ 容量和 surge 费用 |
| 业务 | 多副本、跨 AZ、健康检查、优雅退出;PDB 可驱逐一台节点;单副本/本地盘应用安排停机或迁移 |
| 身份 | 操作者 IAM 和 Kubernetes RBAC 均可用;保留备用管理入口;节点角色、IRSA/Pod Identity、KMS 权限验证通过 |
| 窗口 | 预演同一路径;冻结应用与 Schema 变更;协调 GitOps/自动缩容;定义业务 SLO、停止阈值与恢复负责人 |
可用 AWS Backup/其他支持 EKS 的工具备份对象与持久卷,但要核实资源覆盖和应用一致性;托管 etcd 不能当成可自行提取的恢复文件。参考 AWS Backup 的 EKS 支持。
export AWS_REGION='替换区域'
export CLUSTER='替换集群'
export TARGET_MINOR='1.N' # 当前 minor 或下一 minor,从下面查询后选择
aws sts get-caller-identity
aws eks describe-cluster --name "$CLUSTER" --region "$AWS_REGION"
aws eks describe-cluster-versions --region "$AWS_REGION"
aws eks update-kubeconfig --name "$CLUSTER" --region "$AWS_REGION" --alias "$CLUSTER"
kubectl config current-context
kubectl get nodes -o wide
kubectl get pods,pdb,pvc -A
aws eks list-nodegroups --cluster-name "$CLUSTER" --region "$AWS_REGION"
aws eks list-addons --cluster-name "$CLUSTER" --region "$AWS_REGION"
aws eks list-insights --cluster-name "$CLUSTER" --region "$AWS_REGION"逐条用 aws eks describe-insight --cluster-name "$CLUSTER" --region "$AWS_REGION" --id "$INSIGHT_ID" 看资源和建议。Insights 有刷新延迟,废弃 API 历史记录可能保留 30 天;修复后结合调用证据判断,不用 --force 绕过。Insights 说明
记录当前版本、目标、插件、AMI/LT、节点组标签/污点、更新参数及回退窗口。配置快照放受限目录:
umask 077
export RECORD_DIR="eks-upgrade-$(date -u +%Y%m%dT%H%M%SZ)"
mkdir -m 700 "$RECORD_DIR"
aws eks describe-cluster --name "$CLUSTER" --region "$AWS_REGION" > "$RECORD_DIR/cluster-before.json"
export NODEGROUP='替换一个节点组'
aws eks describe-nodegroup --cluster-name "$CLUSTER" --nodegroup-name "$NODEGROUP" --region "$AWS_REGION" > "$RECORD_DIR/nodegroup-before.json"每一跳升级先填写 变更执行记录,明确节点/业务超时阈值、恢复负责人及最晚决策时间;回退资格以本篇恢复章节和当次平台查询结果为准。
3. 先准备插件,再升控制面#
对每个插件选择同时支持当前/目标 minor 的版本;没有交集时按供应商给定顺序安排。EKS-managed add-on 与 Helm 自管插件分开处理,不能相互覆盖。示例以 VPC CNI 为例:
export ADDON='vpc-cni'
aws eks describe-addon --cluster-name "$CLUSTER" --addon-name "$ADDON" --region "$AWS_REGION" > "$RECORD_DIR/$ADDON-before.json"
aws eks describe-addon-versions --addon-name "$ADDON" --kubernetes-version "$TARGET_MINOR" --region "$AWS_REGION"
# 再针对当前 minor 查询,确认兼容交集;保留配置、IAM 和 Pod Identity 关联。
export ADDON_VERSION='替换已验证版本'
aws eks update-addon --cluster-name "$CLUSTER" --addon-name "$ADDON" --addon-version "$ADDON_VERSION" --resolve-conflicts PRESERVE --region "$AWS_REGION"
aws eks describe-addon --cluster-name "$CLUSTER" --addon-name "$ADDON" --region "$AWS_REGION"等状态 ACTIVE、health 无问题,再验证 DNS、网络、卷和身份。PRESERVE 不保证旧配置兼容;先核对配置 schema,不盲用 OVERWRITE。插件更新
仅 minor 升级执行下面的控制面步骤;节点补丁更新直接跳到第 4 节。先保证所有现有节点已对齐当前控制面 minor,且没有其他更新进行中。
UPDATE_ID=$(aws eks update-cluster-version --name "$CLUSTER" --kubernetes-version "$TARGET_MINOR" --region "$AWS_REGION" --query 'update.id' --output text)
aws eks describe-update --name "$CLUSTER" --update-id "$UPDATE_ID" --region "$AWS_REGION"间隔查询这个 update ID,直到 Successful;Failed 就查 errors 并停止。不能只凭集群 ACTIVE 判断本次升级完成。随后验证 API、控制器、核心业务,并完成只能在新控制面上安装的插件版本。
4. MNG:先试点,再逐组替换#
先备好可迁移容量。小节点组作为试点;若新建试点组,复制所需 IAM、网络、标签、污点、架构、存储和引导配置,确认真实业务能够调度进去。
CONFIG_ID=$(aws eks update-nodegroup-config --cluster-name "$CLUSTER" --nodegroup-name "$NODEGROUP" --update-config maxUnavailable=1 --region "$AWS_REGION" --query 'update.id' --output text)
aws eks describe-update --name "$CLUSTER" --nodegroup-name "$NODEGROUP" --update-id "$CONFIG_ID" --region "$AWS_REGION"等该配置更新 Successful 后再升级。maxUnavailable=1 不等于只新增一台机器,EKS 可能按 AZ 扩容;先确认配额。下例仅用于没有自定义 AMI 的 MNG,AMI_RELEASE 从该 minor/OS/架构对应的 EKS 优化 AMI 发布记录选择并验证:
export AMI_RELEASE='替换精确的AMI发布版本'
NODE_UPDATE_ID=$(aws eks update-nodegroup-version --cluster-name "$CLUSTER" --nodegroup-name "$NODEGROUP" --kubernetes-version "$TARGET_MINOR" --release-version "$AMI_RELEASE" --region "$AWS_REGION" --query 'update.id' --output text)
aws eks describe-update --name "$CLUSTER" --nodegroup-name "$NODEGROUP" --update-id "$NODE_UPDATE_ID" --region "$AWS_REGION"
kubectl get nodes -l "eks.amazonaws.com/nodegroup=$NODEGROUP" -o wide保持查询至 Successful,逐个确认节点版本/AMI,而不只看节点组汇总。试点验收通过后才替换下一组。MNG 更新及 AMI 行为
| 节点类型/问题 | 操作 |
|---|---|
| 自定义 AMI + Launch Template | 构建并演练兼容镜像,创建 LT 新版本;按原 LT ID 更新节点组到该版本。自定义 AMI 场景不要同时传 --kubernetes-version/--release-version |
| 自管 EC2 节点 | 新 AMI 建新节点,核对 bootstrap/nodeadm、IAM、网络与存储;逐台 cordon/drain 后替换 |
| Fargate | 控制面升级不会原地升级旧 Pod;按业务逐个 rollout/recreate,并验证新 kubelet,不能删除全部 Pod |
| Auto Mode | AWS 协调节点升级,检查 PDB、NodePool disruption budgets、容量和业务;不要套用 MNG 的 AMI 命令 |
PodEvictionFailure |
查 PDB、副本健康、调度限制和容量;修复后重试,不开启 Force 更新 |
| 想快速清空旧组 | 不直接缩 desiredSize 到 0;缩容不等价于尊重 PDB 的滚动驱逐 |
旧 AMI 系列、OS/架构迁移应单独评估,必要时新建节点组;不要在集群升级中顺手混改。
5. 验收、停止与恢复#
按 每批可执行检查 核对本批节点上的实际业务 Pod;使用本文的云端操作状态作为额外放行条件。
每组验收:新节点 Ready,CNI/CSI/监控 DaemonSet 正常;在新节点验证 DNS、跨节点通信、NetworkPolicy、镜像拉取、IRSA/Pod Identity、PVC 挂载与读写、Ingress/LB 健康、外部真实请求。观察错误率、p95、Pending、重启数、队列积压和数据库一致性,覆盖代表性流量/定时任务后再继续。
触发业务 SLO 或数据错误立即停止发起后续更新;进行中的 EKS 更新不能当成可随意取消的任务。先隔离故障节点/恢复兼容应用和插件,保留日志与 update ID。
控制面 minor 回退有条件,不是通用保险:当前官方支持原地升级完成后 7 天内退回上一个受支持 minor;必须满足 ACTIVE、功能兼容和版本支持策略,连续升级后不能一路倒退。进入延长支持需相应 policy,且可能计费;延长支持结束触发的自动升级不适用。
回退前查 ROLLBACK_READINESS Insights,先处理比目标控制面新的节点和不兼容插件;MNG/自管节点自行处理,Auto Mode 自动协调。Fargate 新版本 Pod 不能直接降级,需先安排迁移/停机和重建顺序。控制面回退保留数据状态,不恢复 PV 或应用数据。EKS 回退条件与节点处理
aws eks list-insights --cluster-name "$CLUSTER" --region "$AWS_REGION" --filter '{"categories":["ROLLBACK_READINESS"]}'
# 仅在资格、节点和插件均满足后执行;不要加 --force。
export PREVIOUS_MINOR='替换上一个minor'
ROLLBACK_ID=$(aws eks update-cluster-version --name "$CLUSTER" --kubernetes-version "$PREVIOUS_MINOR" --region "$AWS_REGION" --query 'update.id' --output text)
aws eks describe-update --name "$CLUSTER" --update-id "$ROLLBACK_ID" --region "$AWS_REGION"不符合回退条件时,走已演练的新集群恢复/迁移:恢复对象、身份和数据,验证后切 LB/Route 53。切换前做最终数据同步和写入隔离,回切也要处理新写入,不能仅改 DNS。
最终保存控制面/平台、插件、所有节点 AMI/LT 版本与验收结果,更新 Terraform/eksctl/GitOps,恢复暂停的自动化并核对支持到期日。确认无回退需求后再清理旧组和临时资源。
核对日期:2026-09-23。示例未执行真实 AWS 升级;使用前按账户、区域、CLI 与实际集群核对能力并预演。