在 Amazon EKS 私有叢集 AWS Batch 上開始使用 - AWS Batch

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Amazon EKS 私有叢集 AWS Batch 上開始使用

AWS Batch 是一種受管服務,可協調 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中的批次工作負載。這包括佇列、相依性追蹤、受管任務重試和優先順序、Pod 管理和節點擴展。此功能會將現有的私有 Amazon EKS 叢集與 連線 AWS Batch ,以大規模執行任務。您可以使用 eksctl(Amazon EKS 的命令列界面)、 AWS 主控台或 AWS Command Line Interface來建立具有所有其他必要資源的私有 Amazon EKS 叢集。

根據預設,Amazon EKS 僅限私有叢集沒有傳入/傳出網際網路存取權,而且您只能從 VPC 或連線網路中存取 API 伺服器。Amazon VPC 端點用於啟用對其他服務 AWS 的私有存取。 eksctl支援使用預先存在的 Amazon VPC 和子網路建立全私有叢集。 eksctl也會在提供的 Amazon VPC 中建立 Amazon VPC 端點,並修改所提供子網路的路由表。

每個子網路都應有一個與其相關聯的明確路由表,因為 eksctl 不會修改主路由表。您的叢集必須從 Amazon VPC 中的容器登錄檔提取映像。您也可以在 Amazon VPC 中建立 Amazon Elastic Container Registry,並將容器映像複製到其中,以供節點提取。如需詳細資訊,請參閱將容器映像從一個儲存庫複製到另一個儲存庫。若要開始使用 Amazon ECR 私有儲存庫,請參閱 Amazon ECR 私有儲存庫

您可以選擇性地使用 Amazon ECR 建立提取快取規則。為外部公有登錄檔建立提取快取規則後,您可以使用 Amazon ECR 私有登錄檔統一資源識別符 (URI) 從該外部公有登錄檔提取映像。然後,Amazon ECR 會建立儲存庫並快取映像。使用 Amazon ECR 私有登錄 URI 提取快取映像時,Amazon ECR 會檢查遠端登錄檔,以查看是否有映像的新版本,並最多每 24 小時更新您的私有登錄檔一次。

概觀

本教學課程示範如何使用 AWS CloudShell、 kubectl和 AWS Batch 設定私有 Amazon EKSeksctl

目標對象

本教學課程專為負責設定、測試和部署的系統管理員和開發人員而設計 AWS Batch。

使用的功能

本教學課程說明如何使用 AWS CLI來:

  • 使用 Amazon Elastic Container Registry (Amazon ECR) 存放容器映像

  • 建立和設定 Amazon EKS 運算環境

  • 建立任務佇列。

  • 建立任務定義

  • 建立並提交要執行的任務

  • 使用覆寫提交任務

所需時間

完成本教學課程約需 40-50 分鐘。

區域限制

使用此解決方案沒有相關聯的國家或地區限制。

資源用量成本

建立 AWS 帳戶無需付費。不過,透過實作此解決方案,您可能會產生下表中所列的部分或全部費用。

描述 費用 (美元)
您需要按叢集小時付費 視執行個體而異,請參閱 Amazon EKS 定價
Amazon EC2 執行個體 您需為建立的每個 Amazon EC2 執行個體付費。如需定價的相關資訊,請參閱 Amazon EC2 定價

先決條件

本教學使用 AWS CloudShell ,這是您直接從 啟動的瀏覽器型預先驗證 Shell AWS Management Console。這允許在叢集不再具有公有網際網路存取權時存取叢集。 AWS CLI、 kubectl和 可能eksctl已安裝為 的一部分 AWS CloudShell。如需詳細資訊 AWS CloudShell,請參閱 AWS CloudShell使用者指南。的替代方案 AWS CloudShell 是連線到叢集的 VPC 或連線的網路

若要執行 kubectl 命令,您將需要 Amazon EKS 叢集的私有存取權。這表示通往叢集 API 伺服器的所有流量都必須來自叢集的 VPC 或連線的網路。

  • 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

  • eksctl – 使用 Amazon EKS 叢集的命令列工具,可自動化許多個別任務。本指南要求您使用版本 0.115.0 或更新版本。如需詳細資訊,請參閱 Amazon EKS 使用者指南中的安裝或更新 eksctl

  • 許可 – 呼叫 CreateComputeEnvironment API 操作以建立使用 Amazon EKS 資源的運算環境的使用者需要 eks:DescribeClustereks:ListClusters API 操作的許可。您可以依照 IAM 使用者指南中新增和移除 IAM 身分許可的指示,將 AWSBatchFullAccess 受管政策連接至您的使用者帳戶。

  • InstanceRole – 您需要InstanceRole為具有 AmazonEKSWorkerNodePolicyAmazonEC2ContainerRegistryPullOnly政策的 Amazon EKS 節點建立 。如需如何建立 的指示,InstanceRole請參閱建立 Amazon EKS 節點 IAM 角色。您將需要 的 ARNInstanceRole

  • AWS 帳戶 ID – 您需要知道您的 AWS 帳戶 ID。請遵循檢視 AWS 帳戶 ID 中的指示。

  • (選用) CloudWatch – 若要檢查 (選用) 提交具有覆寫的任務,必須設定記錄。如需詳細資訊,請參閱使用 CloudWatch Logs 監控 AWS Batch Amazon EKS 任務

步驟 1:建立 的 EKS 叢集 AWS Batch

重要

為了盡可能簡單快速地開始使用,本教學課程包含具有預設設定的步驟。在建立 以供生產使用之前,建議您先熟悉所有設定,並使用符合您需求的設定進行部署。

我們建議您使用 eksctl和下列組態檔案來建立叢集。若要手動設定叢集,請遵循《Amazon EKS 使用者指南》中以有限的網際網路存取部署私有叢集中的指示。

  1. 開啟 AWS CloudShell 主控台,並將區域設定為 us-east-1。對於教學課程的其餘部分,請確定您使用 us-east-1

  2. us-east-1 使用範例組態檔案在 區域中建立私有 EKS eksctl 叢集。將 yaml 檔案儲存到您的 AWS 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
  3. 使用 命令建立您的 資源:eksctl create cluster -f clusterConfig.yaml。叢集建立可能需要 10-15 分鐘。

  4. 叢集建立完成後,您必須將 AWS CloudShell IP 地址新增至允許清單。若要尋找您的 AWS 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
  5. 若要測試您是否可存取節點,請執行下列命令:

    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 叢集 AWS Batch

所有步驟都是必要步驟,且必須在其中完成 AWS CloudShell。

  1. 建立 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
  2. 透過角色型存取控制 (RBAC) 啟用存取

    使用 為叢集kubectl建立Kubernetes角色,以允許 AWS 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

    為 建立命名空間範圍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

    更新Kubernetesaws-auth組態映射,將先前的 RBAC 許可映射至 AWS Batch 服務連結角色。

    $ eksctl create iamidentitymapping \ --cluster my-test-cluster \ --arn "arn:aws:iam::<your-account-ID>:role/AWSServiceRoleForBatch" \ --username aws-batch

    輸出:

    2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account-ID>:role/AWSServiceRoleForBatch" to auth ConfigMap
    注意

    路徑aws-service-role/batch.amazonaws.com/已從服務連結角色的 ARN 中移除。這是因為aws-auth組態映射發生問題。如需詳細資訊,請參閱 中的具有路徑的角色在路徑包含在其 ARN 中時無法運作aws-authconfigmap

步驟 3:建立 Amazon EKS 運算環境

AWS Batch 運算環境定義運算資源參數,以滿足批次工作負載需求。在受管運算環境中, AWS Batch 可協助您管理 Amazon EKS 叢集內運算資源 (Kubernetes節點) 的容量和執行個體類型。這是以您在建立運算環境時定義的運算資源規格為基礎。您可以使用 EC2 隨需執行個體或 EC2 Spot 執行個體。

現在AWSServiceRoleForBatch服務連結角色可存取您的 Amazon EKS 叢集,您可以建立 AWS 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:<your-account-ID>:cluster/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
備註

步驟 4:建立任務佇列並連接運算環境

重要

在繼續之前,請務必確認運算環境運作狀態良好。DescribeComputeEnvironments API 操作可用來執行此操作。

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

確認 status 參數不是 INVALID。如果是,請查看原因的 statusReason 參數。如需詳細資訊,請參閱故障診斷 AWS Batch

提交至此新任務佇列的任務會在加入與您運算環境相關聯之 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

步驟 5:使用提取快取建立 Amazon ECR

由於叢集沒有公有網際網路存取,您必須為容器映像建立 Amazon ECR。以下指示會建立具有提取快取規則的 Amazon ECR 來存放映像。

  1. 下列命令會建立提取快取規則。您可以將教學課程字首取代為不同的字首。

    aws ecr create-pull-through-cache-rule \ --ecr-repository-prefix "my-prefix" \ --upstream-registry-url "public.ecr.aws" \ --region us-east-1
  2. 使用公有 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
  3. 您可以執行下列命令來驗證儲存庫和映像:

    aws ecr describe-repositories
    aws ecr describe-images --repository-name my-prefix/amazonlinux/amazonlinux
  4. 用於提取容器的影像字串格式如下:

    <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/amazonlinux:2

步驟 6:註冊任務定義

下列任務定義會指示 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

備註

步驟 7:提交要執行的任務

在 中執行下列 AWS CLI 命令 AWS CloudShell 以提交新的任務,並傳回唯一的 JobID。

$ aws batch submit-job --job-queue My-Eks-JQ1 \ --job-definition MyJobOnEks_Sleep - -job-name My-Eks-Job1
備註
  • 如需在 Amazon EKS 資源上執行任務的詳細資訊,請參閱 Amazon EKS 任務

步驟 8:檢視任務的輸出

若要檢查任務的狀態:

$ aws batch describe-jobs --job <JobID-from-submit-response>

startedAtstoppedAt應該相隔一分鐘。

步驟 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
備註

步驟 10:清除您的教學課程資源

Amazon EC2 執行個體啟用時會向您收取費用。您可以刪除執行個體以停止產生費用。

若要刪除您建立的資源,請執行下列動作:

  1. 在 https://https://console.aws.amazon.com/batch/ 開啟 AWS Batch 主控台。

  2. 在導覽窗格中,選擇任務佇列

  3. 任務佇列表格中,選擇您為教學課程建立的任務佇列。

  4. 動作選擇停用。任務佇列狀態停用後,您可以選擇刪除

  5. 刪除任務佇列後,在導覽窗格中選擇運算環境

  6. 選擇您為此教學課程建立的運算環境,然後從動作中選擇停用。運算環境可能需要 1-2 分鐘才能完成停用。

  7. 一旦運算環境的狀態停用,請選擇刪除。可能需要 1 到 2 分鐘才能刪除運算環境。

其他資源

完成教學課程後,您可能想要探索下列主題:

故障診斷

如果 啟動的節點 AWS Batch 無法存取存放映像的 Amazon ECR 儲存庫 (或任何其他儲存庫),則您的任務可能會保持在 STARTING 狀態。這是因為 Pod 將無法下載映像並執行您的 AWS Batch 任務。如果您按一下 啟動的 Pod 名稱 AWS 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

如需其他常見的故障診斷案例,請參閱故障診斷 AWS Batch。如需根據 Pod 狀態進行故障診斷,請參閱如何在 Amazon EKS 中對 Pod 狀態進行故障診斷?