本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS Batch On Amazon EKS 是一项托管服务,用于调度批处理工作负载并将其扩展到现有 Amazon EKS 集群中。 AWS Batch 不会代表您创建、管理您的 Amazon EKS 集群或执行其生命周期操作。 AWS Batch 编排向上和向下扩展由这些节点管理的节点 AWS Batch ,并在这些节点上运行 pod。
AWS Batch 不会触及与 Amazon EKS 集群中的 AWS Batch 计算环境无关的节点、自动扩展节点组或 pod 生命周期。 AWS Batch 为了有效运营,其与服务相关的角色需要 Kubernetes 您现有 Amazon EKS 集群中的基于角色的访问控制 (RBAC) 权限。有关更多信息,请参阅中的 “使用 RBAC 授权
AWS Batch 需要一个 Kubernetes 命名空间,它可以将 pod 限定为 AWS Batch 作业。我们建议使用专用的命名空间将 AWS Batch Pod 与其他集群工作负载隔离开来。
AWS Batch 获得 RBAC 访问权限并建立命名空间后,您可以使用 CreateComputeEnvironmentAPI 操作将该 Amazon EKS 集群关联到 AWS Batch 计算环境。任务队列可以与这个新的 Amazon EKS 计算环境相关联。 AWS Batch 根据 Amazon EKS 任务定义,使用 SubmitJobAPI 操作将任务提交到任务队列。 AWS Batch 然后启动 AWS Batch 托管节点并将任务队列中的任务放置为 Kubernetes Pod 放入与 AWS Batch 计算环境关联的 EKS 集群中。
以下各节介绍如何在 Amazon EKS AWS Batch 上进行设置。
先决条件
在开始本教程之前,您必须安装和配置以下工具和资源,以便创建和管理两者 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 集群的命令行工具,该工具可自动执行许多单独任务。本指南要求您使用eksctl
0.115.0
版或更高版本。有关更多信息,请参阅《Amazon EKS 用户指南》中的安装或更新
。eksctl
-
必需的 IAM 权限 — 您使用的 IAM 安全委托人必须具有使用 Amazon EKS IAM 角色和服务关联角色以及 VPC 和相关资源的权限。 AWS CloudFormation有关更多信息,请参阅《IAM 用户指南》中的用于 Amazon Elastic Kubernetes Service 的操作、资源和条件密钥和使用服务相关角色。您必须以同一用户身份完成本指南中的所有步骤。
-
创建 Amazon EKS 集群 — 有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS –
eksctl
入门。注意
AWS Batch 仅支持具有 API 服务器终端节点的 Amazon EKS 集群,这些终端节点具有公共访问权限,可供公共互联网访问。默认情况下,Amazon EKS 集群 API 服务器端点具有公共访问权限。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS 集群端点访问控制。
注意
AWS Batch 不为 CoreDNS 或其他部署 pod 提供托管节点编排。如果您需要 CoreDNS,请参阅 Amazon EKS 用户指南中的添加 CoreDNS Amazon EKS 插件。或者,使用
eksctl create cluster create
创建集群,默认情况下它包含 CoreDNS。 -
权限 — 调用 CreateComputeEnvironmentAPI 操作来创建使用 Amazon EKS 资源的计算环境的用户需要
eks:DescribeCluster
API 操作权限。使用使用 Amazon EKS 资源创建计算资源需要同时具有eks:DescribeCluster
和的权限eks:ListClusters
。 AWS Management Console
为 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 集群执行一次此操作。注意
有关使用 RBAC 授权的更多信息,请参阅中的 “使用 RBA
C 授权” Kubernetes 用户指南。 $
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: ["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
创建命名空间作用域 Kubernetes 角色 AWS Batch 用于管理和生命周期 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-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 权限映射到服务相关角色的配置映射。 AWS Batch$
eksctl create iamidentitymapping \ --cluster
my-cluster-name
\ --arn "arn:aws:iam::<your-account>
:role/AWSServiceRoleForBatch" \ --usernameaws-batch
输出:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::
<your-account>
:role/AWSServiceRoleForBatch" to auth ConfigMap注意
已从服务相关角色的 ARN 中删除路径
aws-service-role/batch.amazonaws.com/
。这是因为aws-auth
配置映射存在问题。有关更多信息,请参阅当路径包含在其 ARN 中时,带有路径的角色不起作用 aws-authconfigmap.
创建 Amazon EKS 计算环境
AWS Batch 计算环境定义计算资源参数以满足您的批处理工作负载需求。在托管计算环境中, AWS Batch 可帮助您管理计算资源的容量和实例类型 (Kubernetes 节点)位于您的 Amazon EKS 集群中。这是基于您在创建计算环境时定义的计算资源规范。您可以使用 EC2 按需实例或 EC2 竞价型实例。
现在 AWSServiceRoleForBatch服务相关角色可以访问您的 Amazon EKS 集群,您可以创建 AWS Batch 资源。首先,创建一个指向 Amazon EKS 集群的计算环境。
$
cat <<EOF > ./batch-eks-compute-environment.json
{
"computeEnvironmentName": "My-Eks-CE1
",
"type": "MANAGED",
"state": "ENABLED",
"eksConfiguration": {
"eksClusterArn": "arn:aws:eks:<region>
:123456789012
:cluster/<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
备注
-
不应指定
serviceRole
参数,则将使用 AWS Batch 服务相关角色。 AWS Batch 在 Amazon 上,EKS 仅支持 AWS Batch 服务相关角色。 -
Amazon EKS 计算环境仅支持
BEST_FIT_PROGRESSIVE
、SPOT_CAPACITY_OPTIMIZED
和SPOT_PRICE_CAPACITY_OPTIMIZED
分配策略。注意
建议在大多数情况下使用
SPOT_PRICE_CAPACITY_OPTIMIZED
而不是SPOT_CAPACITY_OPTIMIZED
。 -
有关
instanceRole
,请参阅 Amazon EKS 用户指南中的创建 Amazon EKS 节点 IAM 角色和启用 IAM 主体访问您的集群。如果您使用的是容器联网,请参阅配置 Amazon VPC CNI 插件 Kubernetes 在 A mazon EKS 用户指南中为服务账户使用 IAM 角色。 -
获取
subnets
参数的工作子网的一种方法是使用eksctl
创建 Amazon EKS 集群时创建的 Amazon EKS 托管节点组公共子网。否则,请使用具有支持拉取映像的网络路径的子网。 -
securityGroupIds
参数可以使用与 Amazon EKS 集群相同的安全组。此命令检索集群的安全组 ID。$
eks describe-cluster \ --name
<cluster-name>
\ --query cluster.resourcesVpcConfig.clusterSecurityGroupId -
对 Amazon EKS 计算环境的维护是一项共同责任。有关更多信息,请参阅 的共同责任 Kubernetes 节点。
重要
在继续操作之前,请务必确认计算环境是否正常。DescribeComputeEnvironmentsAPI 操作可以用来做到这一点。
$
aws batch describe-compute-environments --compute-environments
My-Eks-CE1
确认 status
参数不是 INVALID
。如果是,请查看 statusReason
参数查找原因。有关更多信息,请参阅 故障排除 AWS Batch。
创建作业队列并连接计算环境
$
aws batch describe-compute-environments --compute-environments
My-Eks-CE1
提交到这个新任务队列的任务在加入与您的计算环境关联的 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
创建任务定义
$
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
参数有一些注意事项。有关更多信息,请参阅 AWS Batch 亚马逊 EKS 上的内存和 vCPU 注意事项。
提交作业
$
aws batch submit-job --job-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
--job-nameMy-Eks-Job1
$
aws batch describe-jobs --job
<jobId-from-submit-response>
备注
-
仅支持单个容器作业。
-
请确保您熟悉
cpu
和memory
参数的所有相关注意事项。有关更多信息,请参阅 AWS Batch 亚马逊 EKS 上的内存和 vCPU 注意事项。 -
有关在 Amazon EKS 资源上运行作业的更多信息,请参阅 Amazon 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
备注
-
AWS Batch 任务完成后积极清理 pod,将负载减少到 Kubernetes。 要检查作业的详细信息,必须配置日志记录。有关更多信息,请参阅 使用 CloudWatch 日志监控 Amaz AWS Batch on EKS 作业。
-
要提高对操作细节的可见性,请启用 Amazon EKS 控制面板日志记录。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS 控制面板日志。
-
Daemonsets 以及 kubelets 开销会影响可用的 vCPU 和内存资源,特别是扩展和作业布局。有关更多信息,请参阅 AWS Batch 亚马逊 EKS 上的内存和 vCPU 注意事项。