クラスターのマネージドノードグループを作成する
このトピックでは、Amazon EKS クラスターに登録しているノードの、Amazon EKS マネージド型ノードグループを起動する方法を説明します。ノードがクラスターに参加したら、それらのノードに Kubernetes アプリケーションをデプロイ可能になります。
Amazon EKS マネージド型ノードグループを初めて起動する場合は、Amazon EKS の使用を開始する のガイドのいずれかに従うことをお勧めします。このガイドでは、ノードを使用して Amazon EKS クラスターを作成するためのウォークスルーを説明します。
重要
-
Amazon EKS ノードは、標準の Amazon EC2 インスタンスです。通常の Amazon EC2 料金に基づいて請求されます。詳細については、「Amazon EC2 の料金
」を参照してください。 -
AWS Outposts、AWS Wavelength、または AWS Local Zones が有効になっている AWS リージョンでは、マネージド型ノードを作成できません。AWS Outposts、AWS Wavelength、または AWS Local Zones が有効になっている AWS リージョンでは、セルフマネージド型ノードを作成できます。詳細については、セルフマネージド Amazon Linux ノードを作成する、セルフマネージド Microsoft Windows ノードを作成する、および セルフマネージド Bottlerocket ノードを作成する を参照してください。また、Outpost に自己管理型 Amazon Linux ノードグループを作成することもできます。詳細については、「AWS Outposts で Amazon Linux ノードを作成する」を参照してください。
-
Amazon EKS 最適化 Linux または Bottlerocket に含まれる
bootstrap.sh
ファイル用に AMI ID を指定しない場合、マネージドノードグループはmaxPods
の値に最大数を適用します。vCPU が 30 未満のインスタンスの場合、最大数は110
です。30 を超える vCPU を持つインスタンスの場合、最大数は250
に跳ね上がります。これらの数値は、内部の Amazon EKS スケーラビリティチームのテストによる Kubernetes スケーラビリティのしきい値と推奨設定に基づいています。詳細については、「Amazon VPC CNI プラグインがノードあたりのポッド数の制限を引き上げ 」のブログ記事を参照してください。
-
既存の Amazon EKS クラスター。デプロイするには、「Amazon EKS クラスターを作成します。」を参照してください。
-
ノードが使用する既存の IAM ロール。作成する場合は「Amazon EKS ノードの IAM ロール」を参照してください。このロールに VPC CNI のポリシーがどちらも含まれていない場合、VPC CNI ポッドには以下の別のロールが必要です。
-
(オプションですが推奨) 必要な IAM ポリシーがアタッチされた独自の IAM ロールで設定された Amazon VPC CNI plugin for Kubernetes アドオン。詳細については、「IRSA を使用するように Amazon VPC CNI プラグインを設定する」を参照してください。
-
「最適な Amazon EC2 ノードインスタンスタイプを選択する」に記載されている考慮事項に精通していること。選択したインスタンスタイプによっては、クラスターと VPC に関する追加の前提条件がある場合もあります。
-
Windows マネージドノードグループを追加するには、まずクラスターの Windows サポートを有効にする必要があります。詳細については、「EKS クラスターに WiWindows ノードをデプロイする」を参照してください。
マネージド型ノードグループを作成するには、以下のいずれかを使用します。
eksctl
eksctl を使用してマネージド型ノードグループを作成する
この手順には、eksctl
バージョン 0.190.0
以降が必要です。お使いのバージョンは、以下のコマンドを使用して確認できます。
eksctl version
eksctl
のインストールまたはアップグレードの手順については、eksctl
ドキュメントの「インストール
-
(オプション) [AmazonEKS_CNI_Policy] マネージド IAM ポリシーが Amazon EKS ノードの IAM ロールにアタッチされている場合は、代わりに Kubernetes
aws-node
サービスアカウントに関連付けた IAM ロールに割り当てることをお勧めします。詳細については、「IRSA を使用するように Amazon VPC CNI プラグインを設定する」を参照してください。 -
カスタム起動テンプレートの有無にかかわらず、マネージド型ノードグループを作成します。起動テンプレートを手動で指定すると、ノードグループをより詳細にカスタマイズできます。たとえば、カスタム 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 Familymy-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 のアクセスをブロックするには、起動テンプレートで必要な設定を行います。
-
次のコンテンツをデバイスにコピーします。
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 数」を参照してください。
-
次のコマンドでノードグループをデプロイします。
eksctl create nodegroup --config-file eks-nodegroup.yaml
AWS Management Console
AWS Management Console を使用してマネージド型ノードグループを作成する
-
クラスターステータスが
ACTIVE
と表示されるまで待ちます。まだACTIVE
ではないクラスターにはマネージド型ノードグループを作成できません。 -
Amazon EKS コンソール
を開きます。 -
マネージド型ノードグループを作成するクラスターの名前を選択します。
-
[コンピューティング] タブを選択します。
-
[ノードグループを追加] を選択します。
-
[ノードグループの設定] ページで、必要に応じてパラメータを指定し、[次へ] を選択します。
-
[名前] – マネージド型ノードグループの一意の名前を入力します。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。
-
[ノード IAM ロール] – ノードグループで使用するノードインスタンスロールを選択します。詳細については、「Amazon EKS ノードの IAM ロール」を参照してください。
重要
-
クラスターの作成に使用したロールは使用できません。
-
セルフマネージド型ノードグループによって現在使用されていないロールを使用することをお勧めします。それ以外の場合は、新しいセルフマネージド型ノードグループで使用します。詳細については、「クラスターからマネージドノードグループを削除する」を参照してください。
-
起動テンプレートを使用する — (オプション) 既存の起動テンプレートを使用するかどうかを選択します。[起動テンプレート名] を選択します。次に、[起動テンプレートのバージョン] を選択します。バージョンを選択しない場合、Amazon EKS はテンプレートのデフォルトのバージョンを使用します。起動テンプレートを使用すると、ノードグループを詳細にカスタマイズできます。これにより、カスタム AMI のデプロイや、Pods への大量の IP アドレスの割り当て、インスタンスのブロックとは異なる CIDR ブロックからの Pods への IP アドレスの割り当て、インスタンスでの
containerd
ランタイムの有効化、アウトバウンドのインターネットアクセスのないクラスターに対するノードのデプロイなどが可能になります。詳細については、「プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす」、「カスタムネットワーキングを使用して代替サブネットにpodsをデプロイする」、「containerd-bootstrap.title」、および「インターネットアクセスが制限されたプライベートクラスターをデプロイする」を参照してください。起動テンプレート は、「起動テンプレートを使用してマネージドノードをカスタマイズする」の要件を満たしている必要があります。独自の起動テンプレートを使用しない場合、Amazon EKS API はデフォルトの Amazon EC2 起動テンプレートをアカウントに作成し、デフォルトの起動テンプレートを使用してノードグループをデプロイします。
サービスアカウントの IAM ロール を実装する場合は、AWS サービスへのアクセス許可を必要とするすべての Pod に、必要なアクセス許可を直接割り当て、クラスター内の Pods が、現在の AWS リージョンを取得するなどの理由で IMDS にアクセスしないようにします。また、起動テンプレートでホストネットワークを使用しない Pods の、IMDS へのアクセスを無効にすることもできます。詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する
」を参照してください。 -
Kubernetes ラベル - (オプション) 管理対象ノードグループ内のノードに Kubernetes ラベルを適用することを選択できます。
-
Kubernetes テイント - (オプション) 管理対象ノードグループ内のノードに Kubernetes テイントを適用することを選択できます。[効果] メニューでの利用可能なオプションは
NoSchedule
、NoExecute
、およびPreferNoSchedule
です。詳細については、「特定のノードで Pods がスケジュールされないようにする」を参照してください。 -
[タグ] – (オプション) Amazon EKS マネージド型ノードグループにタグを付けることを選択できます。これらのタグは、Auto Scaling グループやインスタンスなど、ノードグループ内の他のリソースには伝達されません。詳細については、「タグを使用して Amazon EKS リソースを整理する」を参照してください。
-
-
[コンピューティング構成とスケーリングの設定] ページで、必要に応じてパラメータを指定し、[次へ] を選択します。
-
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
」を参照してください。 -
[最小サイズ] – マネージド型ノードグループがスケールインできるノードの最小数を指定します。
-
[最大サイズ] – マネージド型ノードグループがスケールアウトできるノードの最大数を指定します。
-
ノードグループの更新設定 – (オプション) 並行して更新するノードの数または割合を選択できます。これらのノードは、更新中は使用できません。[使用できない最大値] で、次のいずれかのオプションを選択し、その [値] を指定します:
-
[数値] – 並行して更新できるノードグループ内のノード数を選択して指定します。
-
[パーセンテージ] – 並行して更新できるノードグループ内のノードの割合を選択して指定します。ノードグループに多数のノードがある場合に便利です。
-
-
-
[ネットワーキングを指定] ページで、必要に応じてパラメータを指定し、[次へ] を選択します。
-
[サブネット]: マネージド型ノードを起動するサブネットを選択します。
重要
Amazon EBS ボリュームによってバックアップされ、Kubernetes Cluster Autoscaler
を使用する複数のアベイラビリティーゾーンにわたってステートフルアプリケーションを実行している場合、それぞれが単一のアベイラビリティーゾーンにスコープされる複数のノードグループを設定する必要があります。また、 --balance-similar-node-groups
機能を有効にする必要があります。重要
-
パブリックサブネットを選択し、クラスターでパブリック API サーバーのエンドポイントのみが有効になっている場合は、サブネットの
MapPublicIPOnLaunch
にtrue
をセットして、インスタンスがクラスターに正常に参加できるようにします。サブネットが 2020 年 3 月 26 日以降にeksctl
または Amazon EKS で発行された AWS CloudFormation テンプレートを使用して作成された場合は、この設定はすでにtrue
に設定されています。サブネットが 2020 年 3 月 26 日より前にeksctl
または AWS CloudFormation テンプレートを使用して作成されている場合は、設定を手動で変更する必要があります。詳細については、サブネットの IPv4 アドレス指定属性の変更を参照してください。 -
起動テンプレートを使用しており、複数のネットワークインターフェイスを指定している場合には、たとえ
MapPublicIpOnLaunch
がtrue
に設定されていても、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 アクセスが許可されます。
-
-
[確認と作成] ページで、マネージド型ノードグループの設定を確認し、[作成] を選択します。
ノードがクラスターに参加できない場合は、トラブルシューティングの章にある「ノードをクラスターに結合できません」を参照してください。
-
ノードのステータスを監視し、
Ready
ステータスになるまで待機します。kubectl get nodes --watch
-
(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 アドオンのインストールとクラスターへのアプリケーションのデプロイを開始できます。以下のトピックは、クラスターの機能を拡張するのに役立ちます。
-
クラスターを作成した IAM プリンシパルは、
kubectl
または AWS Management Console を使用して Kubernetes API サーバーを呼び出すことができる唯一のプリンシパルです。他の IAM プリンシパルがクラスターにアクセスできるようにする場合は、それらを追加する必要があります。詳細については、IAM ユーザーおよびロールに Kubernetes API へのアクセスを付与するおよび必要なアクセス許可を参照してください。 -
次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
-
すべての Kubernetes サービスアカウントに IAM ロールを割り当てて、Pods が必要最小限のアクセス許可のみを持つように計画しています。
-
クラスター内の Pods が、現在の AWS リージョンの取得といったその他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていません。
詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する
」を参照してください。 -
-
ノードグループ内のノード数を自動的に調整するように、Kubernetes Cluster Autoscaler
を設定します。 -
サンプルアプリケーションをクラスターにデプロイします。
-
クラスターを管理するための重要なツールを使用して、クラスターリソースを整理およびモニタリングします。