如果一个节点尚未 运行,如何让我的 EKS AutoScalingGroup 启动具有特定实例类型的节点?

How do I make my EKS AutoScalingGroup start a node with a specific instance-type if one is not already running?

我一直在梳理文档,试图找出我们是否能够为我们的用例实施特定的 EKS 架构,但尚未找到关于如何实施或是否可行的明确答案。

范围

我们有几个小 pods 运行 24/7,监视新任务请求。当检测到新任务时,这些监视器 pods 会启动 worker pods,这对 CPU 和内存要求要高得多。

我们希望在 EKS 上完成的是在单个 AutoScalingGroup 中拥有 2 个(或更多)实例类型:

  1. 运行 24/7 pods

    的小型廉价实例
  2. 运行 任务的大型、昂贵实例然后被终止。

根据文档,在一个 ASG 中有多个实例类型是没有问题的,但它没有指定如何确保小 pods 被分配给小实例,而大 pods 到大型实例。

目前完成的测试:

(Max = 3, Min = 1, Desired = 1)

所以目前,我的问题是: 如果我的 ASG 尚未 运行ning,如何根据 pod 对该特定实例类型的要求启动具有特定实例类型的节点?[​​=43=] 感谢任何指向链接、文档或更好方法建议的指针,谢谢!

我从来没有遇到过这个用例,但我认为您应该尝试将集群自动缩放器与 nodeAffinity 结合使用。

Refer: Special note on GPU instances

我似乎对自动缩放器和 ASG 的工作原理缺乏了解。根据其他论坛中某人的反馈,我了解到

A) 自动缩放器 运行s 作为集群本身的 pod(因此开箱即用的 EKS 不支持最少 0 个节点;至少需要一个节点运行 kube-system/auto-scaler pods).

和 B) 单个自动缩放器 pod 能够缩放集群上存在的多个 ASG。因此,这使我们能够按成本将我们的实例分成单独的 ASG,并确保昂贵的实例仅在工作人员请求时使用 pods.

目前我们的解决方案是这样的:

  • 设置至少 2 个 ASG:

    1. 运行 24/7 pods 和 kube-system pods。此 ASG 使用更小、更便宜的实例类型。
    2. (或更多,如果适合用例)运行可突发 pods。此 ASG 使用任务处理所需的更大、更昂贵的实例类型。
  • 将识别标签应用于 ASG。 EKS 推荐的方法(特别是如果您想使用 Spot 实例)是使用实例大小(例如微型、大型、4xlarge)。这使您可以轻松地将具有相同资源大小的实例添加到现有 ASG 中,以提高可靠性。示例:

      Labels:             asgsize=xlarge
    
  • 在 pod yaml 中应用节点选择器以匹配所需的节点:

      spec:
        nodeSelector:
          asgsize: xlarge
    
  • 将 24/7 小型实例 ASG 设置为 min=1,desired=1,max=1(至少;如果满足您的需要,max 可以更大)

  • 将可突增的大型实例 ASG 设置为 min=0,desired=0,max=(无论您的环境需要什么)

当我们实施这种方法时,我们能够成功地拥有一个小实例 运行ning 24/7,并且仅当创建具有该标签的 pod 时才让较大的实例从 0 爆发。

免责声明:

我们还 运行 发现自动缩放器上的这个小错误,其中大型 ASG 最初没有从 0 扩展: https://github.com/kubernetes/autoscaler/issues/2418

该问题的解决方法对我们有用。我们强制我们的大型 ASG 的最小值为 1。然后我们在该组上启动了一个 pod,再次设置 min=0,并删除了该 pod。实例自动缩小并终止,然后下次我们请求 pod 时,它会正确地自动放大。