本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊 EK Amazon Batch S 入门
Amazon Batch On Amazon EKS 是一项托管服务,用于调度批处理工作负载并将其扩展到现有 Amazon EKS 集群中。 Amazon Batch 不会代表您创建、管理您的 Amazon EKS 集群或执行其生命周期操作。 Amazon Batch 编排向上和向下扩展由这些节点管理的节点 Amazon Batch ,并在这些节点上运行 pod。
Amazon Batch 不会触及与 Amazon EKS 集群中的 Amazon Batch 计算环境无关的节点、自动扩展节点组或 pod 生命周期。 Amazon Batch 为了有效运行,其服务相关角色需要在现有 Amazon EKS 集群中具有Kubernetes基于角色的访问控制 (RBAC) 权限。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权
Amazon Batch 需要一个Kubernetes命名空间,它可以在其中将 pod 限定为 Amazon Batch 作业。我们建议使用专用的命名空间将 Amazon Batch Pod 与其他集群工作负载隔离开来。
Amazon Batch 获得 RBAC 访问权限并建立命名空间后,您可以使用 CreateComputeEnvironmentAPI 操作将该 Amazon EKS 集群关联到 Amazon Batch 计算环境。任务队列可以与这个新的 Amazon EKS 计算环境相关联。 Amazon Batch 根据 Amazon EKS 任务定义,使用 SubmitJobAPI 操作将任务提交到任务队列。 Amazon Batch 然后启动 Amazon Batch 托管节点,并将作业队列中的作业作为 Kubernetes pod 放入与 Amazon Batch 计算环境关联的 EKS 集群中。
以下各节介绍如何在 Amazon EKS Amazon Batch 上进行设置。
目录
概览
本教程演示如何使用 Amazon CLI、kubectl
和在 Amazon Batch Amazon EKS 上进行设置eksctl
。
- 目标受众
-
本教程专为负责设置、测试和部署的系统管理员和开发人员而设计 Amazon Batch。
- 使用的功能
-
本教程向您展示如何使用 Amazon CLI、to:
-
创建和配置 Amazon EKS 计算环境
-
创建任务队列。
-
创建任务定义
-
创建并提交要运行的作业
-
提交带有优先权的工作
-
- 所需时间
-
完成本教程大约需要 30-40 分钟。
- 区域限制
-
使用此解决方案不存在任何国家或地区限制。
- 资源使用成本
-
创建 Amazon 账户不收取任何费用。但是,通过实施此解决方案,您可能会产生下表中列出的部分或全部费用。
描述 费用(美元) 按集群小时数向您收费 因实例而异,请参阅 Amazon EKS 定价
先决条件
在开始本教程之前,您必须安装和配置以下工具和资源,以便创建和管理两者 Amazon Batch 以及 Amazon EKS 资源。
-
Amazon CLI – 与 Amazon 服务一起使用的命令行工具,包括 Amazon EKS。本指南要求您使用 2.8.6 版或更高版本,或者 1.26.0 版或更高版本。有关更多信息,请参阅《Amazon Command Line Interface 用户指南》中的安装、更新和卸载 Amazon CLI。安装完成后 Amazon CLI,我们建议您也对其进行配置。有关更多信息,请参阅《Amazon Command Line Interface 用户指南》中的使用
aws configure
进行快速配置。 -
kubectl
– 用于与 Kubernetes 集群一起使用的命令行工具。本指南要求您使用1.23
版或更高版本。有关更多信息,请参阅《Amazon EKS 用户指南》中的安装或更新kubectl
。 -
– 用于处理 Amazon EKS 集群的命令行工具,该工具可自动执行许多单独任务。本指南要求您使用eksctl
0.115.0
版或更高版本。有关更多信息,请参阅《Amazon EKS 用户指南》中的安装或更新
。eksctl
-
必需的 IAM 权限 — 您使用的 IAM 安全委托人必须具有使用 Amazon EKS IAM 角色和服务关联角色以及 VPC 和相关资源的权限。 Amazon CloudFormation有关更多信息,请参阅《IAM 用户指南》中的用于 Amazon Elastic Kubernetes Service 的操作、资源和条件密钥和使用服务相关角色。您必须以同一用户身份完成本指南中的所有步骤。
-
权限 — 调用 CreateComputeEnvironmentAPI 操作来创建使用 Amazon EKS 资源的计算环境的用户需要
eks:DescribeCluster
API 操作权限。 -
Amazon Web Services 账户 号码 — 你需要知道你的 Amazon Web Services 账户 身份证。按照查看您的 Amazon Web Services 账户 身份证中的说明进行操作。
(可选) CloudWatch-要检查(可选)提交带覆盖的作业的详细信息,必须配置日志记录。有关更多信息,请参阅 使用 CloudWatch 日志监控 Amaz Amazon Batch on EKS 作业。
步骤 1:为创建您的 Amazon EKS 集群 Amazon Batch
重要
为了尽可能简单快速地入门,本教程包含了使用默认设置的步骤。在为生产用途创建之前,我们建议您熟悉所有设置,并使用符合您要求的设置进行部署。
安装必备条件后,您需要使用创建集群eksctl
。创建集群可能需要 10-15 分钟。
$
eksctl create cluster --name
my-cluster-name
--regionregion-code
在前面的命令中替换:
-
my-cluster-name
替换为要用于集群的名称。 -
例如,
region-code
Amazon Web Services 区域 替换为在中创建集群us-west-2
。
本教程的后面部分需要集群名称和区域。
第 2 步:为您的 Amazon EKS 集群做好准备 Amazon Batch
必须完成所有步骤。
-
为 Amazon 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)启用访问权限
用于为集群创建Kubernetes角色 Amazon Batch 以允许监视节点和 Pod,并用于绑定角色。
kubectl
您必须为每个 EKS 集群执行一次此操作。$
cat - <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name:
aws-batch-cluster-role
rules: - 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-binding
subjects: - kind: User name:aws-batch
apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name:aws-batch-cluster-role
apiGroup: 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
-
为管理和生命周期 pod 创建命名空间范围 Amazon Batch 的Kubernetes角色并将其绑定。必须为每个唯一的命名空间执行一次此操作。
$
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-role
namespace: ${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-binding
namespace: ${namespace} subjects: - kind: User name:aws-batch
apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name:aws-batch-compute-environment-role
apiGroup: 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 权限映射到服务相关角色。 Amazon Batch在以下命令中替换:
-
用您的 Amazon Web Services 账户 号替换
<your-account-number>
。
$
eksctl create iamidentitymapping \ --cluster
my-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 计算环境
Amazon Batch 计算环境定义计算资源参数以满足您的批处理工作负载需求。在托管计算环境中, Amazon Batch 帮助您管理 Amazon EKS 集群中计算资源(Kubernetes节点)的容量和实例类型。这是基于您在创建计算环境时定义的计算资源规范。您可以使用 EC2 按需实例或 EC2 竞价型实例。
现在,AWSServiceRoleForBatch服务相关角色可以访问您的 Amazon EKS 集群,您可以创建 Amazon Batch 资源了。首先,创建一个指向 Amazon EKS 集群的计算环境。
-
用于
subnets
运行eksctl get cluster
以获取集群使用的子网。my-cluster-name
-
对于
securityGroupIds
参数,您可以使用与 Amazon EKS 集群相同的安全组。此命令检索集群的安全组 ID。$
aws eks describe-cluster \ --name
my-cluster-name
\ --query cluster.resourcesVpcConfig.clusterSecurityGroupId -
instanceRole
是在您创建集群时创建的。要查找使用该AmazonEKSWorkerNodePolicy
策略的所有实体的instanceRole
列表,请执行以下操作:$
aws iam list-entities-for-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
策略角色的名称包含您创建的集群的名称
eksctl-
。my-cluster-name
-nodegroup-example要查找
instanceRole
arn,请运行以下命令:$
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:创建任务队列并连接计算环境
重要
在继续操作之前,请务必确认计算环境是否正常。DescribeComputeEnvironmentsAPI 操作可以用来做到这一点。
$
aws batch describe-compute-environments --compute-environments
My-Eks-CE1
确认 status
参数不是 INVALID
。如果是,请查看 statusReason
参数查找原因。有关更多信息,请参阅 故障排除 Amazon Batch。
提交到这个新任务队列的任务在加入与您的计算环境关联的 Amazon EKS 集群的 Amazon 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:创建作业定义
以下 Job 定义指示 pod 休眠 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 Batch 亚马逊 EKS 上的内存和 vCPU 注意事项。
第 6 步:提交作业
运行以下 Amazon CLI 命令提交新 Job。
$
aws batch submit-job --job-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
--job-nameMy-Eks-Job1
要检查 Job 的状态,请执行以下操作:
$
aws batch describe-jobs --job
<jobId-from-submit-response>
备注
-
有关在 Amazon EKS 资源上运行作业的更多信息,请参阅 Amazon EKS 作业。
步骤 7:查看作业的输出
要查看作业的输出,请执行以下操作:
-
打开 Amazon Batch 控制台,网址为https://console.aws.amazon.com/batch/
。 -
在导航窗格中,选择作业。
-
在作业队列下拉列表中,选择您为本教程创建的作业队列。
-
“作业” 表列出了您的所有任务及其当前状态。任务的状态为成功后,选择任务名称以查看该作业的详细信息。
My-Eks-JQ1
-
在 “详细信息” 窗格中,“启动时间” 和 “停止时间” 应相隔一分钟。
步骤 8:(可选)提交包含改写的任务
此作业会覆盖传递给容器的命令。 Amazon Batch 在任务完成后积极清理 pod 以将负载减少到。Kubernetes要检查作业的详细信息,必须配置日志记录。有关更多信息,请参阅 使用 CloudWatch 日志监控 Amaz Amazon Batch on EKS 作业。
$
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 Batch 亚马逊 EKS 上的内存和 vCPU 注意事项。
要查看作业的输出,请执行以下操作:
-
打开 Amazon Batch 控制台,网址为https://console.aws.amazon.com/batch/
。 -
在导航窗格中,选择作业。
-
在作业队列下拉列表中,选择您为本教程创建的作业队列。
-
“作业” 表列出了您的所有任务及其当前状态。作业的状态为成功后,选择任务名称以查看该作业的详细信息。
-
在详细信息窗格中,选择日志流名称。Job 的 CloudWatch 控制台将打开,并且应该有一个带有消息
hello world
或您的自定义消息的事件。
第 9 步:清理教程资源
启用 Amazon EC2 实例后,您需要为其付费。您可以删除该实例以停止产生费用。
要删除您创建的资源,请执行以下操作:
-
打开 Amazon Batch 控制台,网址为https://console.aws.amazon.com/batch/
。 -
在导航窗格中选择 Job 队列。
-
在 Job 队列表中,选择您为本教程创建的 Job 队列。
-
选择 禁用。当 Job 队列状态变为 “已禁用” 后,您可以选择 “删除”。
-
删除 Job 队列后,在导航窗格中选择计算环境。
-
选择您为本教程创建的计算环境,然后选择禁用。计算环境可能需要 1-2 分钟才能完全禁用。
-
计算环境的 “状态” 变为 “已禁用” 后,选择 “删除”。删除计算环境可能需要 1-2 分钟。
其他资源
完成本教程后,您可能需要探索以下主题: