配置Batch 与EKS集群集成

下图描述了 AWS Batch 如何与 EKS 集成:

  1. 用户向 AWS Batch 提交作业请求
  2. Batch 将在集群中启动 EC2 实例,但这些实例不属于 EKS 托管节点组,也不由 EKS 托管节点组管理。
  3. 实例的 kubelet 进程与 EKS 集群的master endpoint进行通信
  4. Kubernetes 主调度程序会将定义的守护进程集放置在实例上。
  5. 当实例报告它们已准备好进行 pod 调度时,Batch 会管理代表 Batch 作业的 pod 的生命周期,将它们放置在这些实例上定义的 kubernetes 命名空间中,并在作业完成后删除 pod。
  6. 一旦作业完成并且 Batch 作业队列中没有其他工作,Batch 将缩减实例。

AWS Batch 通过启动自己的托管节点组并将 Pod 调度到这些实例来处理 Batch 作业提交,从而与  EKS 集成。

将 AWS Batch 连接到 EKS

我们将配置 AWS Batch 以与 EKS 集群一起使用。

创建描述 Batch 计算环境的 JSON 文件:

cat <<EOF > ./batch-eks-compute-environment.json
{
  "computeEnvironmentName": "${BATCH_EKS_CE_NAME}",
  "type": "MANAGED",
  "state": "ENABLED",
  "eksConfiguration": {
    "eksClusterArn": "${EKS_CLUSTER_ARN}",
    "kubernetesNamespace": "${BATCH_EKS_NAMESPACE}"
  },
  "computeResources": {
    "type": "EC2",
    "allocationStrategy": "BEST_FIT_PROGRESSIVE",
    "minvCpus": 0,
    "maxvCpus": 32,
    "instanceTypes": [
        "m5",
        "c5",
        "m6i",
        "c6i"
    ],
    "subnets": [
        "${SUBNET_IDS[0]}",
        "${SUBNET_IDS[1]}",
        "${SUBNET_IDS[2]}"
    ],
    "securityGroupIds": [
        "${SECURITY_GROUP_ID}"
    ],
    "instanceRole": "${EKS_NODE_IAM_PROFILE_ARN}"
  }
}
EOF

image-20240107183556775

使用 AWS CLI 创建计算环境:

aws batch create-compute-environment --cli-input-json file://./batch-eks-compute-environment.json

应该看到一条返回计算环境 ARN 的消息。

{
    "computeEnvironmentName": "batch4eks-cluster-abc12345-CE1",
    "computeEnvironmentArn": "arn:aws:batch:us-east-1:111111111111:compute-environment/batch4eks-cluster-abc12345-CE1"
}

可以使用以下命令查看所有计算环境详细信息。

aws batch describe-compute-environments --compute-environments $BATCH_EKS_CE_NAME

image-20240107183845084

在控制台中也能查看计算环境(Compute environments):

image-20240107193018956

image-20240107193058572

创建 AWS Batch 作业队列

最后,创建一个作业队列以将工作提交到Batch

cat <<EOF > ./batch-eks-job-queue.json
 {
    "jobQueueName": "${BATCH_EKS_JQ_NAME}",
    "priority": 10,
    "computeEnvironmentOrder": [
      {
        "order": 1,
        "computeEnvironment": "${BATCH_EKS_CE_NAME}"
      }
    ]
  }
EOF

使用 AWS CLI 创建作业队列

aws batch create-job-queue --cli-input-json file://./batch-eks-job-queue.json

应该看到类似以下内容

{
    "jobQueueName": "",
    "jobQueueArn": "arn:aws:batch:us-east-1:111111111111:job-queue/batch4eks-cluster-abc12345-JQ1"
}

在控制台中也能查看Job queues

image-20240107193130292

image-20240107193214034

现在,已完成所有准备工作,我们为AWS Batch 创建了计算环境作业队列,并让它后续提交到EKS 集群来运行作业。