本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon EKS AWS Batch 上開始使用
AWS Batch on Amazon EKS 是一項受管服務,可將批次工作負載排程和擴展至現有的 Amazon EKS 叢集。 AWS Batch 不會代表您建立、管理或執行 Amazon EKS 叢集的生命週期操作。 AWS Batch 協調會擴展和縮減由 管理的節點 AWS Batch ,並在這些節點上執行 Pod。
AWS Batch 不會觸控與 Amazon EKS 叢集內 AWS Batch 運算環境無關的節點、自動擴展節點群組或 Pod 生命週期。為了 AWS Batch 讓 有效運作,其服務連結角色需要現有 Amazon EKS 叢集中Kubernetes的角色型存取控制 (RBAC) 許可。如需詳細資訊,請參閱 Kubernetes 文件中的使用 RBAC 授權
AWS Batch 需要Kubernetes命名空間,其可將 Pod 作為 AWS Batch 任務的範圍限制在其中。我們建議您使用專用命名空間來隔離 AWS Batch Pod 與其他叢集工作負載。
在 AWS Batch 獲得 RBAC 存取權並建立命名空間之後,您可以使用 CreateComputeEnvironment API 操作將該 Amazon EKS 叢集與 AWS Batch 運算環境建立關聯。任務佇列可以與此新的 Amazon EKS 運算環境相關聯。任務 AWS Batch 會根據 Amazon EKS 任務定義,使用 SubmitJob API 操作提交至任務佇列。 AWS Batch 然後啟動 AWS Batch 受管節點,並將任務從任務佇列做為 Pod Kubernetes 放入與 AWS Batch 運算環境相關聯的 EKS 叢集。
下列各節說明如何在 Amazon EKS AWS Batch 上設定 。
內容
概觀
本教學課程示範如何使用 AWS CLI、 kubectl
和 AWS Batch 設定 Amazon EKSeksctl
。
- 目標對象
-
本教學課程專為負責設定、測試和部署的系統管理員和開發人員而設計 AWS Batch。
- 使用的功能
-
本教學課程說明如何使用 AWS CLI來:
-
建立和設定 Amazon EKS 運算環境
-
建立任務佇列。
-
建立任務定義
-
建立並提交要執行的任務
-
使用覆寫提交任務
-
- 所需時間
-
完成本教學課程約需 30-40 分鐘。
- 區域限制
-
使用此解決方案沒有相關聯的國家或地區限制。
- 資源用量成本
-
建立 AWS 帳戶無需付費。不過,透過實作此解決方案,您可能會產生下表中所列的部分或全部費用。
描述 費用 (美元) 您需要按叢集小時付費 視執行個體而異,請參閱 Amazon EKS 定價
先決條件
開始本教學課程之前,您必須安裝並設定建立和管理 AWS Batch 和 Amazon EKS 資源所需的下列工具和資源。
-
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
。 -
– 用於使用 Amazon EKS 叢集的命令列工具,可自動化許多個別任務。本指南要求您使用版本eksctl
0.115.0
或更新版本。如需詳細資訊,請參閱 Amazon EKS 使用者指南中的安裝或更新
。eksctl
-
必要的 IAM 許可 – 您使用的 IAM 安全主體必須具有使用 Amazon EKS IAM 角色和服務連結角色 AWS CloudFormation,以及 VPC 和相關資源的許可。如需詳細資訊,請參閱《IAM 使用者指南》中的 Amazon Elastic Kubernetes Service 的動作、資源和條件金鑰和使用服務連結角色。您必須以同一位使用者的身分完成本指南中的所有步驟。
-
許可 – 呼叫 CreateComputeEnvironment API 操作以建立使用 Amazon EKS 資源的運算環境的使用者需要
eks:DescribeCluster
API 操作的許可。 -
AWS 帳戶 number – 您需要知道您的 AWS 帳戶 ID。請遵循檢視 AWS 帳戶 ID 中的指示。
(選用) CloudWatch – 若要檢查 (選用) 提交具有覆寫的任務,必須設定記錄。如需詳細資訊,請參閱使用 CloudWatch Logs 監控 AWS Batch Amazon EKS 任務。
步驟 1:建立 的 Amazon EKS 叢集 AWS Batch
重要
為了盡可能簡單快速地開始使用,本教學課程包含具有預設設定的步驟。為生產用途建立 之前,建議您先熟悉所有設定,並使用符合您需求的設定進行部署。
安裝先決條件之後,您需要使用 建立叢集eksctl
。建立叢集可能需要 10-15 分鐘。
$
eksctl create cluster --name
my-cluster-name
--regionregion-code
在上述命令中取代:
-
將
my-cluster-name
取代為您要用於叢集的名稱。 -
將
region-code
取代為 AWS 區域 以在其中建立叢集,例如us-west-2
。
本教學課程稍後需要叢集名稱和區域。
步驟 2:準備您的 Amazon EKS 叢集 AWS Batch
所有步驟都是必要的。
-
建立 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
-
透過角色型存取控制 (RBAC) 啟用存取
使用 為叢集
kubectl
建立Kubernetes角色,以允許 AWS Batch 監看節點和 Pod,以及繫結角色。您必須為每個 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
-
更新Kubernetes
aws-auth
組態映射,將先前的 RBAC 許可映射至 AWS Batch 服務連結角色。在下列命令中取代:
-
將
<your-account-number>
取代為您的 AWS 帳戶 數字。
$
eksctl create iamidentitymapping \ --cluster
my-cluster-name
\ --arn "arn:aws:iam::<your-account-number>
:role/AWSServiceRoleForBatch" \ --usernameaws-batch
輸出:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::
<your-account-number>
: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-cluster-name
-
對於
securityGroupIds
參數,您可以使用與 Amazon EKS 叢集相同的安全群組。此命令會擷取叢集的安全群組 ID。$
aws eks describe-cluster \ --name
my-cluster-name
\ --query cluster.resourcesVpcConfig.clusterSecurityGroupId -
instanceRole
會在您建立叢集時建立 。若要尋找instanceRole
清單所有使用AmazonEKSWorkerNodePolicy
政策的實體:$
aws iam list-entities-for-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
政策角色的名稱包含您建立的叢集名稱
eksctl-
。my-cluster-name
-nodegroup-example若要尋找
instanceRole
arn,請執行下列命令:$
aws iam list-instance-profiles-for-role --role-name eksctl-
my-cluster-name
-nodegroup-example輸出:
INSTANCEPROFILES arn:aws:iam::
<your-account-number>
:instance-profile/eks-04cb2200-94b9-c297-8dbe-87f12example如需詳細資訊,請參閱《Amazon EKS 使用者指南》中的建立 Amazon EKS 節點 IAM 角色和啟用叢集的 IAM 主體存取權。 如果您使用的是 Pod 網路,請參閱《Amazon EKS 使用者指南》中的設定 的 Amazon VPC CNI 外掛程式Kubernetes以使用服務帳戶的 IAM 角色。
$
cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "
My-Eks-CE1
", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:region-code
:your-account-number
:cluster/my-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-internet-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 運算環境的維護是共同的責任。如需詳細資訊,請參閱Kubernetes 節點的共同責任。
步驟 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:建立任務定義
下列任務定義會指示 Pod 休眠 60 秒。
$
cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "
MyJobOnEks_Sleep
", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "public.ecr.aws/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 EKS AWS Batch 上的 記憶體和 vCPU 考量事項。
步驟 6:提交任務
執行下列 AWS CLI 命令以提交新的任務。
$
aws batch submit-job --job-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
--job-nameMy-Eks-Job1
若要檢查任務的狀態:
$
aws batch describe-jobs --job
<jobId-from-submit-response>
備註
-
如需在 Amazon EKS 資源上執行任務的詳細資訊,請參閱 Amazon EKS 任務。
步驟 7:檢視任務的輸出
若要檢視任務的輸出,請執行下列動作:
-
在 https://https://console.aws.amazon.com/batch/
開啟 AWS Batch 主控台。 -
在導覽窗格中,選擇任務。
-
在任務佇列下拉式清單中,選擇您為教學課程建立的任務佇列。
-
任務表格列出所有任務及其目前狀態。一旦任務的狀態成功,請選擇任務的名稱
My-Eks-JQ1
,以檢視任務的詳細資訊。 -
在詳細資訊窗格中,從 開始和有時停止應該相隔一分鐘。
步驟 8:(選用) 提交具有覆寫的任務
此任務會覆寫傳遞至 container 的命令。任務完成後, 會 AWS Batch 積極地清除 Pod,以減少對 的負載Kubernetes。若要檢查任務的詳細資訊,必須設定記錄。如需詳細資訊,請參閱使用 CloudWatch Logs 監控 AWS Batch Amazon EKS 任務。
$
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 EKS AWS Batch 上的 記憶體和 vCPU 考量事項。
若要檢視任務的輸出,請執行下列動作:
-
在 https://https://console.aws.amazon.com/batch/
開啟 AWS Batch 主控台。 -
在導覽窗格中,選擇任務。
-
在任務佇列下拉式清單中,選擇您為教學課程建立的任務佇列。
-
任務表格列出您的所有任務及其目前狀態。一旦任務狀態成功,請選擇任務名稱以檢視任務的詳細資訊。
-
在詳細資訊窗格中,選擇日誌串流名稱。任務的 CloudWatch 主控台將開啟,並且應該有一個事件具有 訊息
hello world
或您的自訂訊息。
步驟 9:清除您的教學課程資源
您需支付啟用 Amazon EC2 執行個體的費用。您可以刪除執行個體以停止產生費用。
若要刪除您建立的資源,請執行下列動作:
-
在 https://https://console.aws.amazon.com/batch/
開啟 AWS Batch 主控台。 -
在導覽窗格中,選擇任務佇列。
-
在任務佇列表格中,選擇您為教學課程建立的任務佇列。
-
選擇停用。任務佇列狀態停用後,您可以選擇刪除。
-
刪除任務佇列後,在導覽窗格中選擇運算環境。
-
選擇您為此教學課程建立的運算環境,然後選擇停用。運算環境可能需要 1-2 分鐘才能完成停用。
-
一旦運算環境的狀態停用,請選擇刪除。可能需要 1-2 個小節才能刪除運算環境。
其他資源
完成教學課程後,您可能想要探索下列主題: