本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amaz Amazon Batch on EKS 私有集群入门
Amazon Batch 是一项托管服务,可在您的亚马逊 Elastic Kubernetes Service(Amazon EKS)集群中协调批处理工作负载。该服务包括队列、依赖项跟踪、托管作业重试次数和优先级、容器组(pod)管理和节点扩展。此功能可将您现有的私有 Amazon EKS 集群 Amazon Batch 与连接起来,从而大规模运行您的作业。您可以使用 eksctl
默认情况下,Amazon EKS 仅限私有集群无法访问 inbound/outbound 互联网,您只能从您的 VPC 或连接的网络中访问 API 服务器。Amazon VPC 终端节点用于实现对其他 Amazon
服务的私密访问。 eksctl
支持使用预先存在的 Amazon VPC 和子网创建完全私有的集群。
还会在提供的亚马逊 VPC 中创建 Amazon VPC 终端节点,并修改所提供子网的路由表。eksctl
每个子网都应有一个与之关联的显式路由表,因为
不会修改主路由表。您的集群必须从 Amazon VPC 中的容器注册表中拉取映像。同样,您可以在 Amazon VPC 中创建 Amazon Elastic Container Registry,并将容器映像复制到其中,以供节点拉取。有关更多信息,请参阅将容器映像从一个存储库复制到另一个存储库。要开始使用 Amazon ECR 私有存储库,请参阅 Amazon ECR 私有存储库。eksctl
您可以选择使用 Amazon ECR 创建缓存提取规则。为外部公共注册表创建直通缓存规则后,您可以使用您的 Amazon ECR 私有注册表统一资源标识符 (URI) 从该外部公共注册表中提取映像。然后,Amazon ECR 会创建一个存储库并缓存映像。当使用 Amazon ECR 私有注册表 URI 提取缓存映像时,Amazon ECR 会检查远程注册表以查看是否有新版本的映像,并且会最多每 24 小时更新一次您的私有注册表。
目录
概览
本教程演示如何使用 Amazon CloudShell、kubectl
和使用私有 Amazon EKS 进行设置 Amazon Batch eksctl
。
- 目标受众
-
本教程专为负责设置、测试和部署的系统管理员和开发人员而设计 Amazon Batch。
- 使用的功能
-
本教程向您展示如何使用 Amazon CLI、to:
-
使用亚马逊 Elastic Container Registry (Amazon ECR) 来存储容器镜像
-
创建和配置 Amazon EKS 计算环境
-
创建任务队列。
-
创建任务定义
-
创建并提交要运行的作业
-
提交带有优先级的作业
-
- 所需时间
-
完成本教程大约需要 40-50 分钟。
- 区域限制
-
使用此解决方案不存在任何国家或地区限制。
- 资源使用成本
-
创建 Amazon 账户不收取任何费用。但是,通过实施此解决方案,您可能会产生下表中列出的部分或全部费用。
描述 费用(美元) 按集群小时数向您收费 因实例而异,请参阅 Amazon EKS 定价 亚马逊 EC2 实例 您需要为创建的每个 Amazon EC2 实例付费。有关定价的更多信息,请参阅 Amazon EC2 定价 。
先决条件
本教程使用 Amazon CloudShell 的是基于浏览器、经过预先验证的 shell,您可以直接从中启动。 Amazon Web Services Management Console这允许在集群不再具有公共互联网访问权限时对其进行访问。 Amazon CLI、kubectl
、和eksctl
可能已经作为一部分安装了 Amazon CloudShell。有关的更多信息 Amazon CloudShell,请参阅《Amazon CloudShell用户指南》。另一种方法 Amazon CloudShell 是连接到集群的 VPC 或连接的网络。
要运行 kubectl 命令,您需要对 Amazon EKS 集群的私有访问权限。这意味着,传输到集群 API 服务器的所有流量都必须来自您的集群的 VPC 或连接的网络中。
-
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
。 -
权限 — 调用 CreateComputeEnvironmentAPI 操作来创建使用 Amazon EKS 资源的计算环境的用户需要访问
eks:DescribeCluster
和eks:ListClusters
API 操作的权限。您可以按照 IAM 用户指南中添加和删除 IAM 身份权限的说明将AWSBatchFullAccess托管策略附加到您的用户账户。 -
InstanceRole— 您需要为您的 Amazon EKS 节点创建一个
InstanceRole
具有AmazonEKSWorkerNodePolicy
和AmazonEC2ContainerRegistryPullOnly
策略的节点。有关如何创建的说明,InstanceRole
请参阅创建 A mazon EKS 节点 IAM 角色。您将需要的 ARN。InstanceRole
-
Amazon Web Services 账户 身份证 — 你需要知道你的 Amazon Web Services 账户 身份证。按照查看您的 Amazon Web Services 账户 身份证中的说明进行操作。
-
(可选) CloudWatch-要检查(可选)提交带覆盖的作业的详细信息,必须配置日志记录。有关更多信息,请参阅 使用 CloudWatch 日志监控 Amaz Amazon Batch on EKS 作业。
步骤 1:为创建您的 EKS 集群 Amazon Batch
重要
为了尽可能简单快速地入门,本教程包含了使用默认设置的步骤。在为生产用途创建之前,我们建议您熟悉所有设置,并使用符合您要求的设置进行部署。
我们建议您使用
和以下配置文件来创建集群。要手动设置集群,请按照 Amazon EKS 用户指南中的部署互联网访问受限的私有集群中的说明进行操作。eksctl
-
打开Amazon CloudShell 控制台
并将区域设置为 us-east-1
。在本教程的其余部分中,请确保您使用的是us-east-1
。 -
使用示例
配置文件在该eksctl
us-east-1
区域创建私有 EKS 集群。将 yaml 文件保存到您的 Amazon CloudShell 环境中并命名clusterConfig.yaml
。您可以使用要用于集群的名称进行更改my-test-cluster
。kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 metadata: name:
my-test-cluster
region: us-east-1 availabilityZones: - us-east-1a - us-east-1b - us-east-1c managedNodeGroups: - name: ng-1 privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false -
使用命令创建您的资源:
eksctl create cluster -f clusterConfig.yaml
。创建集群可能需要 10 到 15 分钟。 -
集群创建完成后,您必须将您 Amazon CloudShell 的 IP 地址添加到允许列表中。要查找您 Amazon CloudShell 的 IP 地址,请运行以下命令:
curl http://checkip.amazonaws.com
获得公有 IP 地址后,您必须创建允许列表规则:
aws eks update-cluster-config \ --name
my-test-cluster
\ --region us-east-1 \ --resources-vpc-config endpointPublicAccess=true,endpointPrivateAccess=true,publicAccessCidrs=["<Public IP>/32"]然后将更新应用于 kubectl 配置文件:
aws eks update-kubeconfig --name
my-test-cluster
--region us-east-1 -
要测试您是否有权访问节点,请运行以下命令:
kubectl get nodes
命令的输出是:
NAME STATUS ROLES AGE VERSION ip-192-168-107-235.ec2.internal Ready none 1h v1.32.3-eks-473151a ip-192-168-165-40.ec2.internal Ready none 1h v1.32.3-eks-473151a ip-192-168-98-54.ec2.internal Ready none 1h v1.32.1-eks-5d632ec
步骤 2:为你的 EKS 集群做好准备 Amazon Batch
所有步骤都是必需的,并且必须在其中完成 Amazon CloudShell。
-
为 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)启用访问权限
用
kubectl
为集群创建 Kubernetes 角色以允许 Amazon Batch 监视节点和容器组(pod),并用于绑定该角色。您必须为每个 Amazon 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$
eksctl create iamidentitymapping \ --cluster
my-test-cluster
\ --arn "arn:aws:iam::<your-account-ID>
:role/AWSServiceRoleForBatch" \ --usernameaws-batch
输出:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::
<your-account-ID>
: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-test-cluster
-
对于
securityGroupIds
参数,您可以使用与 Amazon EKS 集群相同的安全组。此命令检索集群的安全组 ID。$
aws eks describe-cluster \ --name
my-test-cluster
\ --query cluster.resourcesVpcConfig.clusterSecurityGroupId -
使用
instanceRole
您在先决条件中创建的 ARN。
$
cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "
My-Eks-CE1
", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:us-east-1
::cluster/
<your-account-ID>
my-test-cluster
", "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-the-image-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 计算环境的维护是一项共同责任。有关更多信息,请参阅 Amazon EKS 中的安全性。
步骤 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 步:创建带有直通缓存的 Amazon ECR
由于集群没有公共互联网访问权限,因此您必须为容器映像创建 Amazon ECR。以下说明创建带有拉取缓存规则的 Amazon ECR 来存储图像。
-
以下命令创建直通缓存规则。你可以
tutorial-prefix
用不同的前缀替换。aws ecr create-pull-through-cache-rule \ --ecr-repository-prefix "
my-prefix
" \ --upstream-registry-url "public.ecr.aws" \ --region us-east-1 -
使用公共 ECR 进行身份验证。
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin
<your-account-ID>
.dkr.ecr.us-east-1.amazonaws.com现在你可以拉取图像了。
docker pull
<your-account-ID>
.dkr.ecr.us-east-1.amazonaws.com/my-prefix
/amazonlinux/amazonlinux:2 -
您可以通过运行以下命令来验证存储库和映像:
aws ecr describe-repositories
aws ecr describe-images --repository-name
my-prefix
/amazonlinux/amazonlinux -
用于拉取容器的图像字符串采用以下格式:
<your-account-ID>
.dkr.ecr.us-east-1.amazonaws.com/my-prefix
/amazonlinux/amazonlinux:2
步骤 6:注册作业定义
以下 Job 定义指示 pod 休眠 60 秒。
在作业定义的映像字段中,与其提供指向公共 ECR 存储库中映像的链接,不如提供指向我们的私有 ECR 存储库中存储的映像的链接。请参阅以下示例作业定义:
$
cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "
MyJobOnEks_Sleep
", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "<your-account-ID>
.dkr.ecr.us-east-1.amazonaws.com/my-prefix
/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 注意事项。
步骤 7:提交要运行的作业
在中运行以下 Amazon CLI 命令 Amazon CloudShell 提交新任务并返回唯一的 jobid。
$
aws batch submit-job --job-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
- -job-nameMy-Eks-Job1
备注
-
有关在 Amazon EKS 资源上运行作业的更多信息,请参阅 Amazon EKS 作业。
步骤 8:查看作业的输出
要检查 Job 的状态,请执行以下操作:
$
aws batch describe-jobs --job
<JobID-from-submit-response>
startedAt
和stoppedAt
应该相隔一分钟。
步骤 9:(可选)提交包含改写的作业
此作业会覆盖传递给容器的命令。
$
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 注意事项。
第 10 步:清理教程资源
启用 Amazon EC2 实例后,您需要为该实例付费。您可以删除该实例以停止产生费用。
要删除您创建的资源,请执行以下操作:
-
打开 Amazon Batch 控制台,网址为https://console.aws.amazon.com/batch/
。 -
在导航窗格中选择 Job 队列。
-
在 Job 队列表中,选择您为本教程创建的 Job 队列。
-
从 “操作” 中选择 “禁用”。当 Job 队列状态变为 “已禁用” 后,您可以选择 “删除”。
-
删除 Job 队列后,在导航窗格中选择计算环境。
-
选择您为本教程创建的计算环境,然后从 “操作” 中选择 “禁用”。计算环境可能需要 1-2 分钟才能完全禁用。
-
计算环境的 “状态” 变为 “已禁用” 后,选择 “删除”。删除计算环境可能需要 1-2 分钟。
其他资源
完成本教程后,您可能需要探索以下主题::
故障排除
如果由 Amazon Batch 启动的节点无权访问存储您的映像的 Amazon ECR 存储库(或任何其他存储库),则您的任务可能会保持 “启动” 状态。这是因为 pod 将无法下载镜像并运行您的 Amazon Batch 作业。如果你点击启动的 pod 名称, Amazon Batch 你应该能够看到错误消息并确认问题。错误消息应该类似于以下内容:
Failed to pull image "public.ecr.aws/amazonlinux/amazonlinux:2": rpc error: code = Unknown desc = failed to pull and unpack image "public.ecr.aws/amazonlinux/amazonlinux:2": failed to resolve reference "public.ecr.aws/amazonlinux/amazonlinux:2": failed to do request: Head "https://public.ecr.aws/v2/amazonlinux/amazonlinux/manifests/2": dial tcp: i/o timeout
有关其他常见的故障排除方案,请参阅排查 Amazon Batch问题。要根据容器状态进行故障排除,请参阅如何对 Amazon EKS 中的容器状态进行故障排除?