通过 AmazAmazon Batch on EKS 开始使用 - Amazon Batch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

通过 AmazAmazon Batch on EKS 开始使用

Amazon Batchon Amazon EKS 是一项托管服务,用于将批量工作负载调度并扩展到现有 EKS 集群中。 Amazon Batch不代表您创建、管理或执行 EKS 集群的生命周期操作。 Amazon Batch编排向上和向下扩展由这些节点管理的节点Amazon Batch,并在这些节点上运行 pod。

Amazon Batch不会触及与 EKS 集群中的Amazon Batch计算环境无关的节点、auto 扩展节点组或 pod 生命周期。Amazon Batch为了有效运行,其服务相关Kubernetes角色需要在现有 EKS 集群中拥有基于角色的访问控制 (RBAC) 权限。有关更多信息,请参阅Kubernetes文档中的使用 RBAC 授权

Amazon Batch需要一个Kubernetes命名空间,在该命名空间中,它可以将 pod 作为Amazon Batch任务的作用域。我们建议使用专用的命名空间,将Amazon Batch pod 与其他集群工作负载隔离开来。

Amazon Batch在获得 RBAC 访问权限并建立命名空间后,您可以使用 CreateComputeEnvironmentAPI 操作将该 EKS 集群关联到Amazon Batch计算环境。任务队列可以与这个新的 EKS 计算环境相关联。 Amazon Batch使用 SubmitJobAPI 操作根据 EKS 任务定义将任务提交到任务队列。 Amazon Batch然后启动Amazon Batch托管节点,将任务队列中的任务作为Kubernetes pod 放入与Amazon Batch计算环境关联的 EKS 集群。

以下部分介绍如何设置 AmazAmazon Batch on EKS。

先决条件

在开始使用本教程之前,您必须安装和配置创建和管理 Amazon EKS 资源所需要的以下工具Amazon Batch和资源。

  • 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中的安装或更新

  • eksctl – 用于处理 EKS 集群的命令行工具,该工具可自动执行许多单独任务。本指南要求您使用 0.115.0 版或更高版本。有关更多信息,请参阅 Amazon EKS 用户指南eksctl中的安装或更新

  • 所需的 IAM 权限 – 您正在使用的 IAM 安全主体必须具有使用 Amazon EKS IAM 角色和服务相关角色的权限、Amazon CloudFormation 以及 VPC 和相关资源。有关更多信息,请参阅 IAM 用户指南中的用于 Amazon Elastic Kubernetes Service 的操作、资源和条件密钥使用服务相关角色。您必须以同一用户身份完成本指南中的所有步骤。

  • 创建 EKS 集群 — 有关更多信息,请参阅 Amazon EKS 用户指南eksctl中的 Amazon EKS 入门

    注意

    Amazon Batch仅支持具有 API 服务器终端节点的 EKS 集群,这些终端节点具有公共访问权限,可供公共互联网访问。默认情况下,EKS 集群 API 服务器终端节点具有公共访问权限。有关更多信息,请参阅 Amazon EKS 用户指南中的 Amazon EKS 集群端点访问控制

    注意

    Amazon Batch不为 CoreDNS 或其他部署容器提供托管节点编排。如果你需要 Cor eDNS,请参阅亚马逊 EKS 用户指南中的添加 CoreDNS 亚马逊 EK S 插件。或者,eksctl create cluster create用于创建集群,默认情况下它包含 CoreDNS。

  • 权限 — 调用 CreateComputeEnvironmentAPI 操作来创建使用 EKS 资源的计算环境的用户需要具有eks:DescribeCluster API 操作的权限。使用使用Amazon Web Services Management Console EKS 资源创建计算资源需要同时具有eks:DescribeCluster和的权限eks:ListClusters

步骤 1:为您的 EKS 集群做准备Amazon Batch

必须完成的所有步骤。

  1. 为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
  2. 通过基于角色的访问控制(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: ["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角色Amazon 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

    更新Kubernetesaws-auth配置映射以将之前的 RBAC 权限映射到Amazon Batch服务相关角色。

    $ eksctl create iamidentitymapping \ --cluster my-cluster-name \ --arn "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" \ --username aws-batch 2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" to auth ConfigMap
    注意

    路由aws-service-role/batch.amazonaws.com/,已从服务相关角色的 ARN 中删除。这是因为aws-auth配置映射有问题。有关更多信息,请参阅,如果路径包含在 ARN 中,则带有路径的角色不起作用aws-authconfigmap

步骤 2:创建 Amazon EKS 计算环境

Amazon Batch计算环境定义计算资源参数以满足您的批处理工作负载需求。在托管计算环境中,Amazon Batch用以管理您的 Amazon EKS 集群中计算资源(Kubernetes节点)的容量和实例类型。这基于您在创建计算环境时定义的计算资源规范。您可以使用 EC2 按需实例或 EC2 竞价型实例。

现在,AWSServiceRoleForBatch服务相关角色可以访问您的 Amazon EKS 集群,您可以创建Amazon 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参数,则将使用Amazon Batch服务相关角色。 Amazon Batch在 Amazon EKS 上,仅支持Amazon Batch服务相关角色。

  • EKS 计算环境仅支持BEST_FIT_PROGRESSIVESPOT_CAPACITY_OPTIMIZED分配策略。

  • 有关详情instanceRole,请参阅 A mazon EKS 用户指南中的创建 Amazon EKS 节点 IAM 角色。如果您使用的是 Pod 网络,请参阅 A mazon EKS 用户指南中的配置 Amazon VPC CNI 插件Kubernetes以便为服务账户使用 IAM 角色

  • subnets参数获取有效子网的一种方法是使用创建 Amazon EKS 集群eksctl时创建的 Amazon EKS 托管节点组公有子网。否则,请使用具有支持提取图像的网络路径的子网。

  • securityGroupIds参数可以使用与 Amazon EKS 集群相同的安全组。此命令检索集群的安全组 ID。

    $ aws eks describe-cluster \ --name <cluster-name> \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • 维护 EKS 计算环境是一项共同责任。有关更多信息,请参阅Kubernetes节点的共同责任

重要

在继续操作之前,请务必确认计算环境是否正常。可以使用 DescribeComputeEnvironmentsAPI 操作来实现此目的。

$ aws batch describe-compute-environments --compute-environments My-Eks-CE1

确认status参数不是INVALID。如果是,请查看原因的statusReason参数。有关更多信息,请参阅排除 Amazon Batch 的故障

步骤 3:创建任务队列并连接计算环境

$ aws batch describe-compute-environments --compute-environments My-Eks-CE1

提交到这个新任务队列的任务将作为 pod 在加入与您的计算环境关联的 Amazon EKS 集群的Amazon Batch托管节点上运行。

$ 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

步骤 4:创建任务定义

$ 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" } } } ] } } } EOF $ aws batch register-job-definition --cli-input-json file://./batch-eks-job-definition.json
注意

步骤 5:提交任务

$ aws batch submit-job --job-queue My-Eks-JQ1 \ --job-definition MyJobOnEks_Sleep --job-name My-Eks-Job1 $ aws batch describe-jobs --job <jobId-from-submit-response>
注意

(可选)提交带有替代项的作业

此任务会覆盖传递给容器的命令。

$ 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
注意