翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon EKS プライベートクラスター AWS Batch での の開始方法
AWS Batch は、Amazon Elastic Kubernetes Service (Amazon EKS) クラスター内のバッチワークロードをオーケストレートするマネージドサービスです。これには、キューイング、依存関係の追跡、マネージドジョブの再試行と優先順位、ポッド管理、ノードスケーリングが含まれます。この機能は、既存のプライベート Amazon EKS クラスターを に接続 AWS Batch して、大規模なジョブを実行します。eksctl
Amazon EKS プライベート専用クラスターには、インバウンド/アウトバウンドのインターネットアクセスがなく、プライベートサブネットのみがあります。Amazon VPC エンドポイントは、他の AWS のサービスへのプライベートアクセスを有効にするために使用されます。 は、既存の Amazon VPC とサブネットを使用したフルプライベートクラスターの作成eksctl
をサポートしています。
また、 は、提供された Amazon VPC に Amazon VPC エンドポイントを作成し、指定されたサブネットのルートテーブルを変更します。eksctl
はメインルートテーブルを変更しないため、各サブネットには明示的なルートテーブルが関連付けられている必要があります。クラスターeksctl
オプションで、Amazon ECR を使用してプルスルーキャッシュルールを作成できます。外部パブリックレジストリのプルスルーキャッシュルールが作成されたら、Amazon ECR プライベートレジストリ URIform リソース識別子 (URI) を使用して、その外部パブリックレジストリからイメージをプルできます。次に、Amazon ECR はリポジトリを作成し、イメージをキャッシュします。Amazon ECR プライベートレジストリ URI を使用してキャッシュされたイメージをプルすると、Amazon ECR はリモートレジストリをチェックしてイメージの新しいバージョンがあるかどうかを確認し、24 時間ごとに 1 回までプライベートレジストリを更新します。
目次
前提条件
このチュートリアルを開始する前に、 と Amazon EKS リソースの両方を作成および管理するために必要な以下のツール AWS Batch とリソースをインストールして設定する必要があります。また、VPC、サブネット、ルートテーブル、VPC エンドポイント、Amazon EKS クラスターなど、必要なすべてのリソースを作成する必要があります。を使用する必要があります AWS CLI。
-
AWS CLI – Amazon EKS などの AWS のサービスで使用するコマンドラインツール。このガイドでは、バージョン 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
-
必須 AWS Identity and Access Management (IAM) アクセス許可 – 使用する IAM セキュリティプリンシパルには、Amazon EKS IAM ロールとサービスにリンクされたロール AWS CloudFormation、および VPC と関連リソースを操作するためのアクセス許可が必要です。詳細については、IAM ユーザーガイドの「Amazon Elastic Kubernetes Service のアクション、リソース、および条件キー」および「サービスにリンクされたロールの使用」を参照してください。このガイドのすべての手順は、1 つのユーザーとして実行する必要があります。
-
Amazon EKS クラスターの作成 – 詳細については、「Amazon EKS ユーザーガイド」の
eksctl
「Amazon EKS の開始方法」を参照してください。注記
AWS Batch は、CoreDNS やその他のデプロイポッドのマネージドノードオーケストレーションを提供しません。CoreDNS が必要な場合は、Amazon EKS ユーザーガイドのCoreDNS Amazon EKS アドオンの追加を参照してください。または、
eksctl create cluster create
を使用してクラスターを作成すると、クラスターにはデフォルトで CoreDNS が含まれています。 -
アクセス許可 – Amazon EKS リソースを使用するコンピューティング環境を作成するために CreateComputeEnvironment API オペレーションを呼び出すユーザーには、
eks:DescribeCluster
API オペレーションに対するアクセス許可が必要です。を使用して Amazon EKS リソースを使用してコンピューティングリソース AWS Management Console を作成するには、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 インターフェイスエンドポイントを持つサブネットにデプロイする必要があります。詳細については、「プライベートクラスターの要件」を参照してください。
ステップ 1: 用の 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 はノードとポッドを監視したり、ロールをバインドしたりできるようになります。これは、Amazon EKS クラスターごとに 1 回行う必要があります。注記
RBAC 認証の詳細については、Kubernetes ドキュメントのRBAC 認証の使用
を参照してください。 $
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 、ポッドを管理およびライフサイクルし、バインドします。これは固有の名前空間ごとに 1 回行う必要があります。
$
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」を参照してください。
ステップ 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 にリンクされたロールが使用されます。Amazon EKS AWS Batch では、 AWS Batch サービスにリンクされたロールのみがサポートされます。 -
Amazon EKS コンピューティング環境では
SPOT_CAPACITY_OPTIMIZED
、、BEST_FIT_PROGRESSIVE
、およびSPOT_PRICE_CAPACITY_OPTIMIZED
の割り当て戦略のみがサポートされています。注記
ほとんどの場合、
SPOT_CAPACITY_OPTIMIZED
ではなくSPOT_PRICE_CAPACITY_OPTIMIZED
を使用することをおすすめします。 -
instanceRole
については、Amazon EKS ユーザーガイドのAmazon EKS ノード IAM ロールの作成とクラスターへの IAM プリンシパルアクセスを有効にするを参照してください。ポッドネットワークを使用している場合は、Amazon EKS ユーザーガイドのサービスアカウントに IAM ロールを使用するための Kubernetes Amazon VPC CNI プラグインの設定を参照してください。 -
subnets
パラメータのサブネットを動作させる方法の 1 つとして、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を参照してください。
ステップ 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-definitionMyJobOnEks_Sleep
- -job-nameMy-Eks-Job1
$
aws batch describe-jobs - -job
<jobId-from-submit-response>
メモ
-
単一のコンテナジョブのみがサポートされます。
-
cpu
およびmemory
パラメータに関連するすべての考慮事項をよく理解しておいてください。詳細については、「Amazon EKSAWS BatchのメモリとvCPUに関する考慮事項」を参照してください。 -
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 は、ジョブの完了後にポッドを積極的にクリーンアップして、 への負荷を軽減しますKubernetes。ジョブの詳細を確認するには、ログ記録を設定する必要があります。詳細については、CloudWatch Logs を使用して Amazon EKS ジョブにおける AWS Batch をモニタリングするを参照してください。
-
操作の詳細を把握しやすくするには、Amazon EKS コントロールプレーンのログ記録を有効にします。詳細については、Amazon EKS ユーザーガイドのAmazon EKS クラスターコントロールプレーンのログ記録を参照してください。
-
Daemonsets と kubelets オーバーヘッドは、使用可能な vCPU とメモリのリソース、特にスケーリングとジョブの配置に影響します。詳細については、「Amazon EKSAWS BatchのメモリとvCPUに関する考慮事項」を参照してください。
トラブルシューティング
によって起動されたノードが、イメージを保存する Amazon ECR リポジトリ (または他のリポジトリ) にアクセス AWS Batch できない場合、ジョブは STARTING 状態のままになる可能性があります。これは、ポッドがイメージをダウンロードして 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」を参照してください。pod-status に基づくトラブルシューティングについては、「Amazon EKS のポッドステータスのトラブルシューティング方法を教えてください