本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon EKS 私有叢集 AWS Batch 上開始使用
AWS Batch 是一種受管服務,可協調 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中的批次工作負載。這包括佇列、相依性追蹤、受管任務重試和優先順序、Pod 管理和節點擴展。此功能會將現有的私有 Amazon EKS 叢集與 連線 AWS Batch ,以大規模執行任務。您可以使用 eksctl
根據預設,Amazon EKS 僅限私有叢集沒有傳入/傳出網際網路存取權,而且您只能從 VPC 或連線網路中存取 API 伺服器。Amazon VPC 端點用於啟用對其他服務 AWS 的私有存取。 eksctl
支援使用預先存在的 Amazon VPC 和子網路建立全私有叢集。
也會在提供的 Amazon VPC 中建立 Amazon VPC 端點,並修改所提供子網路的路由表。eksctl
每個子網路都應有一個與其相關聯的明確路由表,因為
不會修改主路由表。您的叢集必須從 Amazon VPC 中的容器登錄檔提取映像。您也可以在 Amazon VPC 中建立 Amazon Elastic Container Registry,並將容器映像複製到其中,以供節點提取。如需詳細資訊,請參閱將容器映像從一個儲存庫複製到另一個儲存庫。若要開始使用 Amazon ECR 私有儲存庫,請參閱 Amazon ECR 私有儲存庫。eksctl
您可以選擇性地使用 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
。 -
– 使用 Amazon EKS 叢集的命令列工具,可自動化許多個別任務。本指南要求您使用版本eksctl
0.115.0
或更新版本。如需詳細資訊,請參閱 Amazon EKS 使用者指南中的安裝或更新eksctl
。 -
許可 – 呼叫 CreateComputeEnvironment API 操作以建立使用 Amazon EKS 資源的運算環境的使用者需要
eks:DescribeCluster
和eks:ListClusters
API 操作的許可。您可以依照 IAM 使用者指南中新增和移除 IAM 身分許可的指示,將 AWSBatchFullAccess 受管政策連接至您的使用者帳戶。 -
InstanceRole – 您需要
InstanceRole
為具有AmazonEKSWorkerNodePolicy
和AmazonEC2ContainerRegistryPullOnly
政策的 Amazon EKS 節點建立 。如需如何建立 的指示,InstanceRole
請參閱建立 Amazon EKS 節點 IAM 角色。您將需要 的 ARNInstanceRole
。 -
AWS 帳戶 ID – 您需要知道您的 AWS 帳戶 ID。請遵循檢視 AWS 帳戶 ID 中的指示。
-
(選用) CloudWatch – 若要檢查 (選用) 提交具有覆寫的任務,必須設定記錄。如需詳細資訊,請參閱使用 CloudWatch Logs 監控 AWS Batch Amazon EKS 任務。
步驟 1:建立 的 EKS 叢集 AWS Batch
重要
為了盡可能簡單快速地開始使用,本教學課程包含具有預設設定的步驟。在建立 以供生產使用之前,建議您先熟悉所有設定,並使用符合您需求的設定進行部署。
我們建議您使用
和下列組態檔案來建立叢集。若要手動設定叢集,請遵循《Amazon EKS 使用者指南》中以有限的網際網路存取部署私有叢集中的指示。eksctl
-
開啟 AWS CloudShell 主控台
,並將區域設定為 us-east-1
。對於教學課程的其餘部分,請確定您使用us-east-1
。 -
us-east-1
使用範例組態檔案在 區域中建立私有 EKS
叢集。將 yaml 檔案儲存到您的 AWS CloudShell 環境並命名為eksctl
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 -
使用 命令建立您的 資源:
eksctl create cluster -f clusterConfig.yaml
。叢集建立可能需要 10-15 分鐘。 -
叢集建立完成後,您必須將 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 -
若要測試您是否可存取節點,請執行下列命令:
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。
-
建立 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,以及繫結角色。您必須為每個 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
更新Kubernetes
aws-auth
組態映射,將先前的 RBAC 許可映射至 AWS Batch 服務連結角色。$
eksctl create iamidentitymapping \ --cluster
my-test-cluster
\ --arn "arn:aws:iam::<your-account-ID>
:role/AWSServiceRoleForBatch" \ --usernameaws-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
::cluster/
<your-account-ID>
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
備註
-
Amazon EKS 運算環境的維護是共同的責任。如需詳細資訊,請參閱 Amazon EKS 中的安全性。
步驟 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 來存放映像。
-
下列命令會建立提取快取規則。您可以將
教學課程字首
取代為不同的字首。aws ecr create-pull-through-cache-rule \ --ecr-repository-prefix "
my-prefix
" \ --upstream-registry-url "public.ecr.aws" \ --region us-east-1 -
使用公有 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 -
您可以執行下列命令來驗證儲存庫和映像:
aws ecr describe-repositories
aws ecr describe-images --repository-name
my-prefix
/amazonlinux/amazonlinux -
用於提取容器的影像字串格式如下:
<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
備註
-
cpu
和memory
參數有考量事項。如需詳細資訊,請參閱Amazon EKS AWS Batch 上的 記憶體和 vCPU 考量事項。
步驟 7:提交要執行的任務
在 中執行下列 AWS CLI 命令 AWS CloudShell 以提交新的任務,並傳回唯一的 JobID。
$
aws batch submit-job --job-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
- -job-nameMy-Eks-Job1
備註
-
如需在 Amazon EKS 資源上執行任務的詳細資訊,請參閱 Amazon EKS 任務。
步驟 8:檢視任務的輸出
若要檢查任務的狀態:
$
aws batch describe-jobs --job
<JobID-from-submit-response>
startedAt
和 stoppedAt
應該相隔一分鐘。
步驟 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
備註
-
為了改善對操作詳細資訊的可見性,請啟用 Amazon EKS 控制平面記錄。如需詳細資訊,請參閱《Amazon EKS 使用者指南》中的 Amazon EKS 控制平面記錄。
-
Daemonsets 和 kubelets 額外負荷會影響可用的 vCPU 和記憶體資源,特別是擴展和任務配置。如需詳細資訊,請參閱Amazon EKS AWS Batch 上的 記憶體和 vCPU 考量事項。
步驟 10:清除您的教學課程資源
Amazon EC2 執行個體啟用時會向您收取費用。您可以刪除執行個體以停止產生費用。
若要刪除您建立的資源,請執行下列動作:
-
在 https://https://console.aws.amazon.com/batch/
開啟 AWS Batch 主控台。 -
在導覽窗格中,選擇任務佇列。
-
在任務佇列表格中,選擇您為教學課程建立的任務佇列。
-
從動作選擇停用。任務佇列狀態停用後,您可以選擇刪除。
-
刪除任務佇列後,在導覽窗格中選擇運算環境。
-
選擇您為此教學課程建立的運算環境,然後從動作中選擇停用。運算環境可能需要 1-2 分鐘才能完成停用。
-
一旦運算環境的狀態停用,請選擇刪除。可能需要 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 狀態進行故障診斷?