在本节的示例中,我们将使用创建的 AWS Batch 计算环境和作业队列来启动容器并print hello world
:
job defination
,定义要执行的操作 ( echo "hello world"
)、使用哪个容器(基本 Linux 容器)、执行位置(在 EKS 上)以及使用的资源(vCPU 和内存要求)job defination
提交作业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
使用 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"
同样在EKS控制台也能看到提交的作业定义:
现在我们已准备好将作业提交到作业队列
使用创建的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 放置之前,将在几分钟内看不到任何输出,之后应该会看到类似以下内容:
返回的结果(作业完成后)应将status
参数设置为 SUCCEEDED
。
aws batch describe-jobs --jobs ${JOB_ID} --query 'jobs[].[jobId,status]'
还可以在CloudWatch Logs 控制台
中查看STDERR
输出
。选择 EKS 集群的applications
日志组。搜索aws-batch
:
选择日志流以查看 STDERR 消息:
虽然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"