開始使用 AWS Batch Amazon EKS 私有集群 - AWS Batch

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

開始使用 AWS Batch Amazon EKS 私有集群

AWS Batch 這是一項受管服務,可協調 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中的批次工作負載。這包括佇列、相依性追蹤、受管理的工作重試和優先順序、網繭管理和節點調整。此功能可將現有的私有 Amazon EKS 叢集與連接起 AWS Batch 來,以大規模執行任務。您可以使用 eksctl(Amazon EKS 的命令列界面)、 AWS 主控台或建立包含所有其他必要資源的私有 Amazon EKS 叢集。AWS Command Line Interface對於私有 Amazon EKS 叢集的 Support 通 AWS Batch 常可在商業用途中使用 (如果 AWS 區域 有提 AWS Batch供)。

Amazon EKS 私有叢集沒有入站/輸出網際網路存取,而且只有私有子網路。Amazon VPC 端點用於啟用對其他 AWS 服務的私有存取。 eksctl支援使用預先存在的 Amazon VPC 和子網路建立完全私有的叢集。 eksctl也會在提供的 Amazon 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 EKS 資源所需的下列工具 AWS Batch 和資源。您還需要建立所有必要的資源,包括 VPC、子網路、路由表、VPC 端點和 Amazon EKS 叢集。您需要使用 AWS CLI.

  • AWS CLI— 用於處理 AWS 服務的命令行工具,包括 Amazon EKS。本指南要求您使用 2.8.6 或更新版本或 1.26.0 或更新版本。若要取得更多資訊,請參閱《AWS Command Line Interface 使用指南》 AWS CLI中的〈安裝、更新和解除安裝〉

    安裝之後 AWS CLI,我們建議您對其進行配置。若要取得更多資訊,請參閱《使用指南》aws configure中的AWS Command Line Interface 〈快速配置

  • kubectl— 使用Kubernetes叢集的命令列工具。本指南要求您使用版本 1.23 或更新版本。如需詳細資訊,請參閱 Amazon EKS 使用者指南中的安裝或更新 kubectl

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

  • 必要 AWS Identity and Access Management (IAM) 許可 — 您使用的 IAM 安全主體必須具有使用 Amazon EKS IAM 角色和服務連結角色的許可 AWS CloudFormation,以及 VPC 和相關資源。如需詳細資訊,請參閱 IAM 使用者指南中的適用於 Amazon Elastic Kubernetes Service 的動作、資源和條件金鑰使用服務連結角色您必須以同一位使用者的身分完成本指南中的所有步驟。

  • 建立 Amazon EKS 叢集 — 如需詳細資訊,請參閱 Amazon EKS 使用者指南eksctl中的開始使用 Amazon EKS

    注意

    AWS Batch 不會為 CoreDNS 或其他部署網繭提供受管節點協調流程。如果您需要 CoredN,請參閱 Amazon EKS 使用者指南中的新增 CoreDNS Amazon EKS 附加元件或者,用eksctl create cluster create來建立叢集,依預設會包含 CoreDNS。

  • 權限 — 呼叫 CreateComputeEnvironmentAPI 操作以建立使用 Amazon EKS 資源之運算環境的使用者需要 eks:DescribeCluster API 作業的許可。使用 AWS Management Console 使用 Amazon EKS 資源建立運算資源需要eks:DescribeClustereks:ListClusters的許可。

  • 使用範例設定檔,在 us-east-1 區域中建立私有 EKS 叢集。eksctl

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

所有步驟都是必需的。

  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 允許觀看節點和網繭,以及繫結角色。您必須針對每個 Amazon EKS 叢集執行一次此動作。

    注意

    如需有關使用 RBAC 授權的詳細資訊,請參閱文件中的使用 RBAC 授權。Kubernetes

    $ 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角色, AWS Batch 以管理和生命週期網繭並繫結它。您必須為每個唯一命名空間執行一次此操作。

    $ 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-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 運算環境

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

現在AWSServiceRoleForBatch服務連結角色可以存取 Amazon EKS 叢集,您可以建立 AWS 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參數,則會使用 AWS Batch 服務連結角色。 AWS Batch 在 Amazon EKS 上僅支援 AWS Batch 服務連結角色。

  • Amazon EKS 運算環境僅BEST_FIT_PROGRESSIVE支援SPOT_CAPACITY_OPTIMIZED、和SPOT_PRICE_CAPACITY_OPTIMIZED配置策略。

    注意

    我們建議您在大多數情況下使用SPOT_PRICE_CAPACITY_OPTIMIZED而不是 SPOT_CAPACITY_OPTIMIZED n。

  • 有關詳情instanceRole,請參閱 Amazon EKS 使用者指南中的建立 Amazon EKS 節點 IAM 角色和啟 IAM 主體存取您的叢集。如果您使用的是網繭聯網,請參閱 Amazon EKS 使用者指南中的設定 Amazon VPC CNI 外掛程式以Kubernetes將 IAM 角色用於服務帳戶

  • 取得subnets參數工作子網路的一種方法是使用 Amazon EKS 受管節點群組建立的公有子網路,這些公用子網路是在建立 Amazon EKS 叢集eksctl時所建立的。否則,請使用具有支援提取影像之網路路徑的子網路。

  • 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參數。如需詳細資訊,請參閱 疑難排 AWS Batch

步驟 3:建立工作佇列並連接運算環境

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

提交至此新任務佇列的任務會在加入與運算環境相關聯之 Amazon EKS 叢集的 AWS 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:建立工作定義

在工作定義的影像欄位中,不要提供公用 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
備註

故障診斷

如果由啟動的節點 AWS Batch 無法存取儲存映像的 Amazon ECR 儲存庫 (或任何其他存放庫),則您的任務可能會維持在 START 狀態。這是因為網繭將無法下載映像並執行您的 AWS Batch 工作。如果您按一下由啟動的網繭名稱, 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難 如需根據網繭狀態進行疑難排解,請參閱如何疑難排解 Amazon EKS 中的網繭狀態? 。