起動テンプレートのサポート - Amazon EKS

起動テンプレートのサポート

マネージド型ノードグループは、常に Amazon EC2 Auto Scaling グループ起動テンプレートを使用してデプロイされます。マネージド型ノードグループの作成時に、自分で使用する起動テンプレートを指定しない場合は、Amazon EKS API が、デフォルト値を持つ起動テンプレートをアカウントに作成します。そのテンプレートから、自分の起動テンプレートとマネージド型ノードグループを作成すると、マネージド型ノードをデプロイする場合に、デフォルトの起動テンプレートに比べて非常に柔軟にカスタマイズができるという利点があります。自分の起動テンプレートとカスタム AMI を使用することで、マネージド型ノードをデプロイでき、最高レベルのカスタマイズを実現できます。

自分の起動テンプレートを使用してマネージド型ノードグループをデプロイした後は、同じ起動テンプレートの異なるバージョンとして更新できます。ノードグループを別のバージョンの起動テンプレートに更新すると、指定した起動テンプレートバージョンの新しい設定と一致するように、グループ内のすべてのノードがリサイクルされます。カスタム起動テンプレートを使用していない既存のノードグループは、直接更新できません。むしろカスタム起動テンプレートを使用して、新しいノードグループを作成する必要があります。

起動テンプレート設定の基本

AWS Management Console、AWS CLI、または AWS を使用して、Amazon EC2 Auto Scaling 起動テンプレートを作成できます。詳細については、「Amazon EC2 ユーザーガイド」の「Auto Scaling グループの起動テンプレートの作成」を参照してください。起動テンプレートの一部の設定は、マネージド型ノードで使われている設定と似ています。起動テンプレートを使用してノードグループをデプロイまたは更新する場合、一部の設定はノードグループ設定または起動テンプレートで指定する必要がありますが、両方で指定することはできません。存在してはいけない場所に設定が存在する場合、ノードグループの作成や更新などの操作は失敗します。

次の表に、起動テンプレートで禁止されている設定と、マネージド型ノードグループ設定で必要になる、同様の設定 (存在する場合) を示します。リスト化されている設定は、コンソールに表示される設定です。AWS CLI と SDK では、類似するが異なる名前が場合があります。

起動テンプレート — 禁止 Amazon EKS ノードグループ設定
[高度な詳細] の下の [IAM インスタンスプロファイル] [ノードグループを設定] ページの [ノードグループ設定] の下の [ノード IAM ロール]
[ネットワークインターフェイス] ([ネットワークインターフェイスを追加]) の下の [サブネット] [ネットワーキングを指定] ページの [ノードグループネットワーク設定] の下の [サブネット]
[高度な詳細] の下の [シャットダウン動作] および [停止 – 休止動作]。起動テンプレートのどちらの設定でも、[起動テンプレート設定に含めない] のデフォルトを保持します。 同等のものはありません。Amazon EKS は、Auto Scaling グループではなく、インスタンスのライフサイクルを管理する必要があります。

次の表に、マネージド型ノードグループ設定で禁止されている設定と、起動テンプレート設定で必要になる、同様の設定 (存在する場合) を示します。リスト化されている設定は、コンソールに表示される設定です。AWS CLI と SDK とで名前が似ている場合があります。

Amazon EKS ノードグループ設定 — 禁止 起動テンプレート

(起動テンプレートでカスタム AMI を指定した場合のみ) [コンピューティングとスケーリングの構成を設定する] ページの [ノードグループのコンピューティング構成] の下の [AMI タイプ]: [起動テンプレートで指定] と、指定した AMI ID が、コンソールに表示されます。

起動テンプレートで AMI タイプが指定されていない場合は、ノードグループ設定で AMI を選択できます。

[起動テンプレートのコンテンツ] での [AMI] – 次のいずれかの要件がある場合は、ID を指定する必要があります。

[コンピューティングとスケーリングの構成を設定する] ページの [ノードグループのコンピューティング構成] の下の [ディスクサイズ]: [起動テンプレートで指定] がコンソールに表示されます。 [ストレージ (ボリューム)] ([新しいボリュームの追加]) の下の [サイズ]。これを起動テンプレートで指定する必要があります。
[ネットワーキングを指定] ページの [ノードグループ設定] の下の [SSH キーペア]: コンソールに起動テンプレートで指定したキーが表示されるか、[起動テンプレートで指定されていません] と表示されます。 [キーペア (ログイン)] の下の [キーペア名]。
起動テンプレートを使用する場合は、リモートアクセスを許可するソースセキュリティグループを指定できません。 インスタンスの場合、[ネットワーク設定] の下の [セキュリティグループ]、または [ネットワークインターフェイス] ([ネットワークインターフェイスを追加])の下の [セキュリティグループ]。両方設定することはできません。詳細については、「カスタムセキュリティグループを使用する」を参照してください。
注記
  • 起動テンプレートを使用してノードグループをデプロイする場合、[起動テンプレートのコンテンツ] の下の [インスタンスタイプ] で 0 か 1 を入力するか、コンソールの [コンピューティングとスケーリングの構成を設定する] ページにある [インスタンスタイプ] で 0 から 20 までのインスタンスタイプを指定します。または、Amazon EKS API を使用する他のツールを使用します。起動テンプレートでインスタンスタイプを指定し、その起動テンプレートを使用してノードグループをデプロイする場合、コンソールや、Amazon EKS API を使用する他のツールを使用してインスタンスタイプを指定することはできません。起動テンプレートやコンソール、または Amazon EKS API を使用する他のツールを使用してインスタンスタイプを指定しない場合は、デフォルトで t3.medium インスタンスタイプが使用されます。ノードグループがスポットキャパシティータイプを使用している場合は、コンソールを使用して複数のインスタンスタイプを指定することをお勧めします。詳細については、「マネージド型ノードグループのキャパシティータイプ」を参照してください。

  • ノードグループにデプロイするコンテナが、インスタンスメタデータサービスバージョン 2 を使用している場合は、起動テンプレートの [メタデータレスポンスのホップ制限] を 2 に設定してください。詳細については、「Amazon EC2 ユーザーガイド」の「インスタンスメタデータとユーザーデータ」を参照してください。カスタム起動テンプレートを使用せずにマネージド型ノードグループをデプロイする場合、この値はデフォルトの起動テンプレートのノードグループに対して自動的に設定されます。

Amazon EC2 インスタンスへのタグ付け

起動テンプレートの TagSpecification パラメーターを使用して、ノードグループの Amazon EC2 インスタンスに適用するタグを指定します。CreateNodegroup または UpdateNodegroupVersion API を呼び出す IAM エンティティには、ec2:RunInstances およびec2:CreateTags へのアクセス許可が必要です。また、起動テンプレートにタグが追加される必要があります。

カスタムセキュリティグループを使用する

起動テンプレートでカスタムの Amazon EC2 セキュリティグループを指定し、ノードグループ内のインスタンスに適用できます。これは、インスタンスレベルのセキュリティグループのパラメータ内か、ネットワークインターフェイス設定のパラメータの一部として指定できます。しかし、インスタンスレベルとネットワークインタフェイス、両方のセキュリティグループを指定して、起動テンプレートを作成することはできません。マネージドノード型グループでカスタムセキュリティグループを使用する際に適用される、次の条件を考慮してください。

  • Amazon EKS では、単一のネットワークインターフェイス仕様の起動テンプレートのみ使用できます。

  • デフォルトでは、Amazon EKS はクラスターセキュリティグループをノードグループ内のインスタンスに追加して、ノードとコントロールプレーンとの間の通信を容易にします。前述のいずれかのオプションを使用して、起動テンプレートでカスタムセキュリティグループを指定した場合、Amazon EKS はクラスターセキュリティグループを追加しません。したがって、セキュリティグループのインバウンドルールとアウトバウンドルールで、クラスターのエンドポイントとの通信が有効になっていることを確認する必要があります。セキュリティグループのルールが正しくないと、ワーカーノードがクラスターに参加できなくなります。適用が必要なセキュリティグループのルールについては、「Amazon EKS セキュリティグループの考慮事項」を参照してください。

  • ノードグループ内のインスタンスへの SSH アクセスが必要な場合は、そのアクセスを許可するセキュリティグループを必ず含めてください。

Amazon EC2 ユーザーデータ

cloud-init を使用すると、起動テンプレート内の Amazon EC2 ユーザーデータを、インスタンス起動時に提供できます。詳細については、「cloud-init ドキュメント」を参照してください。ユーザーデータを使用すると、一般的な設定操作を実行できます。これには、次の操作が含まれます。

マネージド型ノードグループで使用される起動テンプレートの Amazon EC2 ユーザーデータは、MIME マルチパートアーカイブの形式であることが必要です。これは、ユーザーデータが、ノードがクラスターに参加するために必要な Amazon EKS ユーザーデータにマージされるためです。kubelet を起動または変更するコマンドを、ユーザデータに指定しないでください。こうしてしまうと、Amazon EKS によってマージされたユーザーデータの一部として実行されてしまうためです。ノードへのラベル設定など、一部の kubelet パラメーターは、マネージド型ノードグループ API 経由で、直接設定できます。

注記

手動での起動や、カスタムの設定パラメータの受け渡しなど、高度な kubelet のカスタマイズが必要な場合は、「AMI を指定する」を参照してください。起動テンプレートでカスタム AMI ID が指定されている場合、Amazon EKS はユーザーデータをマージしません。

複数のユーザーデータブロックと単一の MIME マルチパートファイルを組み合わせることができます。例えば、カスタムパッケージをインストールするユーザーデータのシェルスクリプトを、Docker デーモンを設定するクラウドブートフックに組み合わせることができます。MIME マルチパートファイルには次のコンポーネントが含まれます。

  • コンテンツタイプとパートバウンダリの宣言: Content-Type: multipart/mixed; boundary="==BOUNDARY=="

  • MIME バージョンの宣言: MIME-Version: 1.0

  • 次のコンポーネントを含む 1 つ以上のユーザーデータブロック:

    • ユーザーデータブロックの始まりを示す開始境界:--==BOUNDARY==

    • ブロックのコンテンツの種類の宣言: Content-Type: text/cloud-config; charset="us-ascii"。コンテンツタイプの詳細については、cloud-init のドキュメントを参照してください。

    • ユーザーデータのコンテンツ、例えば、シェルコマンドまたは cloud-init ディレクティブのリスト。

    • MIME マルチパートファイルの終わりを示す、終了境界: --==BOUNDARY==--

    自分で MIME マルチパートファイルを作成するときに使用できる例は、次の通りです。

    MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==MYBOUNDARY==" --==MYBOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash echo "Running custom user data script" --==MYBOUNDARY==--

AMI を指定する

以下のいずれかの要件がある場合は、起動テンプレートの imageId フィールドで AMI ID を指定します。追加情報については、要件を選択してください。

eksctl を使用することで、起動テンプレートを指定したり、起動テンプレートのユーザーデータセクションに情報を指定したりせずに、引数を bootstrap.sh に渡すことができます。

Eksctl without specifying a launch template

次の内容で、my-nodegroup.yaml というファイルを作成します。この例では、ノードグループを作成し、カスタムの max pods 値を設定するために追加の kubelet 引数を指定します。その際、Amazon EKS 最適化 AMI に含まれている bootstrap.sh スクリプトを使用します。詳細については、GitHub の bootstrap.sh ファイルを参照してください。

すべての <example values> (<> を含む) を、自分の値に置き換えます。

--- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: <my-cluster-name> region: <us-west-2> managedNodeGroups: - name: <my-nodegroup ami: <ami-0e6af48ea232fbdb1> instanceType: m5.large> privateNetworking: true disableIMDSv1: true labels: { <x86-al2-specified-mng> } overrideBootstrapCommand: | #!/bin/bash /etc/eks/bootstrap.sh <my-cluster-name> \ --kubelet-extra-args <'--max-pods=40'> \ --b64-cluster-ca <certificateAuthority> \ --apiserver-endpoint <endpoint> \ --dns-cluster-ip <serivceIpv4Cidr>.10 \ --use-max-pods false

前の例で必須となる引数は、クラスター名 (my-cluster-name) のみです。ただし、--apiserver-endpoint--b64-cluster-ca、および --dns-cluster-ip を設定している場合は、describeCluster を呼び出すために bootstrap スクリプトを使用する必要はありません。これは、プライベートクラスターのセットアップや、ノードを頻繁にスケールインおよびスケールアウトするクラスターで便利です。

次のコマンドを使用すると、クラスターのための値を検索して、オプションの引数の値を指定することができます。

aws eks describe-cluster --name <my-cluster-name>

この例でのオプションの引数値は、前出のコマンドの出力で返されたプロパティの名前です。最終的に、--dns-cluster-ip の値はサービス CIDR を示す .10 となります。たとえば、erviceIpv4Cidr の戻り値が 10.100.0.0/16 であれば、自分の値は 10.100.0.10 です。

eksctl config ファイルで利用可能なすべてのオプションについては、eksctl ドキュメントの「Config file schema」を参照してください。Eksctl では起動テンプレートの作成が継続されており、config ファイルを通じてユーザーデータをその中に記述することができます。

次のコマンドを使用して、ノードグループを作成します。

eksctl create nodegroup --config-file=my-nodegroup.yaml
User data in a launch template

起動テンプレートのユーザーデータセクションで次の情報を指定します。すべての <example values> (<> を含む) を、自分の値に置き換えます。この例では、ノードグループを作成し、カスタムの max pods 値を設定するために追加の kubelet 引数を指定します。その際、Amazon EKS 最適化 AMI に含まれている bootstrap.sh スクリプトを使用します。詳細については、GitHub の bootstrap.sh ファイルを参照してください。

#!/bin/bash /etc/eks/bootstrap.sh <my-cluster-name> \ --kubelet-extra-args <'--max-pods=40'> \ --b64-cluster-ca <certificateAuthority> \ --apiserver-endpoint <endpoint> --dns-cluster-ip <serivceIpv4Cidr>.10 --use-max-pods false

前の例で必須となる引数は、クラスター名 (<my-cluster-name>) のみです。ただし、--apiserver-endpoint--b64-cluster-ca、および --dns-cluster-ip を設定している場合は、describeCluster を呼び出すために bootstrap スクリプトを使用する必要はありません。これは、プライベートクラスターのセットアップや、ノードを頻繁にスケールインおよびスケールアウトするクラスターで便利です。

次のコマンドを使用すると、クラスターのための値を検索して、オプションの引数の値を指定することができます。

aws eks describe-cluster --name <my-cluster-name>

この例でのオプションの引数値は、前出のコマンドの出力で返されたプロパティの名前です。最終的に、--dns-cluster-ip の値はサービス CIDR を示す .10 となります。たとえば、erviceIpv4Cidr の戻り値が 10.100.0.0/16 であれば、自分の値は 10.100.0.10 です。

詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「Amazon マシンイメージ (AMI)」を参照してください。Amazon EKS AMI ビルド仕様には、Amazon Linux 2 をベースにしたカスタム Amazon EKS AMI を構築するための、リソースと設定スクリプトが含まれています。詳細については、GitHubの「Amazon EKS AMI ビルド仕様」を参照してください。他のオペレーティングシステムがインストールされたカスタム AMI を作成するには、GitHubの「Amazon EKS Sample Custom AMIs」を参照してください。

重要

AMI を指定する際、Amazon EKS ではユーザーデータをマージしません。代わりに、ノードのクラスターへの参加に必要な bootstrap コマンドを、ユーザーが提供する必要があります。ノードがクラスターに参加できない場合、Amazon EKS CreateNodegroup および UpdateNodegroupVersion アクションも失敗します。

マネージド型ノードグループで AMI ID を指定する場合の制限

  • 起動テンプレートで AMI ID を指定する場合と、AMI ID を指定しない場合は、新しいノードグループを作成して切り替える必要があります。

  • 新しい AMI バージョンが利用可能になっても、コンソールでは通知を表示しません。ノードグループの AMI を新しいバージョンに更新するには、更新された AMI ID で新しいバージョンの起動テンプレートを作成し、この新しいバージョンの起動テンプレートでノードグループを更新します。

  • AMI ID を指定した場合は、API の次のフィールドを設定することはできません。

    • amiType

    • releaseVersion

    • version

  • マネージド型ノードグループでは Windows を使用できないため、Windows の AMI ID を指定することはできません。