Amazon EKS プライベートクラスター AWS Batch での の開始方法 - AWS Batch

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon EKS プライベートクラスター AWS Batch での の開始方法

AWS Batch は、Amazon Elastic Kubernetes Service (Amazon EKS) クラスター内のバッチワークロードをオーケストレートするマネージドサービスです。これには、キューイング、依存関係の追跡、マネージドジョブの再試行と優先順位、ポッド管理、ノードスケーリングが含まれます。この機能は、既存のプライベート Amazon EKS クラスターを に接続 AWS Batch して、大規模なジョブを実行します。eksctl (Amazon EKS のコマンドラインインターフェイス)、 AWS コンソール、または AWS Command Line Interface を使用して、他のすべての必要なリソースを含むプライベート Amazon EKS クラスターを作成できます。でのプライベート Amazon EKS クラスターのサポート AWS Batch は、 AWS リージョン が利用可能な商用 AWS Batch で一般的に利用できます。

Amazon EKS プライベート専用クラスターには、インバウンド/アウトバウンドのインターネットアクセスがなく、プライベートサブネットのみがあります。Amazon VPC エンドポイントは、他の AWS のサービスへのプライベートアクセスを有効にするために使用されます。 は、既存の Amazon VPC とサブネットを使用したフルプライベートクラスターの作成eksctlをサポートしています。eksctlまた、 は、提供された Amazon VPC に Amazon VPC エンドポイントを作成し、指定されたサブネットのルートテーブルを変更します。

eksctl はメインルートテーブルを変更しないため、各サブネットには明示的なルートテーブルが関連付けられている必要があります。クラスターは、Amazon VPC 内のコンテナレジストリからイメージをプルする必要があります。また、Amazon VPC に Amazon Elastic Container Registry を作成し、コンテナイメージをそのレジストリにコピーして、ノードがプルできるようにすることもできます。詳細については、「あるリポジトリから別のリポジトリにコンテナイメージをコピーする」を参照してください。Amazon ECR プライベートリポジトリの使用を開始するには、「Amazon ECR プライベートリポジトリ」を参照してください。

オプションで、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 のインストールまたは更新を参照してください。

  • eksctl – 多くの個々のタスクを自動化する Amazon EKS クラスターと連携するコマンドラインツール。このガイドでは、バージョン 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

すべての手順を実行する必要があります。

  1. 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
  2. ロールベースアクセス制御 (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" \ --username aws-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-definition MyJobOnEks_Sleep - -job-name My-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
メモ

トラブルシューティング

によって起動されたノードが、イメージを保存する 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 のポッドステータスのトラブルシューティング方法を教えてください」を参照してください。