You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为AWS EKS创建的ASG配置单AZ多实例类型?

问题解答

1. 现有托管节点组能否配置多实例类型?

不行。EKS托管节点组(MNG)创建的ASG和启动模板确实不可编辑,而且MNG不支持创建后添加或修改实例类型——只能在创建MNG时通过instance_types参数指定多种类型。如果你的现有MNG只配置了单一实例类型,没法直接修改,只能新建符合要求的MNG。

2. 是否需要自定义ASG?

如果放弃托管节点组的便利性,完全可以用自定义ASG+启动模板管理Spot实例,这样能完全控制实例类型、AZ分布、Spot策略等。但代价是要自己维护节点的EKS注册、版本更新、安全补丁等操作(托管节点组会自动完成这些)。

如果想保留托管节点组的自动化能力,更推荐下面的方案。

3. 最优方案:为每个AZ创建带多实例类型的托管节点组

要提升Spot容量可用性,AWS官方推荐的做法是每个AZ单独创建一个托管节点组,每个节点组内指定多种同规格族的实例类型(比如m5.large、m5.xlarge、m6i.large这类CPU/内存比例一致的类型,避免调度冲突)。

这么做的好处:

  • 每个AZ的节点组独立扩缩容,某一AZ的Spot实例中断时,不会影响其他AZ的节点
  • 同一节点组内的多实例类型,能让集群在某一实例类型Spot容量不足时,自动切换到同组内的其他类型,提升获取Spot实例的成功率

Terraform实现示例

你可以通过循环为每个AZ创建托管节点组,示例配置如下:

# 定义可用区列表变量
variable "availability_zones" {
  type    = list(string)
  default = ["us-east-1a", "us-east-1b", "us-east-1c"]
}

# 循环创建每个AZ的Spot托管节点组
resource "aws_eks_node_group" "spot_node_groups" {
  count             = length(var.availability_zones)
  cluster_name      = var.cluster_name
  node_group_name   = "${var.cluster_name}-spot-${var.availability_zones[count.index]}"
  node_role_arn     = aws_iam_role.eks_node_role.arn
  subnet_ids        = [element(var.private_subnets, count.index)] # 每个AZ对应一个私有子网

  scaling_config {
    desired_size = 2
    max_size     = 10
    min_size     = 1
  }

  capacity_type = "SPOT" # 指定使用Spot实例

  # 同一规格族的多种实例类型
  instance_types = [
    "m5.large",
    "m5.xlarge",
    "m6i.large",
    "m6i.xlarge"
  ]

  update_config {
    max_unavailable = 1
  }
}

4. 集群自动扩缩容(CAS)的适配

你的现有CAS配置无需大幅修改,只需注意两点:

  • CAS的autoDiscovery默认会自动识别同一集群下的所有ASG(包括托管节点组创建的),无需额外配置节点组白名单
  • 确保CAS的IAM角色拥有对所有新ASG的描述、修改权限(你的现有配置已指定IAM角色,确认权限覆盖所有节点组即可)

注意事项

  • 同一节点组内的实例类型尽量选择CPU/内存比例一致的,避免Pod调度时因资源规格差异出现问题
  • 启用Spot实例后,要为应用配置Pod中断预算(PDB),确保节点中断时业务平稳运行
  • 替换现有节点组时,建议先创建新的多实例类型节点组,待Pod调度完成后再删除旧节点组

内容的提问来源于stack exchange,提问作者buttercup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:55:11