开始使用 Amazon EKS 上的 AWS Batch
Amazon EKS 上的 AWS Batch 是一项托管服务,用于将批处理工作负载调度和扩展到现有 Amazon EKS 集群中。AWS Batch 不会代表您创建、管理或执行您的 Amazon EKS 集群生命周期操作。AWS Batch 编排纵向扩展和缩减由 AWS Batch 管理的节点,并在这些节点上运行容器组(pod)。
AWS Batch 不会触及与 Amazon EKS 集群中的 AWS Batch 计算环境无关的节点、自动扩缩节点组或容器组(pod)生命周期。为了 AWS Batch 有效运行,其服务相关角色需要在现有 Amazon EKS 集群中具有 Kubernetes 基于角色的访问控制(RBAC))权限。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权
AWS Batch 需要一个 Kubernetes 命名空间,它可以在其中将容器组(pod)限定为 AWS Batch 作业。我们建议使用专用的命名空间将 AWS Batch 容器组(pod)与其他集群工作负载隔离开来。
AWS Batch 获得 RBAC 访问权限并建立命名空间后,您可以使用 CreateComputeEnvironment API 操作将该 Amazon EKS 集群关联到 AWS Batch 计算环境。作业队列可以与这个新的 Amazon EKS 计算环境相关联。使用 SubmitJob API 操作基于 Amazon EKS 作业定义将 AWS Batch 作业提交到作业队列。然后 AWS Batch 启动 AWS Batch 托管节点,并将作业队列中的作业作为 Kubernetes 容器组(pod)放入与 AWS Batch 计算环境关联的 EKS 集群中。
以下各节介绍如何在 Amazon EKS 上设置好 AWS Batch。
目录
概览
本教程展示了如何使用 AWS CLI、kubectl 和 eksctl 设置将 AWS Batch 与 Amazon EKS 结合使用。
- 目标受众
-
本教程面向负责设置、测试和部署 AWS Batch 的系统管理员和开发人员而设计。
- 使用的功能
-
本教程介绍如何使用 AWS CLI 来执行以下操作:
-
创建和配置 Amazon EKS 计算环境
-
创建作业队列。
-
创建任务定义
-
创建并提交要运行的作业
-
提交带覆盖的作业
-
- 所需时间
-
完成本教程大约需要 30–40 分钟。
- 区域限制
-
使用此解决方案没有任何国家或地区限制。
- 资源用量费用
-
创建 AWS 账户并不会收费;但是,通过实施此解决方案,您可能会产生下表中列出的部分或全部费用。
描述 费用(美元) 您需要按集群小时数付费 因实例而异,详情请参阅 Amazon EKS 定价
先决条件
在开始使用本教程之前,您必须安装并配置创建和管理 AWS Batch 和 Amazon EKS 资源所需的以下工具和资源。
-
AWS CLI – 与 AWS 服务一起使用的命令行工具,包括 Amazon EKS。本指南要求您使用 2.8.6 版或更高版本,或者 1.26.0 版或更高版本。有关更多信息,请参阅《AWS Command Line Interface 用户指南》中的安装、更新和卸载 AWS CLI。在安装 AWS CLI 后,建议您还要对其进行配置。有关更多信息,请参阅《AWS Command Line Interface 用户指南》中的使用
aws configure进行快速配置。 -
kubectl– 用于与 Kubernetes 集群一起使用的命令行工具。本指南要求您使用1.23版或更高版本。有关更多信息,请参阅《Amazon EKS 用户指南》中的安装或更新kubectl。 -
– 用于处理 Amazon EKS 集群的命令行工具,该工具可自动执行许多单独任务。本指南要求您使用eksctl0.115.0版或更高版本。有关更多信息,请参阅《Amazon EKS 用户指南》中的安装或更新。eksctl -
所需的 IAM 权限 – 您正在使用的 IAM 安全主体必须具有使用 Amazon EKS IAM 角色和服务相关角色的权限、CloudFormation 以及 VPC 和相关资源。有关更多信息,请参阅《IAM 用户指南》中的用于 Amazon Elastic Kubernetes Service 的操作、资源和条件密钥和使用服务相关角色。您必须以同一用户身份完成本指南中的所有步骤。
-
权限 – 调用 CreateComputeEnvironment API 操作来创建使用 Amazon EKS 资源的计算环境的用户需要
eks:DescribeClusterAPI 操作权限。 -
AWS 账户账号:您需要知道您的 AWS 账户 ID。按照查看您的 AWS 账户 ID 中的说明进行操作。
(可选)CloudWatch :要检查(可选)提交带覆盖的作业的详细信息,必须配置日志记录。有关更多信息,请参阅 使用 CloudWatch Logs 监控 Amazon EKS 作业的 AWS Batch。
第 1 步:为 AWS Batch 创建 Amazon EKS 集群
重要
本教程包含的步骤均使用默认设置,以助您尽可能简单快速地入门。在出于生产用途而开始创建之前,我们建议您熟悉所有设置,并使用符合您要求的设置进行部署。
完成前提条件安装后,您需要使用 eksctl 创建集群。集群创建可能需要 10–15 分钟时间。
$eksctl create cluster --namemy-cluster-name--regionregion-code
请在上述命令中执行以下替换:
-
将
my-cluster-name替换为要用于集群的名称。 -
将
region-code替换为要在其中创建集群的 AWS 区域,例如us-west-2。
本教程的后面部分将需要该集群名称和区域。
第 2 步:为 AWS Batch 准备您的 Amazon EKS 集群
必须完成所有步骤。
-
为 AWS Batch 作业创建专用的命名空间
用
kubectl以创建新的命名空间。$namespace=my-aws-batch-namespace$cat - <<EOF | kubectl create -f - { "apiVersion": "v1", "kind": "Namespace", "metadata": { "name": "${namespace}", "labels": { "name": "${namespace}" } } } EOF输出:
namespace/my-aws-batch-namespace created -
通过基于角色的访问控制(RBAC)启用访问权限
用
kubectl为集群创建 Kubernetes 角色以允许 AWS Batch 监视节点和容器组(pod),并用于绑定该角色。您必须为每个 EKS 集群执行一次此操作。$cat - <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name:aws-batch-cluster-rolerules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list"] - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["daemonsets", "deployments", "statefulsets", "replicasets"] verbs: ["get", "list", "watch"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles", "clusterrolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name:aws-batch-cluster-role-bindingsubjects: - kind: User name:aws-batchapiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name:aws-batch-cluster-roleapiGroup: rbac.authorization.k8s.io EOF输出:
clusterrole.rbac.authorization.k8s.io/aws-batch-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/aws-batch-cluster-role-binding created -
为 AWS Batch 创建名称空间范围的 Kubernetes 角色,用于管理和绑定生命周期容器组(pod)。必须为每个唯一的命名空间执行一次此操作。
$namespace=my-aws-batch-namespace$cat - <<EOF | kubectl apply -f - --namespace "${namespace}" apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name:aws-batch-compute-environment-rolenamespace: ${namespace} rules: - apiGroups: [""] resources: ["pods"] verbs: ["create", "get", "list", "watch", "delete", "patch"] - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get", "list"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name:aws-batch-compute-environment-role-bindingnamespace: ${namespace} subjects: - kind: User name:aws-batchapiGroup: rbac.authorization.k8s.io roleRef: kind: Role name:aws-batch-compute-environment-roleapiGroup: rbac.authorization.k8s.io EOF输出:
role.rbac.authorization.k8s.io/aws-batch-compute-environment-role created rolebinding.rbac.authorization.k8s.io/aws-batch-compute-environment-role-binding created -
更新 Kubernetes
aws-auth配置映射以将前面的 RBAC 权限映射到 AWS Batch 服务相关角色。请在以下命令中执行以下替换:
-
将
<your-account-number>替换为您自己的 AWS 账户账号。
$eksctl create iamidentitymapping \ --clustermy-cluster-name\ --arn "arn:aws:iam::<your-account-number>:role/AWSServiceRoleForBatch" \ --usernameaws-batch输出:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account-number>:role/AWSServiceRoleForBatch" to auth ConfigMap注意
已从服务相关角色的 ARN 中删除路径
aws-service-role/batch.amazonaws.com/。这是因为aws-auth配置映射存在问题。有关更多信息,请参阅 aws-authconfigmap 中带路径的角色在其 ARN 中包含路径时不起作用。 -
第 3 步:创建 Amazon EKS 计算环境
AWS Batch 计算环境定义计算资源参数以满足您的批处理工作负载需求。在托管计算环境中,AWS Batch 用以管理您的 Amazon EKS 集群中计算资源(Kubernetes 节点)的容量和实例类型。这是基于您在创建计算环境时定义的计算资源规范。您可以使用 EC2 按需型实例或 EC2 竞价型实例。
由于 AWSServiceRoleForBatch 服务相关角色可以访问您的 Amazon EKS 集群,您可以创建 AWS Batch 资源。首先,创建一个指向 Amazon EKS 集群的计算环境。
-
对于
subnets,请运行eksctl get cluster来获取集群使用的子网。my-cluster-name -
对于
securityGroupIds参数,您可以使用与 Amazon EKS 集群相同的安全组。此命令检索集群的安全组 ID。$aws eks describe-cluster \ --namemy-cluster-name\ --query cluster.resourcesVpcConfig.clusterSecurityGroupId -
instanceRole是在您创建集群时创建的。要查找instanceRole,请列出使用AmazonEKSWorkerNodePolicy策略的所有实体:$aws iam list-entities-for-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy该策略角色的名称包含您创建的集群的名称
eksctl-。my-cluster-name-nodegroup-example要查找
instanceRoleARN,请运行以下命令:$aws iam list-instance-profiles-for-role --role-name eksctl-my-cluster-name-nodegroup-example输出:
INSTANCEPROFILES arn:aws:iam::<your-account-number>:instance-profile/eks-04cb2200-94b9-c297-8dbe-87f12example有关更多信息,请参阅《Amazon EKS 用户指南》中的创建 Amazon EKS 节点 IAM 角色和向 IAM 主体授予访问集群的权限。如果您使用的是容器组(pod)联网,请参阅《Amazon EKS 用户指南》中的创建适用于 Kubernetes 的 Amazon VPC CNI 插件以使用服务账户的 IAM 角色。
$cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "My-Eks-CE1", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:region-code:your-account-number:cluster/my-cluster-name", "kubernetesNamespace": "my-aws-batch-namespace" }, "computeResources": { "type": "EC2", "allocationStrategy": "BEST_FIT_PROGRESSIVE", "minvCpus": 0, "maxvCpus": 128, "instanceTypes": [ "m5" ], "subnets": [ "<eks-cluster-subnets-with-access-to-internet-for-image-pull>" ], "securityGroupIds": [ "<eks-cluster-sg>" ], "instanceRole": "<eks-instance-profile>" } } EOF
$aws batch create-compute-environment --cli-input-json file://./batch-eks-compute-environment.json
备注
-
对 Amazon EKS 计算环境的维护是一项共同责任。有关更多信息,请参阅 Kubernetes节点的共同责任。
第 4 步:创建作业队列并连接计算环境
重要
在继续操作之前,请务必确认计算环境是否正常。DescribeComputeEnvironments API 操作可以用来做到这一点。
$aws batch describe-compute-environments --compute-environmentsMy-Eks-CE1
确认 status 参数不是 INVALID。如果是,请查看 statusReason 参数查找原因。有关更多信息,请参阅 故障排除 AWS Batch。
提交到这个新作业队列的作业在加入与您的计算环境关联的 Amazon EKS 集群的 AWS Batch 托管节点上以容器组(pod)的形式运行。
$cat <<EOF > ./batch-eks-job-queue.json { "jobQueueName": "My-Eks-JQ1", "priority": 10, "computeEnvironmentOrder": [ { "order": 1, "computeEnvironment": "My-Eks-CE1" } ] } EOF
$aws batch create-job-queue --cli-input-json file://./batch-eks-job-queue.json
步骤 5:创建作业定义
以下作业定义会指示该容器组睡眠 60 秒。
$cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "public.ecr.aws/amazonlinux/amazonlinux:2", "command": [ "sleep", "60" ], "resources": { "limits": { "cpu": "1", "memory": "1024Mi" } } } ], "metadata": { "labels": { "environment": "test" } } } } } EOF
$aws batch register-job-definition --cli-input-json file://./batch-eks-job-definition.json
备注
-
cpu和memory参数有一些注意事项。有关更多信息,请参阅 Amazon EKS 上 AWS Batch 的内存和 vCPU 注意事项。
第 6 步:提交作业
运行以下 AWS CLI 命令提交一个新作业。
$aws batch submit-job --job-queueMy-Eks-JQ1\ --job-definitionMyJobOnEks_Sleep--job-nameMy-Eks-Job1
检查作业状态:
$aws batch describe-jobs --job<jobId-from-submit-response>
备注
-
有关在 Amazon EKS 资源上运行作业的更多信息,请参阅 Amazon EKS 作业。
第 7 步:查看作业输出
要查看作业输出,请执行以下操作:
-
打开AWS Batch控制台,地址:https://console.aws.amazon.com/batch/
。 -
在导航窗格中,选择作业。
-
在作业队列下拉列表中,选择您为本教程创建的作业队列。
-
作业表会列出您的所有作业及其当前状态。作业的状态变为成功后,选择该作业的名称
My-Eks-JQ1以查看作业详细信息。 -
在详细信息窗格中,启动时间和停止时间应间隔一分钟。
第 8 步:(可选)提交带覆盖的作业
此作业会覆盖传递给容器的命令。AWS Batch 在作业完成后会积极清理容器组以减少 Kubernetes 的负载。要检查作业的详细信息,必须配置日志记录。有关更多信息,请参阅 使用 CloudWatch Logs 监控 Amazon EKS 作业的 AWS Batch。
$cat <<EOF > ./submit-job-override.json { "jobName": "EksWithOverrides", "jobQueue": "My-Eks-JQ1", "jobDefinition": "MyJobOnEks_Sleep", "eksPropertiesOverride": { "podProperties": { "containers": [ { "command": [ "/bin/sh" ], "args": [ "-c", "echo hello world" ] } ] } } } EOF
$aws batch submit-job --cli-input-json file://./submit-job-override.json
备注
-
要提高对操作细节的可见性,请启用 Amazon EKS 控制面板日志记录。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS 控制面板日志。
-
Daemonsets 和 kubelets 开销会影响可用的 vCPU 和内存资源,特别是扩展和作业布局。有关更多信息,请参阅 Amazon EKS 上 AWS Batch 的内存和 vCPU 注意事项。
要查看作业输出,请执行以下操作:
-
打开AWS Batch控制台,地址:https://console.aws.amazon.com/batch/
。 -
在导航窗格中,选择作业。
-
在作业队列下拉列表中,选择您为本教程创建的作业队列。
-
作业表会列出您的所有作业及其当前状态。作业的状态变为成功后,选择该作业的名称以查看该作业的详细信息。
-
在详细信息窗格中,选择日志流名称。这时将会打开该作业的 CloudWatch 控制台,并且应会有一个消息为
hello world或自定义消息的事件。
第 9 步:清理教程资源
启用 Amazon EC2 实例后,您需要为该实例付费。您可以删除实例以停止产生费用。
要删除您创建的资源,请执行以下操作:
-
打开AWS Batch控制台,地址:https://console.aws.amazon.com/batch/
。 -
在导航窗格中,选择作业队列。
-
在作业队列表中,选择您为本教程创建的作业队列。
-
选择 禁用。当作业队列的状态变为“已禁用”后,您可以选择删除。
-
删除该作业队列后,在导航窗格中选择计算环境。
-
选择您为本教程创建的计算环境,然后选择禁用。计算环境的禁用可能需要 1-2 分钟才能完成。
-
计算环境的状态变为“已禁用”后,选择删除。计算环境的删除可能需要 1-2 分钟才能完成。
其他资源
完成本教程后,您可以探索以下主题: