EKS vs GKE:超大规模 Kubernetes 集群架构的性能深度对比(100K+ 节点)
AI 训练的爆发式增长,正在把 Kubernetes 集群推向前所未有的规模。当单个训练任务可能需要数万张 GPU 同时协作时,“一个集群究竟能撑多大”就不再是理论问题,而是实打实的基础设施决策。
到 2025 年底,Google Cloud 和 AWS 几乎同时给出了各自的答案:GKE 展示了一个 130,000 节点的集群演示1,EKS 则正式提供了 100,000 节点超大规模集群支持2。两者都在为超大规模 AI 工作负载铺路,但它们的架构路线却截然不同:GKE 直接用 Spanner 替换 etcd,而 EKS 则保留 etcd 并对其做了深度改造3。
本文将从规模指标、存储架构、调度能力、节点生命周期管理以及运维取舍等多个角度,比较这两种超大规模 Kubernetes 路线。
架构总览:GKE vs EKS
flowchart TD
subgraph GKE["☁️ GKE — 130K Nodes"]
direction TB
GA["API Server"] --> GS["Spanner"]
GS --> GS1["天然分布式<br>无需分片"]
GS --> GS2["1M+ Objects<br>13,000 QPS"]
GA --> GK["Kueue"]
GK --> GK1["Gang Scheduling<br>93 秒抢占 39K Pods"]
GA --> GN["节点管理"]
GN --> GN1["Node Problem Detector<br>+ 自动修复"]
end
subgraph EKS["☁️ EKS — 100K Nodes"]
direction TB
EA["API Server"] --> ES["etcd(深度改造)"]
ES --> ES1["Raft 共识卸载<br>BoltDB 放在 tmpfs 上"]
ES --> ES2["Key-space 分区<br>10M+ Objects / 32 GB"]
EA --> EK["Karpenter"]
EK --> EK1["节点自动扩缩<br>2,000 nodes/min"]
EA --> EM["节点管理"]
EM --> EM1["自动修复<br>100 分钟滚动更新"]
end
规模指标对比:130K vs 100K
根据 Google Cloud 和 AWS 公开披露的数据,下面整理出几个最关键的对比指标:
| 指标 | GKE(130K nodes) | EKS(100K nodes) |
|---|---|---|
| Pod 调度吞吐量 | ~1,000 pods/sec | ~500 pods/sec(分阶段部署,无单批次指标) |
| 130K Pods 启动时间 | 3 分 40 秒 | 无对应公开数据 |
| 节点加入速率 | 未特别强调 | 2,000 nodes/min(50 分钟完成 100K) |
| 存储后端 | Spanner(分布式) | etcd(BoltDB 从 EBS 搬到 tmpfs 以降低 I/O 延迟) |
| 数据库对象数 | 1,000,000+ | 10,000,000+ |
| Lease 更新 QPS | 13,000 QPS | 未明确公布 |
| Gang scheduling | 支持,Kueue(93 秒抢占 39K Pods) | 未提及 |
| 节点自动修复 | 在基准材料中未作为重点强调 | 支持 |
| 100K 节点滚动更新 | 在基准材料中未作为重点强调 | ~100 分钟(依赖 Karpenter disruption budgets) |
如果只看公开出来的核心数字,GKE 在调度速度和最大节点数上更占优势。更值得注意的是,GKE 在平台层做了更多深度集成:Kueue 的 gang scheduling、Spanner 控制面后端,以及内建的节点扩缩能力,都更像是平台“开箱即用”的能力,而不是交给用户自己拼装的方案。
相比之下,EKS 公开了更完整的大规模集群运维数据,但要达到这些结果,背后需要相当多的工程优化。这些优化大致可以分成两层:
- AWS 平台层改造:包括 etcd 的 key-space 分区、把 BoltDB 放到 tmpfs、把 Raft 共识卸载到 AWS 内部日志系统,以及修复 API Server informer cache 的锁竞争问题。这些都是 AWS 在控制面内部完成的改造,不需要用户自行配置。
- 用户层调优:包括 Karpenter 的 disruption budget 参数、把 SOCI Snapshotter 预装进节点 AMI、镜像拉取策略,以及工作负载层面的资源配置。这些仍然需要用户根据自己的场景去理解和优化。
换句话说,GKE 把更多复杂性收进了平台内部,而 EKS 则把更多调优自由度,以及相应责任,留给了用户。这种差异的根源,首先来自两者完全不同的存储架构。
存储架构:Spanner vs 深度改造后的 etcd
这是整个比较里最关键的架构差异,也很可能是决定两者扩展上限的核心因素。
GKE 的路线:直接用 Spanner 替换 etcd
GKE 选择了更激进的做法:直接把 Kubernetes 控制面的后端存储从 etcd 换成 Google 自家的 Spanner1。Spanner 是为大规模一致性和水平扩展设计的分布式数据库,因此 GKE 不需要继续和 etcd 的传统瓶颈正面缠斗,而是从一个完全不同的架构起点出发。
从公开数据来看,GKE 在 130K 节点规模下实现了 13,000 QPS 的 lease 更新吞吐,并没有明显表现出逼近极限的迹象。控制面还处理了超过 100 万个对象,这对 Spanner 来说并不算激进负载。
这种设计的好处是,不需要围绕分片策略或内存优化做太多额外工程,因为 Spanner 本身已经解决了分布式一致性和扩展性问题。代价则是它离上游 Kubernetes 更远了:标准 Kubernetes 默认依赖 etcd,而 GKE 直接换成 Spanner,意味着控制面本身已经是高度定制化的实现。
EKS 的路线:保留 etcd,但对其做大规模底层重构
EKS 则走了相反的路线。它保留 etcd 作为控制面存储,但围绕 etcd 做了大量底层优化:
- Raft consensus 卸载:把 etcd 的 Raft 协调逻辑卸载到 AWS 内部 journal 系统,以降低共识延迟
- BoltDB 放到内存后端:把底层 BoltDB 引擎从磁盘迁移到 tmpfs,大幅降低 I/O 延迟
- Key-space 分区:对 etcd 的 key space 做分区,据称最多可带来 5 倍写入吞吐提升
通过这些改造,EKS 对外披露的 etcd 总体量达到 32 GB(跨分区),数据库对象数超过 1,000 万3。不过,由于这两份测试报告的测试条件和统计口径并不完全一致,更稳妥的解读方式是:EKS 公开展示了更高数量级的对象规模,而不是直接得出“它的存储能力一定比 GKE 强 10 倍”这样的结论。
继续沿用 etcd 的好处是:EKS 在接口层面更接近上游 Kubernetes,不太容易踩到规范兼容性的坑。代价同样很明显:工程复杂度极高,每一层 etcd 深度改造都需要大量验证来保证稳定性。
调度能力:Kueue Gang Scheduling vs 默认调度器模型
在超大规模集群中,存储架构决定的是控制面“能不能撑住”,但对 AI 训练工作负载来说,调度器的行为更直接决定了 GPU 利用率和整体训练效率。传统 Kubernetes 调度本质上是一种“一次调度一个 Pod”的模式,这对很多微服务场景没有问题,但对于大规模分布式训练,部分调度成功往往会直接导致昂贵算力被浪费。
想象一个需要 1,000 张 GPU 的分布式训练任务,如果调度器只成功放置了 800 张,剩余资源又被其他作业抢走,那么这 800 张 GPU 很可能只能空转等待,既无法开始训练,也没法释放出来给别的任务使用。在十万级节点规模下,这种资源碎片化问题会被进一步放大。
这就是为什么 gang scheduling 在 AI 训练场景里如此关键:一组 Pods 要么同时启动,要么就不该启动。如果一个需要 1,000 张 GPU 的训练任务只分配到 999 张,那么这 999 张也可能全部被浪费。
GKE 在这一点上展示了明显优势。通过集成 Kueue 这个 Kubernetes 原生排队框架,GKE 展示了在 93 秒内抢占 39,000 个 Pods,从而为高优先级训练任务腾出资源的能力1。这个数字在真实 AI 环境里非常有价值。需要紧急回收资源时,93 秒和几分钟甚至更久,差别是非常大的。
相比之下,EKS 的公开材料并没有给出 gang scheduling 方案或相应测试数据。这并不意味着 EKS 不能做 gang scheduling,因为 Kueue 同样可以部署在 EKS 上。但至少从当前公开材料来看,GKE 在这一维度上给出了更强的开箱即用集成,以及经过大规模验证的数据点。
EKS 公开了更完整的节点生命周期数据
如果说调度是 GKE 的强项,那么大规模节点运维则是 EKS 更突出的地方。EKS 公开了更完整的节点生命周期数据:
- 节点加入速率:每分钟 2,000 个节点,50 分钟完成 100K 节点集群构建
- 节点自动修复:自动检测故障节点并触发修复
- 100K 节点滚动更新:依靠 Karpenter disruption budgets,在大约 100 分钟内完成整个集群的滚动更新
测试环境还把 SOCI Snapshotter 预装进节点 AMI,以延迟容器镜像加载,降低大规模启动时镜像拉取带来的瞬时带宽压力。在 API Server 层面,EKS 团队也受益于 v1.31 引入的缓存强一致读取,同时还向上游贡献了 informer cache 锁竞争修复(PR #132132 和 #130767)3。
GKE 在 130K 节点测试中公开的大规模运维细节相对较少,但这并不应该被解读为 GKE 在节点修复或自动化方面较弱。更合理的解释是,这次公开材料的叙事重点主要放在控制面吞吐和扩展天花板,而不是完整生产生命周期流程。
实际上,GKE 本身已经具备不少平台内建能力,可以覆盖 EKS 报告里强调的大部分类自动修复场景:
- Node Problem Detector + 自动替换:GKE 默认启用 Node Problem Detector,节点可以上报常见 OS、kubelet 和容器运行时异常;当健康状态持续异常时,托管节点池可以自动 drain 并重建节点。
- Managed Instance Group(MIG)和节点池控制回路:对于很多基于 VM 的 GKE 节点池,真正负责维持期望节点数和替换异常节点的,是底层的 managed instance group。
- 结合自动升级与自动修复的受控滚动替换:GKE 已经具备围绕 cordon、drain、PodDisruptionBudget 和优雅终止默认策略的节点升级与替换机制。只是 Google 这次没有把“100K 节点滚动更新需要多久”作为主打测试指标4。
因此,更准确的表述应该是:EKS 公开了更完整、可直接对照的大规模运维数字,而 GKE 在这方面公开细节较少。但这并不代表 GKE 缺少节点健康探测或自动修复能力。差异既来自平台设计,也来自测试报告的叙事方式和指标选择。
如何解读这些测试结果
在下结论之前,需要先明确一个前提:这两份测试报告并不是完全等条件的对比。
GKE 的 130K 节点结果更像是一场工程能力展示,重点在于说明控制面在理想条件下的扩展上限。它强调的是 Pod 调度吞吐、Spanner 后端表现,以及 Kueue 的 gang scheduling 能力1。
EKS 的 100K 节点结果则更接近生产导向的运维模拟,覆盖了节点加入、滚动更新和故障恢复等 Day-2 运维数据2。不过,EKS 的故障模拟只停用了 1,000 个节点,也就是整个集群的 1%,相较于真实世界里更苛刻的故障域,可能仍偏保守。
两份报告都来自各自云厂商的官方发布,因此都会优先展示最有利的数据点。真正比较时,既要看“公开了什么”,也要看“没有公开什么”。GKE 没公布滚动更新数据,不代表它做不好;EKS 没公布 gang scheduling 数据,也不代表它无法通过开源方案实现类似能力。
结语
回头来看,GKE 和 EKS 在超大规模集群上走的是两条不同的路线,但它们要解决的核心问题是一致的:如何在 100K 节点规模下保持 Kubernetes 控制面稳定,同时有效调度并运营大规模 AI 训练工作负载。
可以把两者的高层差异总结如下:
| 维度 | GKE 130K | EKS 100K |
|---|---|---|
| 存储架构 | Spanner 天然分布式,绕开 etcd 的经典单系统瓶颈 | etcd 经过深度重构,包括 Raft 卸载、BoltDB 放在 tmpfs 上,以及 key-space 分区,对象数达到 10M+ |
| Pod 调度吞吐量 | ~1,000 pods/sec,130K Pods 在 3 分 40 秒内启动 | ~500 pods/sec,采用分阶段部署 |
| Gang Scheduling | 展示了 Kueue 集成,并可在 93 秒内抢占 39K Pods | 公开报告未提及,但依然可以自行部署 Kueue |
| 节点生命周期运维 | 有 Node Problem Detector、自动修复和 MIG 自愈能力,但没有公开这个规模下的测试数字 | 有 Karpenter disruption budgets、100 分钟完成 100K 节点滚动更新,以及节点监控代理 + 自动修复 |
| Kubernetes 规范兼容性 | 因 Spanner 替代 etcd,控制面更偏定制化 | 保留 etcd,整体上更接近上游默认假设 |
| 平台工程复杂度 | 更多复杂性由平台吸收 | 用户仍需处理更多显式调优,包括 Karpenter、SOCI Snapshotter 和镜像策略 |
还需要强调一点:节点自动修复并不是 EKS 独有的能力。GKE 早已具备 Node Problem Detector 和自动修复机制,可以检测 OS、kubelet 和容器运行时层面的异常并自动替换故障节点5;而 EKS 也已经补上了节点监控代理和自动修复功能6。两者在这方面的能力正在逐渐趋同。更大的差异在于:EKS 公开了更完整的大规模 Day-2 运维故事,而 GKE 的 130K 节点文章更聚焦于控制面吞吐和调度上限12。
那么,该怎么选?
- 如果你的核心场景是 突发式 AI 训练,需要快速调度数万个 Pods,并依赖 gang scheduling 避免 GPU 空转,那么目前公开数据里,GKE 基于 Spanner + Kueue 的路线给出了更高的上限。
- 如果你更关注 Kubernetes 规范兼容性,以及 大规模运维流程的可预测性,例如滚动更新要多久、故障恢复流程如何落地,那么 EKS 给出了更完整、也更容易复现的公开运维数据7。
如果你两者都在意,那么最难的问题其实不再是“单个集群能不能撑到这个规模”,而是“你的团队能不能长期稳定地运维这么大的集群”。在这个规模下,分而治之依然是最务实的策略。基于工作负载特性、团队边界和故障域,把工作负载拆分到多个集群里,通常会比把所有东西都塞进一个超级大集群更稳健、更容易排障,也更容易演进。能跑到 130K 节点是一回事,能长期稳定地运维 130K 节点,是另一回事。
参考资料
-
How we built a 130,000-node GKE cluster (Google Cloud Blog) ↩ ↩2 ↩3 ↩4 ↩5
-
Amazon EKS enables ultra scale AI/ML workloads with support for 100K nodes per cluster ↩ ↩2 ↩3
-
Under the hood: Amazon EKS ultra scale clusters (AWS) ↩ ↩2 ↩3
-
Amazon EKS introduces node monitoring and auto repair capabilities ↩
-
Deep dive into Amazon EKS scalability testing (AWS Containers) ↩