教學課程:Amazon EKS Private Clusters AWS Batch 入門 - AWS Batch

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

教學課程:Amazon EKS Private Clusters 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叢集支援 AWS Batch 通常可在AWS 區域AWS Batch商業 中使用。

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

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

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

必要條件

開始本教學課程之前,您必須安裝並設定下列工具和資源,以建立和管理 AWS Batch 和 Amazon EKS 資源。您也需要建立所有必要的資源,包括 VPC、子網路、路由表、VPC端點和 Amazon EKS叢集。您需要使用 AWS CLI。

  • AWS CLI – 使用 AWS 服務的命令列工具,包括 Amazon EKS。本指南要求您使用 2.8.6 版或更新版本,或 1.26.0 版或更新版本。如需詳細資訊,請參閱 使用者指南 中的安裝、更新和解除安裝 AWS CLIAWS Command Line Interface

    安裝 之後 AWS CLI,建議您進行設定。如需詳細資訊,請參閱 AWS Command Line Interface 使用者指南 中的使用 進行快速組態aws configure

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

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

  • 必要 AWS Identity and Access Management (IAM) 許可 – 您使用IAM的安全主體必須具有使用 Amazon EKSIAM角色和服務連結角色 AWS CloudFormation,以及 VPC和 相關資源的許可。如需詳細資訊,請參閱 IAM 使用者指南 中的 Amazon Elastic Kubernetes Service 和使用服務連結角色的動作、資源和條件金鑰https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html您必須以同一位使用者的身分完成本指南中的所有步驟。

  • 建立 Amazon EKS叢集 – 如需詳細資訊,請參閱 Amazon 使用者指南 EKS eksctl 中的 Amazon 入門。 EKS

    注意

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

  • 許可 – 呼叫 CreateComputeEnvironment API 操作以建立使用 Amazon EKS 資源的運算環境的使用者需要eks:DescribeClusterAPI操作的許可。使用 AWS Management Console 使用 Amazon 資源建立運算EKS資源需要 eks:DescribeCluster和 的許可eks:ListClusters

  • 使用範例組態檔案在 us-east-1 eksctl 區域中建立私有EKS叢集。

    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

  • 批次受管節點必須部署到具有所需VPC介面端點的子網路。如需詳細資訊,請參閱私有叢集需求。

準備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 可以觀看節點和 Pod,以及繫結角色。您必須為每個 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 用於管理和生命週期 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

    更新 Kubernetes aws-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.

建立 Amazon EKS運算環境

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

現在, 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 服務連結角色。在 Amazon AWS Batch 上EKS僅支援 AWS Batch 服務連結角色。

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

    注意

    我們建議您在大多數執行個體中使用 SPOT_PRICE_CAPACITY_OPTIMIZED,而不是 SPOT_CAPACITY_OPTIMIZEDn。

  • 對於 instanceRole,請參閱 Amazon 使用者指南 中的建立 Amazon EKS節點IAM角色啟用叢集的IAM主體存取權 EKS 如果您使用的是 Pod 網路,請參閱設定 Amazon VPCCNI外掛程式 Kubernetes 在 Amazon EKS使用者指南 中使用服務帳戶IAM的角色。

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

  • securityGroupIds 參數可以使用與 Amazon EKS叢集相同的安全群組。此命令會擷取叢集的安全群組 ID。

    $ eks describe-cluster \ --name <cluster-name> \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • Amazon EKS運算環境的維護是共同的責任。如需詳細資訊,請參閱 Amazon 中的安全性EKS

重要

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

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

確認 status 參數不是 INVALID。如果是,請查看原因的 statusReason 參數。如需詳細資訊,請參閱疑難排解 AWS Batch

建立任務佇列並連接運算環境

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

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

建立任務定義

在任務定義的映像欄位中,提供儲存在我們私有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或連線的網路

提交工作

$ 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儲存庫 (或任何其他儲存庫),則您的任務可能會保持 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 中對 Pod 狀態進行疑難排解EKS?