亚马逊 EKS 计算环境 - Amazon Batch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

亚马逊 EKS 计算环境

通过 AmazAmazon Batch on EKS 开始使用提供了创建 EKS 计算环境的简短指南。本节提供有关 EKS 计算环境的更多详细信息。

默认 AMI 选择

在创建 EKS 计算环境时,您无需指定 Amazon 系统映像 (AMI)。 Amazon Batch根据您的CreateComputeEnvironment请求中指定的Kubernetes版本和实例类型选择 Amazon EKS 优化的 AMI。一般情况下,建议您使用默认 AMI 选项。有关经过亚马逊 EKS 优化的 AMI 的更多信息,请参阅《亚马逊 EKS 用户指南》中针对亚马逊 EKS 优化的亚马逊 Linux AMI

运行以下命令查看为您的 EKS 计算环境选择了Amazon Batch哪种 AMI 类型。以下示例是非 GPU 实例类型。

# compute CE example: indicates Batch has chosen the AL2 x86 or ARM EKS 1.22 AMI, depending on instance types $ aws batch describe-compute-environments --compute-environments My-Eks-CE1 \ | jq '.computeEnvironments[].computeResources.ec2Configuration' [ { "imageType": "EKS_AL2", "imageKubernetesVersion": "1.22" } ]

以下示例是 GPU 实例类型。

# GPU CE example: indicates Batch has choosen the AL2 x86 EKS Accelerated 1.22 AMI $ aws batch describe-compute-environments --compute-environments My-Eks-GPU-CE \ | jq '.computeEnvironments[].computeResources.ec2Configuration' [ { "imageType": "EKS_AL2_NVIDIA", "imageKubernetesVersion": "1.22" } ]

支持的 Kubernetes 版本

Amazon Batch在 Amazon 上 EKS 目前支持以下Kubernetes版本:

  • 1.24

  • 1.23

  • 1.22

  • 1.21

  • 1.20

注意

我们建议使用 1.22 或更高Kubernetes版本。

如果您使用不支持的Kubernetes版本创建计算环境,则Amazon Batch在 Amazon EKS 上,会将计算环境状态更改为INVALID。您会在statusReason参数中看到一个与以下内容相似的错误集。

reason=CLIENT_ERROR - ... EKS Cluster version [1.xx] is unsupported

如果您在使用或 UpdateComputeEnvironmentAPI 操作创建或更新计算环境时指定了CreateComputeEnvironment不支持的Kubernetes版本,则会看到一条类似于以下内容的错误消息。

At least one imageKubernetesVersion in EC2Configuration is not supported.

更新计算环境的Kubernetes版本

使用Amazon Batch,您可以更新计算环境的Kubernetes版本以支持 EKS 集群升级。计算环境的Kubernetes版本是Amazon Batch启动运行任务的Kubernetes节点的 EKS AMI 版本。在更新 EKS 集群的控制平面Kubernetes版本之前或之后,您可以在其 EKS 节点上执行版本升级。我们建议您在升级控制平面后更新节点。有关更多信息,请参阅 Amazon EKS 用户指南中的更新 Amazon EKS 集群Kubernetes版本

要升级计算环境的Kubernetes版本,请使用 UpdateComputeEnvironmentAPI 操作。

$ aws batch update-compute-environment \ --compute-environment <compute-environment-name> \ --compute-resources \ 'ec2Configuration=[{imageType=EKS_AL2,imageKubernetesVersion=1.23}]'

Kubernetes节点的共同责任

维护计算环境是一项共同责任。

  • 请勿更改或移除Amazon Batch节点、标签、污点、命名空间、启动模板或auto 扩展组。不要向Amazon Batch托管节点添加污点。如果您进行任何更改,您的计算环境将无法得到支持,并且会出现包括空闲实例在内的故障。

  • 不要将你的 pod 定位到Amazon Batch托管节点。如果您将 pod 定位到托管节点,则会出现扩展中断和任务队列卡住的情况。运行不在自管理节点或托管节点组Amazon Batch上使用的工作负载。有关更多信息,请参阅 Amazon EKS 用户指南中的托管节点组

  • 您可以将目标定DaemonSet为在Amazon Batch托管节点上运行。有关更多信息,请参阅DaemonSet在Amazon Batch托管节点上运行

Amazon Batch不会自动更新计算环境 AMI。更新它们是你的责任。运行以下命令将您的 AMI 更新到最新的 AMI 版本。

$ aws batch update-compute-environment \ --compute-environment <compute-environment-name> \ --compute-resources 'updateToLatestImageVersion=true'

Amazon Batch不会自动升级Kubernetes版本。运行以下命令将您的计算机环境Kubernetes版本更新到 1.23

$ aws batch update-compute-environment \ --compute-environment <compute-environment-name> \ --compute-resources \ 'ec2Configuration=[{imageType=EKS_AL2,imageKubernetesVersion=1.23}]'

更新到最新的 AMI 或Kubernetes版本时,您可以指定是否在任务更新时终止任务 (terminateJobsOnUpdate),以及如果正在运行的任务未完成,则需要等待多长时间才能替换实例 (jobExecutionTimeoutMinutes.) 有关更多信息,请参阅更新计算环境以及在 UpdateComputeEnvironmentAPI 操作中设置的基础架构更新策略 (UpdatePolicy)。

DaemonSet在Amazon Batch托管节点上运行

Amazon Batch在Amazon Batch托管Kubernetes节点上设置污点。您可以使用以下方法DaemonSet将定位为在Amazon Batch托管节点上运行tolerations

tolerations: - key: "batch.amazonaws.com/batch-node" operator: "Exists"

执行此操作的另一种方法是使用以下方法tolerations

tolerations: - key: "batch.amazonaws.com/batch-node" operator: "Exists" effect: "NoSchedule" - key: "batch.amazonaws.com/batch-node" operator: "Exists" effect: "NoExecute"

使用启动模板进行自定义

Amazon Batch在亚马逊 EKS 上支持启动模板。您的启动模板可以做什么有限制。

重要

Amazon Batch运行/etc/eks/bootstrap.sh。不要/etc/eks/bootstrap.sh在启动模板或cloud-inituser-data脚本中运行。除了参数之外,您还可以向 bootstrap.sh 添加其他--kubelet-extra-args参数。为此,请在/etc/aws-batch/batch.config文件中设置AWS_BATCH_KUBELET_EXTRA_ARGS变量。有关详细信息,请参阅以下示例。

注意

如果在调用后CreateComputeEnvironment更改了启动模板,则UpdateComputeEnvironment必须调用以评估要替换的启动模板的版本。

添加kubelet额外的参数

Amazon Batch支持在kubelet命令中添加额外的参数。有关支持的参数列表,请参阅Kubernetes文档kubelet中的。在以下示例中,--node-labels mylabel=helloworld已添加到kubelet命令行中。

MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==MYBOUNDARY==" --==MYBOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash mkdir -p /etc/aws-batch echo AWS_BATCH_KUBELET_EXTRA_ARGS=\"--node-labels mylabel=helloworld\" >> /etc/aws-batch/batch.config --==MYBOUNDARY==--

安装Amazon EFS 卷

您可以使用启动模板将卷装载到节点。在以下示例中,使用cloud-configpackagesruncmd设置。有关更多信息,请参阅cloud-init文档中的云配置示例

MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==MYBOUNDARY==" --==MYBOUNDARY== Content-Type: text/cloud-config; charset="us-ascii" packages: - amazon-efs-utils runcmd: - file_system_id_01=fs-abcdef123 - efs_directory=/mnt/efs - mkdir -p ${efs_directory} - echo "${file_system_id_01}:/ ${efs_directory} efs _netdev,noresvport,tls,iam 0 0" >> /etc/fstab - mount -t efs -o tls ${file_system_id_01}:/ ${efs_directory} --==MYBOUNDARY==--

要在作业中使用此卷,必须将其添加到 eksProperties 参数中RegisterJobDefinition。以下示例是作业定义的很大一部分。

{ "jobDefinitionName": "MyJobOnEks_EFS", "type": "container", "eksProperties": { "podProperties": { "containers": [ { "image": "public.ecr.aws/amazonlinux/amazonlinux:2", "command": ["ls", "-la", "/efs"], "resources": { "limits": { "cpu": "1", "memory": "1024Mi" } }, "volumeMounts": [ { "name": "efs-volume", "mountPath": "/efs" } ] } ], "volumes": [ { "name": "efs-volume", "hostPath": { "path": "/mnt/efs" } } ] } } }

在节点中,Amazon EFS 卷安装在/mnt/efs目录中。在 EKS 任务的容器中,该卷安装在/efs目录中。

IPv6 支持

Amazon Batch支持具有 IPv6 地址的 Amazon EKS 集群。无需自定义即可获得Amazon Batch支持。但是,在开始之前,我们建议您查看 Amazon EKS 用户指南为 Pod 和服务分配 IPv6 地址中概述的注意事项和条件。