Amaz Amazon Batch on EKS 私有集群入门 - Amazon Batch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amaz Amazon Batch on EKS 私有集群入门

Amazon Batch 是一项托管服务,可在您的亚马逊 Elastic Kubernetes Service(亚马逊 EKS)集群中协调批处理工作负载。这包括队列、依赖关系跟踪、托管作业重试次数和优先级、Pod 管理和节点扩展。此功能可将您现有的私有 Amazon EKS 集群 Amazon Batch 与连接起来,从而大规模运行您的任务。您可以使用 eksctl(Amazon EKS 的命令行界面)、 Amazon 控制台或创建包含所有其他必要资源的私有 Amazon EKS 集群。Amazon Command Line Interface上对私有 Amazon EKS 集群的支持 Amazon Batch 通常在商业版中提供( Amazon Web Services 区域Amazon Batch如果有)。

Amazon EKS 仅限私有集群没有入站/出站互联网访问权限,只有私有子网。Amazon VPC 终端节点用于允许私密访问其他 Amazon 服务。 eksctl支持使用预先存在的 Amazon VPC 和子网创建完全私有集群。 eksctl还会在提供的亚马逊 VPC 中创建 Amazon VPC 终端节点,并修改所提供子网的路由表。

每个子网都应有一个与之关联的显式路由表,因为eksctl不会修改主路由表。您的集群必须从您的 Amazon VPC 中的容器注册表中提取映像。此外,您还可以在您的 Amazon VPC 中创建 Amazon 弹性容器注册表,并将容器映像复制到该注册表中,供您的节点从中提取。有关更多信息,请参阅将容器镜像从一个存储库复制到另一个存储库。要开始使用 Amazon ECR 私有存储库,请参阅 Amazon ECR 私有存储库。

您可以选择使用 Amazon ECR 创建直通缓存规则。为外部公共注册表创建了拉取缓存规则后,您可以使用您的 Amazon ECR 私有注册表 uriform 资源标识符 (URI) 从该外部公共注册表中提取映像。然后,Amazon ECR 会创建一个存储库并缓存映像。使用 Amazon ECR 私有注册表 URI 提取缓存图像时,Amazon ECR 会检查远程注册表以查看是否有新版本的映像,并最多每 24 小时更新一次您的私有注册表。

先决条件

在开始本教程之前,您必须安装和配置以下工具和资源,以便创建和管理两者 Amazon Batch 以及 Amazon EKS 资源。您还需要创建所有必要的资源,包括 VPC、子网、路由表、VPC 终端节点和 Amazon EKS 集群。你需要使用 Amazon CLI.

  • 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— 一款与 Amazon EKS 集群配合使用的命令行工具,可自动执行许多单独的任务。本指南要求您使用 0.115.0 版或更高版本。有关更多信息,请参阅《Amazon EKS 用户指南》中的安装或更新 eksctl

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

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

    注意

    Amazon 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。 Amazon Web Services Management Console

  • 使用示例eksctl配置文件在 us-east-1 区域创建私有 EK S 集群。

    kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 availabilityZones: - us-east-1a - us-east-1b - us-east-1d managedNodeGroups: privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false

    使用以下命令创建您的资源:eksctl create cluster -f clusterConfig.yaml

  • 必须将 Batch 托管节点部署到具有所需的 VPC 接口终端节点的子网。有关更多信息,请参阅私有集群要求。

步骤 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)启用访问权限

    kubectl 为集群创建 Kubernetes 角色以允许 Amazon Batch 监视节点和容器组(pod),并用于绑定该角色。您必须为每个 Amazon EKS 集群执行一次此操作。

    注意

    有关使用 RBAC 授权的更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权

    $ 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

    为管理和生命周期 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

    更新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
    注意

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

第 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-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
注意事项
  • 不应指定serviceRole参数,则将使用 Amazon Batch 服务相关角色。 Amazon Batch 在 Amazon 上,EKS 仅支持 Amazon Batch 服务相关角色。

  • Amazon EKS 计算环境仅BEST_FIT_PROGRESSIVE支持SPOT_CAPACITY_OPTIMIZED、和SPOT_PRICE_CAPACITY_OPTIMIZED分配策略。

    注意

    建议在大多数情况下使用SPOT_PRICE_CAPACITY_OPTIMIZED而不是SPOT_CAPACITY_OPTIMIZEDn。

  • 有关 instanceRole,请参阅 Amazon EKS 用户指南中的创建 Amazon EKS 节点 IAM 角色启用 IAM 主体访问您的集群。如果您使用的是容器组(pod)联网,请参阅 Amazon EKS 用户指南中的为 Kubernetes 配置 Amazon VPC CNI 插件以使用服务账户的 IAM 角色

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

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

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

重要

在继续操作之前,请务必确认计算环境是否正常。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

提交到这个新任务队列的任务在加入与您的计算环境关联的 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

步骤 4:创建作业定义

在作业定义的图像字段中,与其提供指向公共 ECR 存储库中图像的链接,不如提供指向我们私有 ECR 存储库中存储的图像的链接。参见以下作业定义示例:

$ cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "account-id.dkr.ecr.region.amazonaws.com/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

要运行 kubectl 命令,您需要私有访问您的 Amazon EKS 集群。这意味着所有流向集群 API 服务器的流量都必须来自集群的 VPC 或连接的网络

第 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
注意事项

故障排除

如果由 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。有关基于 pod 状态的故障排除,请参阅如何对 Amazon EKS 中的容器状态进行故障排除? 。