クラスターのマネージドノードグループを作成する - Amazon EKS

クラスターのマネージドノードグループを作成する

このトピックでは、Amazon EKS クラスターに登録しているノードの、Amazon EKS マネージド型ノードグループを起動する方法を説明します。ノードがクラスターに参加したら、それらのノードに Kubernetes アプリケーションをデプロイ可能になります。

Amazon EKS マネージド型ノードグループを初めて起動する場合は、Amazon EKS の使用を開始する のガイドのいずれかに従うことをお勧めします。このガイドでは、ノードを使用して Amazon EKS クラスターを作成するためのウォークスルーを説明します。

重要

マネージド型ノードグループを作成するには、以下のいずれかを使用します。

eksctl

eksctl を使用してマネージド型ノードグループを作成する

この手順には、eksctl バージョン 0.190.0 以降が必要です。お使いのバージョンは、以下のコマンドを使用して確認できます。

eksctl version

eksctl のインストールまたはアップグレードの手順については、eksctl ドキュメントの「インストール」を参照してください。

  1. (オプション) [AmazonEKS_CNI_Policy] マネージド IAM ポリシーが Amazon EKS ノードの IAM ロールにアタッチされている場合は、代わりに Kubernetes aws-node サービスアカウントに関連付けた IAM ロールに割り当てることをお勧めします。詳細については、「IRSA を使用するように Amazon VPC CNI プラグインを設定する」を参照してください。

  2. カスタム起動テンプレートの有無にかかわらず、マネージド型ノードグループを作成します。起動テンプレートを手動で指定すると、ノードグループをより詳細にカスタマイズできます。たとえば、カスタム AMI をデプロイしたり、Amazon EKS 最適化 AMI の boostrap.sh スクリプトの引数を指定したりできます。すべての使用可能なオプションとデフォルト値の一覧を表示するには、次のコマンドを入力します。

    eksctl create nodegroup --help

    次のコマンドで、my-cluster をクラスターの名前に置き換え、my-mng をノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。

    重要

    マネージド型ノードグループを最初に作成する際にカスタム起動テンプレートを使用しない場合は、後でノードグループに使用しないでください。カスタム起動テンプレートを指定しなかった場合、システムにより起動テンプレートが自動生成されます。これを手動で変更することはお勧めしません。自動生成された起動テンプレートを手動で変更すると、エラーが発生する場合があります。

起動テンプレートなし

eksctl は、デフォルトの Amazon EC2 起動テンプレートをアカウント内に作成し、指定したオプションに基づいて作成した起動テンプレートを使用してノードグループをデプロイします。--node-type の値を指定する前に「最適な Amazon EC2 ノードインスタンスタイプを選択する」を参照してください。

ami-family を許可されているキーワードに置き換えます。詳細については、「eksctl ドキュメント」の「Setting the node AMI Family」(ノード AMI ファミリーの設定) を参照してください。my-key を Amazon EC2 キーペアまたはパブリックキーの名前に置き換えます。このキーは、起動後のノードに SSH 接続するために使用されます。

注記

Windows の場合、このコマンドは SSH を有効にしません。代わりに Amazon EC2 キーペアをインスタンスに関連付け、インスタンスに RDP できるようにします。

Amazon EC2 キーペアをまだ持っていない場合は、AWS Management Console で作成できます。Linux の詳細については、「Amazon EC2 ユーザーガイド」の「Amazon EC2 のキーペアと Linux インスタンス」を参照してください。Windows の詳細については、「Amazon EC2 ユーザーガイド」の「Amazon EC2 のキーペアと Windows インスタンス」を参照してください。

次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。

  • すべての Kubernetes サービスアカウントに IAM ロールを割り当てて、Pods が必要最小限のアクセス許可のみを持つように計画しています。

  • クラスター内の Pods が、現在の AWS リージョンの取得といったその他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていません。

詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。

IMDS への Pod アクセスをブロックする場合は、次のコマンドに --disable-pod-imds オプションを追加します。

eksctl create nodegroup \ --cluster my-cluster \ --region region-code \ --name my-mng \ --node-ami-family ami-family \ --node-type m5.large \ --nodes 3 \ --nodes-min 2 \ --nodes-max 4 \ --ssh-access \ --ssh-public-key my-key

インスタンスは、オプションで、Pods に非常に多くの IP アドレスを割り当て、インスタンスとは異なる CIDR ブロックから Pods に IP アドレスを割り当て、インターネットにアクセスせずにクラスターにデプロイできます。詳細については、追加オプションのプレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やすカスタムネットワーキングを使用して代替サブネットにpodsをデプロイするおよび インターネットアクセスが制限されたプライベートクラスターをデプロイする を参照して、前のコマンドに追加します。

マネージドノードグループは、インスタンスタイプに基づいて、ノードグループの各ノードで実行できる Pods の最大数に対して 1 つの値を計算して適用します。異なるインスタンスタイプを持つノードグループを作成する場合、すべてのインスタンスタイプで計算された最小値が、ノードグループ内のすべてのインスタンスタイプで実行できる Pods の最大数として適用されます。マネージドノードグループは、各 Amazon EC2 インスタンスタイプの Amazon EKS の推奨最大ポッド数で参照するスクリプトを使用して値を計算します。

起動テンプレートの使用

起動テンプレートがすでに存在している必要があり、また、「起動テンプレート設定の基本」で指定されている要件を満たしている必要があります。次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。

  • すべての Kubernetes サービスアカウントに IAM ロールを割り当てて、Pods が必要最小限のアクセス許可のみを持つように計画しています。

  • クラスター内の Pods が、現在の AWS リージョンの取得といったその他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていません。

詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。

IMDS への Pod のアクセスをブロックするには、起動テンプレートで必要な設定を行います。

  1. 次のコンテンツをデバイスにコピーします。example values を置き換えたら、変更したコマンドを実行して eks-nodegroup.yaml ファイルを作成します。起動テンプレートなしでデプロイしたときに指定したいくつかの設定は、起動テンプレートに移動されます。version を指定しない場合は、テンプレートのデフォルトバージョンが使用されます。

    cat >eks-nodegroup.yaml <<EOF apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code managedNodeGroups: - name: my-mng launchTemplate: id: lt-id version: "1" EOF

    eksctl 設定ファイル使用の詳細については、eksctl ドキュメントの「Config file schema」を参照してください。インスタンスは、オプションで大量の IP アドレスを Pods に割り当てたり、インスタンスのブロックとは異なる CIDR ブロックから Pods に IP アドレスを割り当てたり、containerd ランタイムを使用することができます。またアウトバウンドのインターネットアクセスがないクラスターにデプロイすることも可能です。設定ファイルへの追加に関する他のオプションについては、「プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす」、「カスタムネットワーキングを使用して代替サブネットにpodsをデプロイする」、「containerd-bootstrap.title」、および「インターネットアクセスが制限されたプライベートクラスターをデプロイする」を参照してください。

    起動テンプレートで AMI ID を指定しなかった場合、マネージドノードグループは、インスタンスタイプに基づいて、ノードグループの各ノードで実行できる Pods の最大数に対して 1 つの値を計算して適用します。異なるインスタンスタイプを持つノードグループを作成する場合、すべてのインスタンスタイプで計算された最小値が、ノードグループ内のすべてのインスタンスタイプで実行できる Pods の最大数として適用されます。マネージドノードグループは、各 Amazon EC2 インスタンスタイプの Amazon EKS の推奨最大ポッド数で参照するスクリプトを使用して値を計算します。

    起動テンプレートで AMI ID を指定した場合で、カスタムネットワーク を使用しているか、インスタンスに割り当てられている IP アドレスの数を増やす 場合には、ノードグループの各ノードで実行できる Pods の最大数を指定します。詳細については、「各 Amazon EC2 インスタンスタイプの Amazon EKS 推奨最大 Pods 数」を参照してください。

  2. 次のコマンドでノードグループをデプロイします。

    eksctl create nodegroup --config-file eks-nodegroup.yaml

AWS Management Console

AWS Management Console を使用してマネージド型ノードグループを作成する

  1. クラスターステータスが ACTIVE と表示されるまで待ちます。まだ ACTIVE ではないクラスターにはマネージド型ノードグループを作成できません。

  2. Amazon EKS コンソールを開きます。

  3. マネージド型ノードグループを作成するクラスターの名前を選択します。

  4. [コンピューティング] タブを選択します。

  5. [ノードグループを追加] を選択します。

  6. [ノードグループの設定] ページで、必要に応じてパラメータを指定し、[次へ] を選択します。

    • [名前] – マネージド型ノードグループの一意の名前を入力します。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。

    • [ノード IAM ロール] – ノードグループで使用するノードインスタンスロールを選択します。詳細については、「Amazon EKS ノードの IAM ロール」を参照してください。

    重要
    • クラスターの作成に使用したロールは使用できません。

    • セルフマネージド型ノードグループによって現在使用されていないロールを使用することをお勧めします。それ以外の場合は、新しいセルフマネージド型ノードグループで使用します。詳細については、「クラスターからマネージドノードグループを削除する」を参照してください。

  7. [コンピューティング構成とスケーリングの設定] ページで、必要に応じてパラメータを指定し、[次へ] を選択します。

    • AMI タイプ – AMI タイプを選択します。Arm インスタンスをデプロイする場合は、デプロイする前に「Amazon EKS 最適化 Arm Amazon Linux AMI」の考慮事項を確認してください。

      前のページで起動テンプレートを指定し、起動テンプレートで AMI を指定した場合は、値を選択できません。テンプレートの値が表示されます。テンプレートで指定された AMI は、「AMI の指定」の要件を満たしている必要があります。

    • [キャパシティータイプ] – キャパシティタイプを選択します。キャパシティータイプの選択の詳細については、「マネージド型ノードグループのキャパシティータイプ」を参照してください。同じノードグループ内で、異なるキャパシティータイプを混在させることはできません。両方のキャパシティータイプを使用したい場合は、キャパシティータイプとインスタンスタイプをそれぞれに持つ、別々のノードグループを作成します。

    • [インスタンスタイプ] – デフォルトで 1 つまたは複数のインスタンスタイプが指定されています。デフォルトのインスタンスタイプを削除するには、インスタンスタイプの右側にある X を選択します。マネージド型ノードグループで使用するインスタンスタイプを選択します。詳細については、「最適な Amazon EC2 ノードインスタンスタイプを選択する」を参照してください。

      コンソールには、一般的に使用されるインスタンスタイプのセットが表示されます。表示されてないインスタンスタイプを持つマネージド型ノードグループの作成が必要な場合は、eksctl、AWS CLI、AWS CloudFormation、または SDK を使用して、ノードグループを作成します。前のページで起動テンプレートを指定した場合、起動テンプレートでインスタンスタイプを指定する必要があるため、値を選択できません。起動テンプレートの値が表示されます。[キャパシティータイプ] で [スポット] を選択した場合は、可用性を高めるために、複数のインスタンスタイプを指定することをお勧めします。

    • [ディスクサイズ] – ノードのルートボリュームに使用するディスクサイズ (GiB 単位) を入力します。

      前のページで起動テンプレートを指定した場合は、値を起動テンプレートで指定する必要があるため、値を選択できません。

    • [必要なサイズ] – マネージド型ノードグループが起動時に保持する必要があるノードの現在の数を指定します。

      注記

      Amazon EKS は、ノードグループを自動的にスケールインまたはスケールアウトしません。ただし、これを行うように Kubernetes Cluster Autoscaler を設定することはできます。詳細については、「AWS の Cluster Autoscaler」を参照してください。

    • [最小サイズ] – マネージド型ノードグループがスケールインできるノードの最小数を指定します。

    • [最大サイズ] – マネージド型ノードグループがスケールアウトできるノードの最大数を指定します。

    • ノードグループの更新設定 – (オプション) 並行して更新するノードの数または割合を選択できます。これらのノードは、更新中は使用できません。[使用できない最大値] で、次のいずれかのオプションを選択し、その [値] を指定します:

      • [数値] – 並行して更新できるノードグループ内のノード数を選択して指定します。

      • [パーセンテージ] – 並行して更新できるノードグループ内のノードの割合を選択して指定します。ノードグループに多数のノードがある場合に便利です。

  8. [ネットワーキングを指定] ページで、必要に応じてパラメータを指定し、[次へ] を選択します。

    • [サブネット]: マネージド型ノードを起動するサブネットを選択します。

      重要

      Amazon EBS ボリュームによってバックアップされ、Kubernetes Cluster Autoscaler を使用する複数のアベイラビリティーゾーンにわたってステートフルアプリケーションを実行している場合、それぞれが単一のアベイラビリティーゾーンにスコープされる複数のノードグループを設定する必要があります。また、--balance-similar-node-groups 機能を有効にする必要があります。

      重要
      • パブリックサブネットを選択し、クラスターでパブリック API サーバーのエンドポイントのみが有効になっている場合は、サブネットの MapPublicIPOnLaunchtrue をセットして、インスタンスがクラスターに正常に参加できるようにします。サブネットが 2020 年 3 月 26 日以降に eksctl または Amazon EKS で発行された AWS CloudFormation テンプレートを使用して作成された場合は、この設定はすでに true に設定されています。サブネットが 2020 年 3 月 26 日より前に eksctl または AWS CloudFormation テンプレートを使用して作成されている場合は、設定を手動で変更する必要があります。詳細については、サブネットの IPv4 アドレス指定属性の変更を参照してください。

      • 起動テンプレートを使用しており、複数のネットワークインターフェイスを指定している場合には、たとえ MapPublicIpOnLaunchtrue に設定されていても、Amazon EC2 はパブリック IPv4 アドレスの自動的な割り当てを行いません。このシナリオでノードがクラスターに参加するには、クラスターのプライベート API サーバーエンドポイントを有効にするか、NAT ゲートウェイなどの別の方法によってアウトバウンドインターネットアクセスを提供する、プライベートサブネットでノードを起動する必要があります。詳細については、「Amazon EC2 ユーザーガイド」の「Amazon EC2 インスタンスの IP アドレス指定」を参照してください。

    • ノードへの SSH アクセスの設定 (オプション)。SSH を有効にすることにより、インスタンスに接続し、問題がある場合に診断情報を収集できます。ノードグループを作成するときは、リモートアクセスを有効にすることを強くお勧めします。ノードグループの作成後にリモートアクセスを有効にすることはできません。

      起動テンプレートの使用を選択した場合、このオプションは表示されません。ノードへのリモートアクセスを有効にするには、起動テンプレートでキーペアを指定し、起動テンプレートで指定したセキュリティグループのノードに対して適切なポートが開いていることを確認します。詳細については、「カスタムセキュリティグループを使用する」を参照してください。

      注記

      Windows の場合、このコマンドは SSH を有効にしません。代わりに Amazon EC2 キーペアをインスタンスに関連付け、インスタンスに RDP できるようにします。

    • [SSH キーペア] (オプション) の場合は、使用する Amazon EC2 SSH キーを選択します。Linux の詳細については、「Amazon EC2 ユーザーガイド」の「Amazon EC2 のキーペアと Linux インスタンス」を参照してください。Windows の詳細については、「Amazon EC2 ユーザーガイド」の「Amazon EC2 のキーペアと Windows インスタンス」を参照してください。起動テンプレートを使用することを選択した場合、選択することはできません。Bottlerocket AMI を使用するノードグループに Amazon EC2 SSH キーが提供されると、管理コンテナも有効になります。詳細については、GitHub の「管理コンテナ」を参照してください。

    • [次からの SSH リモートアクセスを許可する] の場合、特定のインスタンスへのアクセスを制限するには、それらのインスタンスに関連付けられているセキュリティグループを選択します。特定のセキュリティグループを選択しないと、インターネット上のどの場所 (0.0.0.0/0) からでも SSH アクセスが許可されます。

  9. [確認と作成] ページで、マネージド型ノードグループの設定を確認し、[作成] を選択します。

    ノードがクラスターに参加できない場合は、トラブルシューティングの章にある「ノードをクラスターに結合できません」を参照してください。

  10. ノードのステータスを監視し、Ready ステータスになるまで待機します。

    kubectl get nodes --watch
  11. (GPU ノードのみ) GPU インスタンスタイプと Amazon EKS 最適化アクセラレーション AMI を選択した場合は、クラスター上の DaemonSet として Kubernetes 用の NVIDIA デバイスプラグインを適用する必要があります。次のコマンドを実行する前に、vX.X.X を必要となる NVIDIA/k8s-device-plugin バージョンに置き換えます。

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml

Kubernetes アドオンをインストールする

ノードが関連付けられた Amazon EKS クラスターが実行中になったところで、Kubernetes アドオンのインストールとクラスターへのアプリケーションのデプロイを開始できます。以下のトピックは、クラスターの機能を拡張するのに役立ちます。