EKS GPU 节点策略
1. 概述
在 EKS 上运营 GPU 工作负载时,节点类型选择直接影响运维复杂度、成本和功能利用度。GPU 推理和训练工作负载与一般容器工作负载不同,有以下特殊需求:
- 驱动依赖:NVIDIA GPU 驱动、Container Toolkit、Device Plugin
- 高级功能:MIG(Multi-Instance GPU)、Time-Slicing、Fractional GPU
- 监控:基于 DCGM(Data Center GPU Manager)的指标
- 调度:Topology-Aware Placement、Gang Scheduling
AWS EKS 为 GPU 工作负载提供 4 种节点类型:
| 节点类型 | 说明 |
|---|---|
| EKS Auto Mode | AWS 管理全部节点生命周期 (GPU 驱动预装) |
| Karpenter | 自动伸缩 + Custom AMI、MIG 等完全用户自定义 |
| Managed Node Group | AWS 托管节点组,唯一支持 DRA(Dynamic Resource Allocation) |
| Hybrid Node | 将本地 GPU 服务器连接到 EKS 集群 |
在一个 EKS 集群中可以同时运营多种节点类型。请根据工作负载特性配置最优的节点组合。
本文档范围
本文档聚焦于节点类型选择和混合架构设计。GPU Operator/DCGM/Dynamo 等 NVIDIA 软件栈详情、GPU 自动伸缩、llm-d 分布式推理、安全/故障排除请参阅各专门文档(第 7 章相关文档参考)。
2. 节点类型特性对比
2.1 功能对比表
| 特性 | Auto Mode | Karpenter | Managed Node Group | Hybrid Node |
|---|---|---|---|---|
| 管理主体 | AWS 完全管理 | 自管理 | AWS 管理 | 本地 |
| 自动伸缩 | 自动(AWS 控制) | 自动(NodePool) | 手动/受限 | 手动 |
| Custom AMI | 不可 | 可以 | 可以 | 可以 |
| SSH 访问 | 不可 | 可以 | 可以 | 可以 |
| GPU 驱动 | 预装(AWS) | 用户安装 | 用户安装 | 用户安装 |
| GPU Operator | 可以(禁用 Device Plugin 标签) | 可以 | 可以 | 可以 |
| Root Filesystem | 只读 | 读写 | 读写 | 读写 |
| MIG 支持 | 不可(NodeClass 只读) | 可以 | 可以 | 可以 |
| DRA 兼容 | 不可(内部 Karpenter) | 不可(#1231) | 可以(推荐) | 可以 |
| DCGM Exporter | 通过 GPU Operator 安装 | GPU Operator 包含 | 手动安装 | GPU Operator 包含 |
| Run:ai 兼容 | 可以(禁用 Device Plugin) | 可以 | 可以 | 可以 |
| 成本 | 低(无需管理) | 中等 | 中等 | 低(Capex) |
| 适用工作负载 | 简单推理 | 高级 GPU 功能 | DRA 工作负载 | 本地集成 |
2.2 选择指南:何时使用哪种节点
选择 Auto Mode 的情况:
- 希望无 GPU 驱动管理负担快速启动推理服务
- 不需要 MIG、Fractional GPU 的大型模型(70B+)服务
- 系统/非 GPU 工作负载(API Gateway、Agent、Observability)
选择 Karpenter 的情况:
- 需要 MIG 分区、Custom AMI、Spot Instance 灵活控制
- 使用 Run:ai、KAI Scheduler 等依赖 GPU Operator ClusterPolicy 的项目
- 中小型模型的 GPU 利用率优化(MIG 分割)
选择 Managed Node Group 的情况:
- 需要基于 DRA(Dynamic Resource Allocation)的 GPU 管理
- 使用 P6e-GB200 UltraServer 等 DRA 专用实例
选择 Hybrid Node 的情况:
- 将现有本地 GPU 服务器资产集成到 EKS
- 数据主权(Data Residency)需求
3. EKS Auto Mode GPU 支持与限制
3.1 Auto Mode 自动提供的 GPU 栈
EKS Auto Mode 在 GPU 实例上预装以下内容:
- NVIDIA GPU 驱动 - AWS 管理版本,
/dev/nvidia*设备自动创建 - NVIDIA Container Toolkit - containerd 插件自动配置
- NVIDIA Device Plugin -
nvidia.com/gpu资源自动注册 - GPU 资源注册 - Pod 可立即请求
nvidia.com/gpu: 1
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda-test
image: nvidia/cuda:12.2.0-runtime-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
3.2 Auto Mode 安装 GPU Operator:Device Plugin 禁用模式
GPU Operator 在 Auto Mode 中可以安装。关键是仅通过节点标签禁用 Device Plugin,其他组件(DCGM Exporter、NFD、GFD)正常运行。此模式已在 awslabs/ai-on-eks PR #288 中验证。
为什么需要 GPU Operator? KAI Scheduler、Run:ai 等多个项目依赖 GPU Operator 的 ClusterPolicy CRD。没有 ClusterPolicy 这些项目甚至无法启动。这是在 Auto Mode 中也需要安装 GPU Operator 的核心原因。
ClusterPolicy CRD (GPU Operator)
↓ depends on
KAI Scheduler (GPU-aware Pod 放置)
Run:ai (Fractional GPU, Gang Scheduling)
↓ reads
DCGM Exporter (GPU 指标)
NFD/GFD (硬件标签)
| GPU Operator 组件 | Auto Mode 设置 | 原因 |
|---|---|---|
| Driver | enabled: false | AMI 中预装 |
| Container Toolkit | enabled: false | AMI 中预装 |
| Device Plugin | 通过标签禁用 | AWS 自管理 Device Plugin |
| DCGM Exporter | enabled: true | GPU 指标采集 |
| NFD / GFD | enabled: true | 硬件功能检测及 GPU 属性标签 |
NodePool 中禁用 Device Plugin 的标签设置:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-auto-mode
spec:
template:
metadata:
labels:
nvidia.com/gpu.deploy.device-plugin: "false"
spec:
requirements:
- key: eks.amazonaws.com/instance-family
operator: In
values: ["p5", "g6e", "g5"]
nodeClassRef:
group: eks.amazonaws.com
kind: NodeClass
name: default
Helm Values(Auto Mode 用):
driver:
enabled: false
toolkit:
enabled: false
devicePlugin:
enabled: true # 全局启用,通过节点标签选择性禁用
dcgmExporter:
enabled: true
serviceMonitor:
enabled: true
nfd:
enabled: true
gfd:
enabled: true
GPU Operator 可以安装,但 NodeClass 是只读的,因此以下不可行:
- MIG 分区:无法在 NodeClass 中设置 MIG 配置文件
- Custom AMI:无法锁定特定驱动版本
- SSH/SSM 访问:无法直接调试节点
如需基于 MIG 的 GPU 分割,请切换到 Karpenter + GPU Operator。
3.3 大型 GPU 实例支持现状(2026.04 验证)
GLM-5(744B MoE)部署过程中确认的 Auto Mode 大型 GPU 实例支持现状。
| 实例 | GPU | VRAM | Auto Mode | 验证结果 |
|---|---|---|---|---|
| p5.48xlarge | H100 80GB x 8 | 640GB | 支持 | Spot 配置成功(us-east-2) |
| p5en.48xlarge | H200 141GB x 8 | 1,128GB | 受限 | NoCompatibleInstanceTypes |
| p6-b200.48xlarge | B200 192GB x 8 | 1,536GB | 不支持 | 配置失败 |
Auto Mode 的托管 Karpenter 无法配置 p5en 和 p6 实例。NodePool validation 通过但实际部署时出现以下错误:
NodePool requirements filtered out all compatible available instance types
NoCompatibleInstanceTypes
原因:Auto Mode 的内部 Karpenter 在 offering 匹配过程中过滤了 p5en/p6 实例类型。
3.4 Auto Mode + MNG 混合限制
为使用 p5en/p6 在 Auto Mode 集群中添加 MNG 的混合模式当前不可行:
- MNG 创建时在
CREATING状态停滞 30 分钟以上 - CloudFormation 栈的
Resources字段保持null - Auto Mode 的托管计算层与 MNG 的 ASG 管理内部冲突
结论:使用大型 GPU(H200+、B200)时请使用 EKS Standard Mode + Karpenter + MNG。
3.5 Device Plugin 冲突解决
在 Auto Mode 节点上以 devicePlugin.enabled=true 安装 GPU Operator 会与内置 Device Plugin 冲突。
kubectl describe node <gpu-node> | grep nvidia.com/gpu
# Allocatable: nvidia.com/gpu: 0 (期望: 8)
解决:在 NodePool 添加 nvidia.com/gpu.deploy.device-plugin: "false" 标签(参见 3.2 节)
3.6 无法强制终止节点
Auto Mode 管理的 EC2 实例会阻止 ec2:TerminateInstances。异常节点恢复流程:
- 删除工作负载:
kubectl delete pod <gpu-pod> - 删除 NodeClaim:
kubectl delete nodeclaim <nodeclaim-name> - Karpenter 检测到 Empty 节点后自动终止(5-10 分钟)
- 创建新 NodeClaim 启动正常节点
3.7 Auto Mode 实例支持确认方法
可通过 NodePool dry-run 预先确认特定实例类型的支持情况:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-test-dryrun
spec:
template:
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values: ["p5en.48xlarge"]
nodeClassRef:
group: eks.amazonaws.com
kind: NodeClass
name: default
limits:
nvidia.com/gpu: "8"
dry-run 后如果 kubectl get nodeclaim 事件中出现 NoCompatibleInstanceTypes,则该实例类型在 Auto Mode 中不支持。
4. Karpenter GPU NodePool 配置
4.1 为什 么选择 Karpenter
Karpenter 在保持 Auto Mode 自动伸缩优势的同时,可以完全利用 GPU Operator 的最佳平衡点。
| 功能 | Auto Mode | Karpenter |
|---|---|---|
| 自动伸缩 | 自动(AWS 控制) | 自动(NodePool) |
| GPU Operator | 可以(禁用 Device Plugin) | 完全可以 |
| Custom AMI | 不可 | 可以 |
| MIG 支持 | 不可 | 可以 |
| Spot Instance | 受限 | 完全支持 |
| 节点替换速度 | 快 | 非常快 |
4.2 推理工作负载 NodePool
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-inference
spec:
template:
metadata:
labels:
node-type: gpu-inference
gpu-operator: enabled
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values:
- p5.48xlarge # H100 x8 (640GB HBM3)
- g6e.12xlarge # L40S x4 (192GB GDDR6)
- g5.12xlarge # A10G x4 (96GB GDDR6)
- key: karpenter.sh/capacity-type
operator: In
values: [on-demand]
- key: topology.kubernetes.io/zone
operator: In
values: [us-west-2a, us-west-2b, us-west-2c]
taints:
- key: nvidia.com/gpu
effect: NoSchedule
value: "true"
kubelet:
maxPods: 110
evictionHard:
memory.available: "10Gi"
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 5m
limits:
cpu: "1000"
memory: "4000Gi"
nvidia.com/gpu: "32"
4.3 训练工作负载 NodePool(Spot + On-Demand 回退)
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-training
spec:
template:
metadata:
labels:
node-type: gpu-training
gpu-operator: enabled
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values:
- p5.48xlarge # H100 x8
- key: karpenter.sh/capacity-type
operator: In
values: [spot, on-demand] # Spot 优先,On-Demand 回退
taints:
- key: workload
effect: NoSchedule
value: "training"
kubelet:
maxPods: 50
evictionHard:
memory.available: "20Gi"
disruption:
consolidationPolicy: WhenUnderutilized
consolidateAfter: 30m # 防止训练中断
limits:
nvidia.com/gpu: "64"
4.4 EC2NodeClass 配置
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: gpu-inference
spec:
amiSelectorTerms:
- alias: al2023
role: KarpenterNodeRole-eks-genai-cluster
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: eks-genai-cluster
subnet-type: private
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: eks-genai-cluster
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 200Gi
volumeType: gp3
iops: 16000
throughput: 1000
encrypted: true
deleteOnTermination: true
metadataOptions:
httpEndpoint: enabled
httpPutResponseHopLimit: 2
httpTokens: required # IMDSv2
tags:
Environment: production
ManagedBy: karpenter
4.5 GPU Operator Helm Values(Karpenter 节点专用)
# helm install gpu-operator nvidia/gpu-operator -f values.yaml
driver:
enabled: false # AL2023: AMI 预装
toolkit:
enabled: false # AL2023: AMI 预装
devicePlugin:
enabled: true
nodeSelector:
gpu-operator: enabled
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
migManager:
enabled: true
nodeSelector:
gpu-operator: enabled
config:
name: mig-parted-config
default: "all-balanced"
dcgmExporter:
enabled: true
serviceMonitor:
enabled: true
interval: 15s
nodeSelector:
gpu-operator: enabled
nfd:
enabled: true
gfd:
enabled: true
nodeSelector:
gpu-operator: enabled
operator:
nodeSelector:
node-type: gpu-inference # Karpenter NodePool 标签
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
defaultRuntime: containerd
核心配置要点:
nodeSelector: gpu-operator: enabled-- 排除 Auto Mode 节点driver/toolkit: false-- AL2023 AMI 中预装migManager: true-- 在 Karpenter 节点上使用 MIG 功能