本文介绍如何在AWS EKS上使用Karpenter和KEDA实现GPU工作负载的自动扩缩容。我们将创建一个GPU节点池,并部署一个使用GPU的AI应用程序,该应用程序可以根据SQS队列中的消息数量自动扩缩容。
前提条件
- 一个AWS EKS集群,已安装Karpenter和KEDA
- AWS CLI已配置并具有适当的权限
- 一个Amazon ECR存储库用于存储AI应用程序的Docker镜像
准备工作
首先,导出以下环境变量:
步骤1: 创建GPU节点池
首先,我们需要创建一个GPU节点池,以便Karpenter可以根据需求启动GPU实例。创建一个名为${ENV}-${SERVER_NAME}-ai-nodepool.yaml
的文件,内容如下:
这个配置文件定义了一个GPU节点池,使用g5.xlarge
和g5.2xlarge
实例类型。它还配置了一些标签、污点和卷。根据您的需求进行相应调整。
应用这个配置:
步骤2: 部署AI应用程序
创建iam角色给容器使用
接下来,我们将部署一个使用GPU的AI应用程序。创建一个名为${ENV}-${SERVER_NAME}-ai.yaml
的文件,内容如下:
这个配置文件定义了一个Deployment,使用我们之前推送到Amazon ECR的AI应用程序镜像。它请求1个GPU,4个CPU和16GB内存。nodeSelector
和tolerations
确保Pod只能在GPU节点上运行。
应用这个配置:
步骤3: 配置KEDA扩缩容
创建SQS弹性角色,用于实现SQS触发Pod弹性。
最后,我们将配置KEDA,使AI应用程序能够根据SQS队列中的消息数量自动扩缩容。创建一个名为${ENV}-${SERVER_NAME}-ai-scaled-object-sqs.yml
的文件,内容如下:
这个配置文件定义了一个ScaledObject,它监视一个SQS队列,并根据队列中的消息数量来扩缩容AI应用程序的副本数量。根据您的需求调整minReplicaCount
、maxReplicaCount
和queueURL
。
应用这个配置:
就是这样!现在,您的AI应用程序将根据SQS队列中的消息数量自动扩缩容,并且Karpenter会根据需求启动或终止GPU实例。