翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon EKS プライベートクラスター AWS Batch での の開始方法
AWS Batch は、Amazon Elastic Kubernetes Service (Amazon EKS) クラスター内のバッチワークロードをオーケストレーションするマネージドサービスです。このサービスにはキューイング、依存関係の追跡、ジョブの再試行と優先順位の管理、ポッド管理、ノードスケーリングが含まれます。この機能は、既存のプライベート Amazon EKS クラスターを に接続 AWS Batch して、大規模なジョブを実行します。(Amazon EKS のeksctl
Amazon EKS プライベート専用クラスターには、デフォルトではインバウンド/アウトバウンドインターネットアクセスがなく、VPC 内または接続されたネットワーク内からのみ API サーバーにアクセスできます。Amazon VPC エンドポイントは、他の AWS サービスへのプライベートアクセスを有効にするために使用されます。 は、既存の Amazon VPC とサブネットを使用した完全プライベートクラスターの作成eksctl
をサポートします。
は、提供された Amazon VPC に Amazon VPC エンドポイントも作成し、提供されたサブネットのルートテーブルを変更します。eksctl
はメインルートテーブルを変更しないため、各サブネットには明示的に関連付けられたルートテーブルが必要です。クラスターは Amazon VPC 内のコンテナレジストリからイメージを取得する必要があります。Amazon VPC 内に Amazon Elastic Container Registry を作成し、そこにコンテナイメージをコピーしてノードの取得元にすることもできます。詳細については、「あるリポジトリから別のリポジトリにコンテナイメージをコピーする」を参照してください。Amazon ECR のプライベートリポジトリの使用を開始するには、「Amazon ECR private repositories」を参照してください。eksctl
必要に応じて、Amazon ECR を使用してプルスルーキャッシュルールを作成することもできます。外部パブリックレジストリのプルスルーキャッシュルールが作成されたら、Amazon ECR プライベートレジストリユニフォームリソース識別子 (URI) を使用して、その外部パブリックレジストリからイメージをプルできます。その後、Amazon ECR でリポジトリが作成され、イメージがキャッシュされます。キャッシュされたイメージが Amazon ECR プライベートレジストリ URI を使用してプルされると、Amazon ECR はリモートレジストリをチェックしてイメージの新しいバージョンがあるかどうかを確認し、24 時間ごとに最大 1 回、プライベートレジストリを更新します。
目次
概要
このチュートリアルでは、、 AWS CloudShell、kubectl
および を使用してプライベート Amazon EKS AWS Batch で を設定する方法を示しますeksctl
。
- 対象者
-
このチュートリアルは、システム管理者と、セットアップ、テスト、デプロイを担当する開発者を対象としています AWS Batch。
- 使用される機能
-
このチュートリアルでは AWS CLI、 を使用して以下を行う方法を示します。
-
Amazon Elastic Container Registry (Amazon ECR) を使用してコンテナイメージを保存する
-
Amazon EKS コンピューティング環境を作成して設定する
-
ジョブキューを作成します。
-
ジョブ定義の作成
-
実行するジョブを作成して送信する
-
オーバーライドを使用してジョブを送信する
-
- 所要時間
-
このチュートリアルの所要時間は約 40~50 分です。
- リージョンの制限
-
このソリューションの使用に関連する国や地域の制限はありません。
- リソースの使用コスト
-
AWS アカウントの作成には料金はかかりません。ただし、このソリューションを実装することにより、次の表に記載されるコストの一部またはすべてが発生する可能性があります。
説明 コスト (USD) クラスター時間ごとに課金されます。 インスタンスによって異なります。「Amazon EKS の料金 」を参照してください。 Amazon EC2 インスタンス 作成された各 Amazon EC2 インスタンスに対して料金が発生します。料金の詳細については、「Amazon EC2 料金表 」を参照してください。
前提条件
このチュートリアルでは、 AWS CloudShell から直接起動するブラウザベースの事前認証済みシェルである を使用します AWS Management Console。これにより、パブリックインターネットアクセスがなくなると、クラスターにアクセスできます。 AWS CLI、kubectl
、および は、 の一部として既にインストールされているeksctl
場合があります AWS CloudShell。詳細については AWS CloudShell、AWS CloudShell「 ユーザーガイド」を参照してください。代わりに AWS CloudShell 、クラスターの VPC または接続されたネットワークに接続します。
kubectl コマンドを実行するには Amazon EKS クラスターへのプライベートアクセスが必要です。つまり、クラスター API サーバーへのすべてのトラフィックは、クラスターの VPC または接続されたネットワーク内から送信する必要があります。
-
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
を参照してください。 -
アクセス許可 – CreateComputeEnvironment API オペレーションを呼び出して Amazon EKS リソースを使用するコンピューティング環境を作成するユーザーには、
eks:DescribeCluster
およびeks:ListClusters
API オペレーションに対するアクセス許可が必要です。AWSBatchFullAccess 管理ポリシーをユーザーアカウントにアタッチするには、「IAM ユーザーガイド」の「IAM ID アクセス許可の追加と削除」の指示に従います。 -
InstanceRole –
AmazonEKSWorkerNodePolicy
およびAmazonEC2ContainerRegistryPullOnly
ポリシーを持つ Amazon EKS ノードInstanceRole
の を作成する必要があります。の作成方法については、「Amazon EKS ノード IAM ロールの作成InstanceRole
」を参照してください。の ARN が必要ですInstanceRole
。 -
AWS アカウント ID – AWS アカウント ID を知る必要があります。AWS アカウント 「ID の表示」の指示に従います。
-
(オプション) CloudWatch – (オプション) オーバーライドを使用してジョブを送信するの詳細を確認するには、ログ記録を設定する必要があります。詳細については、「CloudWatch Logs を使用して Amazon EKS ジョブ AWS Batch をモニタリングする」を参照してください。
ステップ 1: の EKS クラスターを作成する AWS Batch
重要
できるだけ簡単かつ迅速に開始するために、このチュートリアルにはデフォルト設定のステップが含まれています。本番稼働用の を作成する前に、すべての設定に精通し、要件を満たす設定にデプロイすることをお勧めします。
クラスターを作成するには、
と次の設定ファイルを使用することをお勧めします。クラスターを手動でセットアップするには、「Amazon EKS ユーザーガイド」の「インターネットアクセスが制限されたプライベートクラスターをデプロイする」の指示に従います。eksctl
-
AWS CloudShell コンソール
を開き、リージョンを に設定します us-east-1
。チュートリアルの残りの部分では、 を使用していることを確認してくださいus-east-1
。 -
サンプル設定ファイルを使用して、
us-east-1
リージョンにプライベート EKS
クラスターを作成します。yaml ファイルを環境に保存し、 AWS CloudShelleksctl
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 はノードとポッドを監視したり、ロールをバインドしたりできるようになります。これを Amazon EKS クラスターごとに 1 回実行する必要があります。$
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 を管理およびライフサイクルし、バインドします。これは固有の名前空間ごとに 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-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
設定マップに問題があるためです。詳細については、「Roles with paths don't work when the path is included in their ARN in the aws-authconfigmap」を参照してください。
ステップ 3: Amazon EKS コンピューティング環境を作成する
AWS Batch コンピューティング環境は、バッチワークロードのニーズに合わせてコンピューティングリソースパラメータを定義します。マネージド型のコンピューティング環境 AWS Batch では、Amazon EKS クラスター内のコンピューティングリソース (Kubernetes ノード) の容量とインスタンスタイプを管理できます。これは、コンピューティング環境の作成時に定義するコンピューティングリソースの仕様に基づいています。EC2 オンデマンドインスタンスまたは EC2 スポットインスタンスを選択できます。
AWSServiceRoleForBatch サービスにリンクされたロールが Amazon EKS クラスターにアクセスできるようになったので、 AWS Batch リソースを作成できます。まず、Amazon EKS クラスターを指すコンピューティング環境を作成します。
-
クラスターで使用されるサブネットを取得
eksctl get cluster
するためにmy-test-cluster
subnets
を実行する場合。 -
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 マネージドノードでポッドとして実行されます。
$
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 を作成します。
-
次のコマンドは、プルスルーキャッシュルールを作成します。
tutorial-prefix
は別のプレフィックスに置き換えることができます。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: ジョブ定義を登録する
次のジョブ定義は、ポッドに 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
と は 1 分間隔で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://console.aws.amazon.com/batch/
で AWS Batch コンソールを開きます。 -
ナビゲーションペインで、ジョブキューを選択します。
-
ジョブキューテーブルで、チュートリアル用に作成したジョブキューを選択します。
-
Actions からDisable を選択します。ジョブキューの状態が無効になったら、削除を選択できます。
-
ジョブキューが削除されたら、ナビゲーションペインでコンピューティング環境を選択します。
-
このチュートリアル用に作成したコンピューティング環境を選択し、アクションから無効化を選択します。コンピューティング環境が無効になるまでに 1~2 分かかる場合があります。
-
コンピューティング環境の状態が無効になったら、削除を選択します。コンピューティング環境が削除されるまでに 1~2 分かかる場合があります。
追加リソース
チュートリアルを完了したら、次のトピックを試すことができます。
-
ベストプラクティスの詳細をご覧ください。
-
AWS Batch コアコンポーネントについて説明します。詳細については、「のコンポーネント AWS Batch」を参照してください。
-
で使用できるさまざまなコンピューティング環境について説明します AWS Batch。
-
ジョブキューとそのさまざまなスケジューリングオプションについて説明します。
-
ジョブ定義とさまざまな設定オプションについて説明します。
-
さまざまなタイプのジョブについて説明します。
トラブルシューティング
によって起動されたノードが、イメージを保存する 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のトラブルシューティング」を参照してください。ポッドステータスに基づくトラブルシューティングについては、「Amazon EKS でのポッドステータスのトラブルシューティング方法を教えてください。