提交Hello World任务

在本节的示例中,我们将使用创建的 AWS Batch 计算环境和作业队列来启动容器并print hello world:

  • 创建一个job defination,定义要执行的操作 ( echo "hello world")、使用哪个容器(基本 Linux 容器)、执行位置(在 EKS 上)以及使用的资源(vCPU 和内存要求)
  • 使用该job defination提交作业
  • 查看 CloudWatch 日志中的结果。

创建作业定义

mkdir hello-world
cd hello-world

创建Job Definition json 文件:

export JD_HW_NAME="b4eks-jd-hello-$(uuidgen --random | cut -d'-' -f1)"
echo "export JD_HW_NAME=${JD_HW_NAME}" >> ~/.bash_profile

cat <<EOF > ./${JD_HW_NAME}.json
{
  "jobDefinitionName": "${JD_HW_NAME}",
  "type": "container",
  "eksProperties": {
    "podProperties": {
      "hostNetwork": true,
      "containers": [
        {
          "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
          "command": [
            "echo",
            "'hello world'"
          ],
          "resources": {
            "limits": {
              "cpu": "1",
              "memory": "1024Mi"
            }
          }
        }
      ]
    }
  }
}
EOF

image-20240107184240418

使用 AWS CLI 注册Job Definition:

aws batch register-job-definition --cli-input-json file://./${JD_HW_NAME}.json

可以使用此命令查看整个作业定义:

aws batch describe-job-definitions --job-definitions "${JD_HW_NAME}:1"

image-20240107184341480

同样在EKS控制台也能看到提交的作业定义:

image-20240107193329058

现在我们已准备好将作业提交到作业队列

提交作业

使用创建的Job Definition将作业提交到作业队列:

JOB_ID=$(aws batch submit-job --job-queue ${BATCH_EKS_JQ_NAME} --job-definition "${JD_HW_NAME}:1" --job-name 'my-first-hello' --output text --query jobId )
echo $JOB_ID

可以使用上面的jobId, 检查作业的状态:

aws batch describe-jobs --jobs ${JOB_ID}

# 输出
{
    "jobs": [
        {
            "jobArn": "arn:aws:batch:us-west-2:145197526627:job/f0d60fdd-bb56-41d6-93c8-5d08500ff917",
            "jobName": "my-first-hello",
            "jobId": "f0d60fdd-bb56-41d6-93c8-5d08500ff917",
            "jobQueue": "arn:aws:batch:us-west-2:145197526627:job-queue/eks-cilium-JQ1",
            "status": "RUNNABLE",
            "attempts": [],
            "createdAt": 1704624290739,
            "dependsOn": [],
            "jobDefinition": "arn:aws:batch:us-west-2:145197526627:job-definition/b4eks-jd-hello-a43463aa:1",
            "parameters": {},
            "tags": {},
            "platformCapabilities": [],
            "eksProperties": {
                "podProperties": {
                    "hostNetwork": true,
                    "containers": [
                        {
                            "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
                            "command": [
                                "echo",
                                "'hello world'"
                            ],
                            "args": [],
                            "env": [],
                            "resources": {
                                "limits": {
                                    "cpu": "1",
                                    "memory": "1024Mi"
                                }
                            },
                            "volumeMounts": []
                        }
                    ],
                    "volumes": []
                }
            },
            "eksAttempts": []
        }

还可以用来kubectl监视容器事件。

kubectl get pods -n $BATCH_EKS_NAMESPACE -w

请注意,在节点启动并准备好 pod 放置之前,将在几分钟内看不到任何输出,之后应该会看到类似以下内容:

image-20240107184838057

返回的结果(作业完成后)应将status参数设置为 SUCCEEDED

aws batch describe-jobs --jobs ${JOB_ID} --query 'jobs[].[jobId,status]'

还可以在CloudWatch Logs 控制台 中查看STDERR输出 。选择 EKS 集群的applications日志组。搜索aws-batch

EKS 集群应用程序的 AWS CloudWatch 日志组

选择日志流以查看 STDERR 消息:

来自程序的“hello world”消息的 AWS CloudWatch 日志组 STDOUT

清理资源

虽然Job Definition不会产生成本,但进行清理仍然是一个很好的practice。

取消Job Definition注册:

aws batch deregister-job-definition --job-definition ${JD_HW_NAME}:1

可以按如下方式检查Job Definition状态:

aws batch describe-job-definitions --job-definitions "${JD_HW_NAME}:1" --query "jobDefinitions[].status"