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 与实际集群核对能力并预演。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭