用途
Karpenter 是 Amazon EKS 的智能、高性能节点自动扩缩容工具,被定位为 2025 年生产级 EKS 工作负载的推荐自动扩缩器,用于替代 Cluster Autoscaler。它直接供给 EC2 实例,无需预先配置节点组,可根据 Pod 需求自动选择最优实例类型,并通过 Spot 集成与节点整合降低成本。
主要能力
- 速度:数秒内完成节点供给(Cluster Autoscaler 通常需要数分钟)。
- 智能:根据 Pod 的 CPU、内存、亲和性、污点/容忍等需求,从 600 多种实例类型中自动选择最优规格。
- 灵活:无需配置节点组,直接供给 EC2 实例。
- 成本优化:通过更好的装箱(bin-packing)与 Spot 集成,实现 20-70% 成本降低。
- 整合(Consolidation):节点利用率不足或为空时自动整合,替换为更便宜的替代方案,并遵守 Pod Disruption Budget。
资料中列出的实际效果包括:整体 AWS 账单降低 20%、CI/CD 工作负载最高节省 90%、月度计算成本降低 70%、浪费减少 15-30%。
使用方式
前置条件
- EKS 集群运行 Kubernetes 1.23+。
- 使用 Terraform 或 Helm 安装。
- 启用 IRSA 或 EKS Pod Identity。
- 为 Karpenter 控制器准备小型节点组(2-3 个节点)。
- 为 Karpenter 发现机制标记 VPC 子网与安全组。
快速开始
- 通过 Helm 安装 Karpenter v1.0+:
helm repo add karpenter https://charts.karpenter.sh
helm repo update
helm upgrade --install karpenter karpenter/karpenter \
--namespace kube-system \
--set settings.clusterName=my-cluster \
--set settings.interruptionQueue=my-cluster \
--set controller.resources.requests.cpu=1 \
--set controller.resources.requests.memory=1Gi \
--set controller.resources.limits.cpu=1 \
--set controller.resources.limits.memory=1Gi \
--wait
- 创建 NodePool 与 EC2NodeClass。NodePool 定义调度需求、限制与中断策略;EC2NodeClass 定义 AWS 相关配置(AMI、实例类型、子网、安全组)。示例中 NodePool 指定容量类型为 spot 与 on-demand、架构 amd64、实例类别 c/m/r、实例代次大于 4,并设置整合策略 WhenUnderutilized、consolidateAfter 30s 与 10% 的中断预算。EC2NodeClass 使用 AL2023 AMI 家族、指定节点角色、通过标签发现子网与安全组,并配置 gp3 加密卷。
kubectl apply -f nodepool.yaml
-
部署工作负载并观察自动扩缩容:创建测试 Deployment,扩容副本触发节点供给,通过日志观察 Karpenter 供给节点,再缩容触发整合。
-
监控与优化:查看 NodePool 状态、中断指标、供给决策日志与节点资源使用。
核心概念(v1.0 架构)
- NodePool:定义节点调度需求、限制与中断策略。
- EC2NodeClass:AWS 特定配置(AMI、实例类型、子网、安全组)。
- NodeClaim:Karpenter 对节点请求的表示(自动创建)。
工作流程:Pod 变为不可调度 → Karpenter 评估 Pod 需求 → 从 600+ 选项中选出最优实例类型 → 直接供给 EC2 实例(无节点组)→ 节点在 30-60 秒内加入集群 → Pod 调度到新节点。整合过程持续监控节点利用率,装箱整合利用率不足的节点,排空并删除空节点,替换为更便宜的替代方案,并遵守 Pod Disruption Budget。
常见工作流
- 使用 Terraform 安装 Karpenter:使用 terraform-aws-modules/eks/aws//modules/karpenter 模块,启用 Pod Identity,并通过 Helm release 安装。
- 配置 Spot/On-Demand 混合(推荐 30% On-Demand、70% Spot):创建 critical NodePool(仅 On-Demand,带污点,权重 100)与 flexible NodePool(Spot 优先,权重 10),通过容忍与 nodeSelector 分离关键工作负载。
- 启用整合以节省成本:开发/预发环境可激进整合(WhenEmptyOrUnderutilized、30s、50% 预算),生产环境保守整合(WhenUnderutilized、5m、10% 预算,并可按时间表调整),同时为关键应用创建 PodDisruptionBudget。
- 从 Cluster Autoscaler 迁移:先并行安装 Karpenter,创建带独立标签的 NodePool,逐步迁移工作负载,监控两者,逐步缩减 CA 节点组,移除 CA 标签,最后卸载 Cluster Autoscaler。资料提供了测试清单与回滚方案。
- GPU 节点供给:创建 GPU NodePool,指定实例家族 g4dn/g5/p3/p4d、GPU 数量大于 0,使用带 GPU 驱动的 AMI,并配置污点与 GPU 工作负载容忍。
关键配置
- NodePool 资源限制:通过 limits 限制 CPU、内存、GPU 总量,防止失控扩容。
- 中断控制:consolidationPolicy(WhenUnderutilized、WhenEmpty、WhenEmptyOrUnderutilized)、consolidateAfter 延迟、expireAfter 节点过期(如 720h)、中断预算(按百分比或时间表)。
- 实例类型灵活性:可指定架构(amd64、arm64)、实例类别、实例代次、排除特定实例规格,以最大化 Spot 可用性与成本节省。
适用场景
- 用更快、更智能的自动扩缩容替代 Cluster Autoscaler。
- 优化 EKS 集群成本(目标 20%+ 节省)。
- 实施 Spot 实例策略(30-70% Spot 占比)。
- 需要亚分钟级节点供给。
- 资源需求多变的工作负载。
- 无需节点组管理的多实例类型灵活性。
- GPU 或专用实例供给。
- 自动整合利用率不足的节点。
限制
资料未提供 Karpenter 的收费、价格、平台限制或具体效果保证等额外信息。使用前需满足上述前置条件(Kubernetes 1.23+、IRSA 或 Pod Identity、标记子网与安全组等)。