本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:Amazon EKS Private Clusters AWS Batch 入門
AWS Batch 是一項受管服務,可在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中協調批次工作負載。這包括佇列、相依性追蹤、受管任務重試和優先順序、Pod 管理和節點擴展。此功能會將現有的私有 Amazon EKS叢集與 連線 AWS Batch ,以大規模執行您的任務。您可以使用 eksctl
僅限 Amazon EKS私有叢集沒有傳入/傳出網際網路存取權,而且只有私有子網路。Amazon VPC端點用於啟用對其他服務 AWS 的私有存取。 eksctl
支援使用預先存在的 Amazon VPC和子網路建立完全私有叢集。
也會在提供的 Amazon 中建立 Amazon VPC端點,VPC並修改所提供子網路的路由表。eksctl
每個子網路都應有一個與其相關聯的明確路由表,因為
不會修改主路由表。您的叢集eksctl
您可以選擇性地使用 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 CLI 。 AWS Command Line Interface
安裝 之後 AWS CLI,建議您進行設定。如需詳細資訊,請參閱 AWS Command Line Interface 使用者指南 中的使用 進行快速組態
aws configure
。 -
kubectl
– 要使用的命令列工具 Kubernetes 叢集。本指南要求您使用版本1.23
或更新版本。如需詳細資訊,請參閱 Amazon EKS使用者指南 中的安裝或更新kubectl
。 -
– 命令列工具,用於使用 Amazon EKS叢集,可自動化許多個別任務。本指南要求您使用版本eksctl
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:DescribeCluster
API操作的許可。使用 AWS Management Console 使用 Amazon 資源建立運算EKS資源需要eks:DescribeCluster
和 的許可eks: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
-
批次受管節點必須部署到具有所需VPC介面端點的子網路。如需詳細資訊,請參閱私有叢集需求。
準備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,以及繫結角色。您必須為每個 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" \ --usernameaws-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_PROGRESSIVE
EKS運算環境僅支援SPOT_CAPACITY_OPTIMIZED
、 和SPOT_PRICE_CAPACITY_OPTIMIZED
配置策略。注意
我們建議您在大多數執行個體中使用
SPOT_PRICE_CAPACITY_OPTIMIZED
,而不是SPOT_CAPACITY_OPTIMIZED
n。 -
對於
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-definitionMyJobOnEks_Sleep
- -job-nameMy-Eks-Job1
$
aws batch describe-jobs - -job
<jobId-from-submit-response>
備註
-
僅支援單一容器任務。
-
請務必熟悉
cpu
和memory
參數的所有相關考量事項。如需詳細資訊,請參閱Amazon AWS Batch 上 的記憶體和 vCPU 考量 EKS。 -
如需在 Amazon EKS 資源上執行任務的詳細資訊,請參閱 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
備註
-
AWS Batch 任務完成後積極清理 Pod,將負載減少至 Kubernetes。 若要檢查任務的詳細資訊,必須設定記錄。如需詳細資訊,請參閱使用 CloudWatch 日誌在 Amazon EKS任務 AWS Batch 上監控。
-
為了改善對操作詳細資訊的可見性,請啟用 Amazon EKS控制平面記錄。如需詳細資訊,請參閱 Amazon 使用者指南 中的 Amazon EKS控制平面記錄。 EKS
-
Daemonsets 以及 kubelets 額外負荷會影響可用的 vCPU 和記憶體資源,特別是擴展和任務配置。如需詳細資訊,請參閱Amazon AWS Batch 上 的記憶體和 vCPU 考量 EKS。
故障診斷
如果 啟動的節點 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?