

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# ノードを使用してコンピューティングリソースを管理する
<a name="eks-compute"></a>

Kubernetes ノードはコンテナ化されたアプリケーションを実行するマシンです。各ノードには以下のコンポーネントがあります：
+  **[コンテナランタイム](https://kubernetes.io/docs/setup/production-environment/container-runtimes/)** - コンテナの実行を担当するソフトウェア。
+  **[kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)** - コンテナが正常で、関連する Pod 内で実行されていることを確認します。
+  **[kube-proxy](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/)** - Pod との通信を許可するネットワークルールを維持します。

詳細については、Kubernetes ドキュメントの「[ノード](https://kubernetes.io/docs/concepts/architecture/nodes/)」を参照してください。

Amazon EKS クラスターは、任意の [EKS Auto Mode マネージド型ノード](automode.md)、[セルフマネージド型ノード](worker.md)、[Amazon EKS マネージド型ノードグループ](managed-node-groups.md)、[AWS Fargate](fargate.md)、[Amazon EKS Hybrid Nodes](hybrid-nodes-overview.md) を組み合わせて、Pod をスケジュールできます。クラスターにデプロイされているノードの詳細については[AWS マネジメントコンソール に Kubernetes リソースを表示する](view-kubernetes-resources.md)を参照してください。

**注記**  
ハイブリッドノードを除くノードはクラスターの作成時に選択したサブネットと同じ VPC 内にある必要があります。ただし、ノードは同じサブネット内にある必要はありません。

## コンピューティングオプションの比較
<a name="_compare_compute_options"></a>

次の表に、要件を満たすための最適なオプションを決定する際に、評価すべき基準をいくつか示します。セルフマネージド型ノードはリストされているすべての条件をサポートするもう 1 つのオプションですが、より多くの手動メンテナンスが必要です。詳細については、「[セルフマネージドノードでノードを自分自身で維持する](worker.md)」を参照してください。

**注記**  
Bottlerocket には、この表の一般的な情報と特に異なる点がいくつかあります。詳しくは、GitHub 上で Bottlerocket の[ドキュメント](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md)を参照してください。


| 条件 | EKS マネージド型ノードグループ | EKS 自動モードl | アマゾン EKS ハイブリッドノード | 
| --- | --- | --- | --- | 
|  [AWS アウトポスト](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html) にデプロイ可能   |  いいえ  |  いいえ  |  いいえ  | 
|  [AWS ローカルゾーン](local-zones.md) にデプロイ可能   |  はい  |  いいえ  |  いいえ  | 
|  Windows を必要とするコンテナを実行できる  |  はい  |  いいえ  |  いいえ  | 
|  Linux を必要とするコンテナを実行可能  |  はい  |  あり  |  はい  | 
|  インフェクエンティア チップを必要とするワークロードを実行可能  |   [はい](inferentia-support.md) – アマゾンリナックス ノードのみ  |  はい  |  いいえ  | 
|  GPU を必要とするワークロードを実行可能  |   [はい](eks-optimized-ami.md#gpu-ami) – アマゾンリナックス ノードのみ  |  あり  |  あり  | 
|  Arm プロセッサを必要とするワークロードを実行可能  |   [あり](eks-optimized-ami.md#arm-ami)   |  あり  |  あり  | 
|  AWS [Bottlerocket](https://aws.amazon.com/bottlerocket/) を実行可能   |  あり  |  はい  |  いいえ  | 
|  ポッドはCPU、メモリ、ストレージ、およびネットワークリソースを他のポッドと共有します。  |  あり  |  あり  |  あり  | 
|  Amazon EC2 インスタンスをデプロイおよび管理する必要がある  |  はい  |  いいえ - [EC2 マネージドインスタンス](automode-learn-instances.md)について説明します   |  はい - オンプレミスの物理マシンまたは仮想マシンは選択したツールで管理されます。  | 
|  Amazon EC2 インスタンスのオペレーティングシステムの保護、保守、パッチ適用を行う必要がある  |  はい  |  いいえ  |  はい – 物理マシンまたは仮想マシンで実行されているオペレーティングシステムは選択したツールで管理されます。  | 
|  ノードをデプロイする時に、追加の [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引数 などのブートストラップ引数を提供できます。  |  はい – `eksctl`、またはカスタム AMI を含む[起動テンプレート](launch-templates.md)を使用します。  |  いいえ - [`NodeClass` を使用してノードを設定します](create-node-class.md)   |  はい - nodeadm を使用してブートストラップ引数をカスタマイズできます。「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。  | 
|  ノードに割り当てられた IP アドレスとは異なる CIDR ブロックから、IP アドレスを Pod に割り当てることができます。  |  はい - カスタム AMI の起動テンプレートを使用します。詳細については「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」を参照してください。  |  いいえ  |  はい - 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」を参照してください。  | 
|  ノードに SSH 接続可能  |  はい  |  いいえ — [ノードのトラブルシューティング方法について説明します](auto-troubleshoot.md)   |  はい  | 
|  独自のカスタム AMI をノードにデプロイ可能  |  はい – [起動テンプレート](launch-templates.md)を使用します   |  いいえ  |  はい  | 
|  独自のカスタム CNI をノードにデプロイ可能  |  はい – カスタム AMI の[起動テンプレート](launch-templates.md)を使用します  |  いいえ  |  はい  | 
|  ノード AMI を自分で更新する必要がある  |   [はい](update-managed-node-group.md) - アマゾン EKS 最適化 AMI をデプロイした場合、更新が利用可能になると アマゾン EKS コンソールで通知されます。コンソールではワンクリックで更新を実行できます。カスタム AMI をデプロイした場合、更新が利用可能になっても アマゾン EKS コンソールに通知されません。更新は自分で実行する必要があります。  |  いいえ  |  はい - 物理マシンまたは仮想マシンで実行されているオペレーティングシステムは選択したツールで管理されます。「[ハイブリッドノード用のオペレーティングシステムを準備する](hybrid-nodes-os.md)」を参照してください。  | 
|  ノードの Kubernetes バージョンを自分で更新する必要があります。  |   [はい](update-managed-node-group.md) - アマゾン EKS 最適化 AMI をデプロイした場合、更新が利用可能になると アマゾン EKS コンソールで通知されます。コンソールではワンクリックで更新を実行できます。カスタム AMI をデプロイした場合、更新が利用可能になっても アマゾン EKS コンソールに通知されません。更新は自分で実行する必要があります。  |  いいえ  |  はい - 独自のツールまたは `nodeadm` を使用して、ハイブリッドノードのアップグレードを管理します。「[クラスターのハイブリッドノードをアップグレードする](hybrid-nodes-upgrade.md)」を参照してください。  | 
|  Pod で Amazon EBS ストレージを使用可能  |   [あり](ebs-csi.md)   |  はい。統合された機能として使用できます。[ストレージクラスを作成](create-storage-class.md)する方法について説明します。  |  いいえ  | 
|  Pod で Amazon EFS ストレージを使用可能  |   [あり](efs-csi.md)   |  はい  |  いいえ  | 
|  Pod で Amazon FSx for Lustre ストレージを使用可能  |   [あり](fsx-csi.md)   |  はい  |  いいえ  | 
|  Network Load Balancer をサービスに使用可能  |   [あり](network-load-balancing.md)   |  あり  |  はい - ターゲットタイプ `ip` を使用する必要があります。  | 
|  ポッドはパブリックサブネットで実行可能  |  はい  |  あり  |  いいえ - ポッドはオンプレミス環境で実行されます。  | 
|  それぞれの Pod に、異なる VPC セキュリティグループを割り当て可能  |   [はい](security-groups-for-pods.md): Linux ノードのみ  |  いいえ  |  いいえ  | 
|  Kubernetes DaemonSets を実行可能  |  はい  |  あり  |  あり  | 
|  Pod マニフェストで `HostPort` および `HostNetwork` をサポートします  |  はい  |  あり  |  あり  | 
|   AWS が利用可能なリージョン  |   [すべての アマゾン EKS 対応リージョン](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |   [すべての アマゾン EKS 対応リージョン](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |   AWS Govクラウド (米国) リージョンと中国リージョンを除く[Amazon EKS がサポートするすべてのリージョン](https://docs.aws.amazon.com/general/latest/gr/eks.html)。  | 
|  Amazon EC2 専有ホストでコンテナを実行できます  |  はい  |  いいえ  |  いいえ  | 
|  料金  |  複数の Pod を実行する Amazon EC2 インスタンスのコスト。詳細については[アマゾン EC2 料金表](https://aws.amazon.com/ec2/pricing/)を参照してください。  |  クラスターで EKS 自動モードl が有効になっている場合は自動モードl のコンピューティング機能を使用して起動されたインスタンスに対しては標準の EC2 インスタンス料金に加えて個別の料金がかかります。この金額は起動されたインスタンスタイプとクラスターが配置されている AWS リージョンによって異なります。詳細については「[アマゾン EKS の料金](https://aws.amazon.com/eks/pricing/)」を参照してください。  |  ハイブリッドノードの vCPU の 1 時間あたりのコスト。詳細については「[アマゾン EKS の料金](https://aws.amazon.com/eks/pricing/)」を参照してください。  | 

# マネージドノードグループを使用してノードライフサイクルを簡素化する
<a name="managed-node-groups"></a>

Amazon EKS マネージド型ノードグループは、Amazon EKS Kubernetes クラスターのノード (Amazon EC2 インスタンス) のプロビジョニングとライフサイクル管理を自動化します。

Amazon EKS マネージド型ノードグループでは、Kubernetes アプリケーションを実行するためのコンピューティング性能を提供する Amazon EC2 インスタンスを個別にプロビジョニングまたは登録する必要はありません。1 回の操作で、クラスターのノードを作成、自動的に更新、または終了できます。ノードを更新し、終了させることで、ノードを自動的にドレーンし、アプリケーションを利用できる状態にしておきます。

すべてのマネージド型ノードは、Amazon EKS によって管理される Amazon EC2 Auto Scaling グループの一部としてプロビジョニングされます。インスタンスや Auto Scaling グループを含むすべてのリソースは、AWS アカウント内で実行されます。各ノードグループは、定義された複数のアベイラビリティーゾーンで実行できます。

マネージド型ノードグループは、ノードのヘルスを継続的にモニタリングするノード自動修復をオプションで利用することもできます。検出された問題に自動的に対応し、可能な場合はノードを置き換えます。これにより、最小限の手動操作でクラスターの全体的な可用性が向上します。詳細については、「[ノードのヘルス問題を検出し、自動ノード修復を有効にする](node-health.md)」を参照してください。

Amazon EKS コンソール、`eksctl`、AWS CLI、AWS API、または AWS CloudFormation を含む Infrastructure as Code ツールを使用し、新規または既存のクラスターにマネージド型ノードグループを追加できます。マネージド型ノードグループの一部として起動されたノードは、自動的に Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) によって自動検出用にタグ付けされます。ノードグループを使用して、Kubernetes ラベルをノードに適用し、いつでも更新できます。

Amazon EKS マネージド型ノードグループの使用に追加料金はかかりません。お支払いいただくのはプロビジョニングした AWS リソースの分だけです。これには、Amazon EC2 インスタンス、Amazon EBS ボリューム、Amazon EKS クラスター時間、その他の AWS インフラストラクチャが含まれます。最低料金や前払いの義務は発生しません。

新しい Amazon EKS クラスターおよびマネージド型ノードグループの使用を開始するには、「[Amazon EKS の使用を開始する – AWS マネジメントコンソール と AWS CLI](getting-started-console.md)」を参照してください。

既存のクラスターにマネージド型ノードグループを追加するには、「[クラスターのマネージドノードグループを作成する](create-managed-node-group.md)」を参照してください。

## マネージド型ノードグループの概念
<a name="managed-node-group-concepts"></a>
+ Amazon EKS マネージド型ノードグループは、Amazon EC2 インスタンスを作成し、管理します。
+ すべてのマネージド型ノードは、Amazon EKS によって管理される Amazon EC2 Auto Scaling グループの一部としてプロビジョニングされます。さらに、Amazon EC2 インスタンスや Auto Scaling グループを含むすべてのリソースは、AWS アカウント内で実行されます。
+ マネージド型ノードグループの Auto Scaling グループは、グループの作成時に指定するすべてのサブネットにまたがります。
+ Amazon EKS は、Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) の使用を設定するようにマネージド型ノードグループリソースをタグ付けします。
**重要**  
Amazon EBS ボリュームによってバックアップされ、Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) を使用する複数のアベイラビリティーゾーンにわたってステートフルアプリケーションを実行している場合、それぞれが単一のアベイラビリティーゾーンにスコープされる複数のノードグループを設定する必要があります。また、`--balance-similar-node-groups` 機能を有効にする必要があります。
+ カスタム起動テンプレートを使用すると、マネージド型ノードをデプロイするときに、柔軟性とカスタマイズのレベルを向上させることができます。例えば、追加の `kubelet` 引数を指定して、カスタム AMI を使用できます。詳細については、「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」を参照してください。マネージド型ノードグループを最初に作成するときにカスタム起動テンプレートを使用しない場合は、自動生成された起動テンプレートを使用できます。自動生成されたテンプレートを手動で変更しないでください。エラーが発生します。
+ Amazon EKS は、マネージド型ノードグループで CVE およびセキュリティパッチの責任共有モデルに従います。マネージド型ノードが Amazon EKS 最適化 AMI を実行する場合、バグや問題が報告されると、Amazon EKS が AMI のパッチ適用バージョンの構築を担当します。修正を公開できます。ただし、これらのパッチが適用された AMI バージョンのマネージド型ノードグループへのデプロイはユーザーが担当します。マネージド型ノードでカスタム AMI を実行する場合、バグや問題が報告され、AMI をデプロイする場合は、ユーザーがパッチ適用バージョンの構築を担当します。詳細については、「[クラスターのためにマネージドノードグループを更新する](update-managed-node-group.md)」を参照してください。
+ Amazon EKS マネージド型ノードグループは、パブリックサブネットとプライベートサブネットの両方で起動できます。2020 年 4月 22 日 以降にパブリックサブネットでマネージド型ノードグループを起動した場合、インスタンスがクラスターに正常に参加するには、サブネットで `MapPublicIpOnLaunch` を true に設定する必要があります。パブリックサブネットが `eksctl`、または 2020 年 3 月 26 日以降に [Amazon EKS が販売した AWS CloudFormation テンプレート](creating-a-vpc.md)を使用して作成された場合、この設定はすでに true に設定されています。パブリックサブネットが 2020 年 3 月 26 日 より前に作成されている場合は、設定を手動で変更する必要があります。詳細については「[サブネットの IPv4 アドレス指定属性の変更](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)」を参照してください。
+ マネージド型ノードグループをプライベートサブネットにデプロイする場合、Amazon ECR にアクセスしてコンテナイメージをプルできることを確認します。これを行うには、NAT ゲートウェイをサブネットのルートテーブルに接続するか、次の [AWS PrivateLink VPC エンドポイント](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-setting-up-vpc-create)を追加します。
  + Amazon ECR API のエンドポイントインターフェイス — `com.amazonaws.region-code.ecr.api` 
  + Amazon ECR Docker レジストリ API のエンドポイントインターフェイス — `com.amazonaws.region-code.ecr.dkr` 
  + Amazon S3 ゲートウェイのエンドポイント - `com.amazonaws.region-code.s3` 

  その他の一般的に使用されるサービスとエンドポイントについては、「[インターネットアクセスが制限されたプライベートクラスターをデプロイする](private-clusters.md)」を参照してください。
+ マネージドノードグループは、[AWS Outposts](eks-outposts.md) または [AWS Wavelength](https://docs.aws.amazon.com/wavelength/) にはデプロイできません。マネージドノードグループは、[AWS Local Zones](https://aws.amazon.com/about-aws/global-infrastructure/localzones/) で作成できます。詳細については、「[AWS Local Zones を使用して低レイテンシーの EKS クラスターを起動する](local-zones.md)」を参照してください。
+ 1 つのクラスター内に複数のマネージド型ノードグループを作成できます。例えば、一部のワークロード用に、標準 Amazon EKS 最適化 Amazon Linux AMI を使用するノードグループを作成し、GPU サポートを必要とするワークロード用に GPU バリアントを使用する別のノードグループを作成できます。
+ マネージド型ノードグループで [Amazon EC2 インスタンスのステータスチェック](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)に障害が発生した場合、Amazon EKS は問題の診断に役立つエラーコードを返します。詳細については、「[マネージド型ノードグループのエラー](troubleshooting.md#troubleshoot-managed-node-groups)」を参照してください。
+ Amazon EKS は、マネージド型ノードグループインスタンスに Kubernetes ラベルを追加します。これらの Amazon EKS 提供のラベルには、プレフィックス `eks.amazonaws.com` が付きます。
+ Amazon EKS は、終了または更新時に Kubernetes API を使用してノードを自動的にドレーンします。
+ `AZRebalance` を使用してノードを終了、または目的のノード数を減らす際には、ポッドの停止状態の予算は考慮されません。これらのアクションはノード内にある Pod を削除しようとします。ただし、15 分が経過すると、ノード内のすべての Pod が終了しているかどうかにかかわらず、ノードは終了します。ノードが終了するまでの期間を延長するには、Auto Scaling グループにライフサイクルフックを追加します。詳細については、「*Amazon EC2 Auto Scaling ユーザーガイド*」の「[ライフサイクルフックの追加](https://docs.aws.amazon.com/autoscaling/ec2/userguide/adding-lifecycle-hooks.html)」を参照してください。
+ スポット中断通知またはキャパシティリバランス通知を受け取った後、ドレインプロセスを正しく実行するには、`CapacityRebalance` を `true` に設定する必要があります。
+ マネージドノードグループを更新すると、Pod に設定した Pod 中断予算が考慮されます。詳細については、「[ノードの更新の各フェーズを理解する](managed-node-update-behavior.md)」を参照してください。
+ Amazon EKS マネージド型ノードグループの使用に、追加料金はかかりません。プロビジョニングした AWS リソースに対してのみ料金が発生します。
+ ノードの Amazon EBS ボリュームを暗号化する場合は、起動テンプレートを使用してノードをデプロイできます。起動テンプレートを使用せずに、暗号化された Amazon EBS ボリュームを持つマネージド型ノードをデプロイするには、アカウントに作成された新しい Amazon EBS ボリュームをすべて暗号化してください。詳細については、*「Amazon EC2 ユーザーガイド*」の「[Encryption by default](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-by-default)」を参照してください。

## マネージド型ノードグループのキャパシティータイプ
<a name="managed-node-group-capacity-types"></a>

マネージド型ノードグループを作成する場合、キャパシティータイプをオンデマンドまたはスポットのいずれかから選択できます。Amazon EKS は、Amazon EC2 Auto Scaling グループを使用して、マネージド型ノードグループをデプロイします。これにはオンデマンドのみか、Amazon EC2 スポットインスタンスのみが含まれます。単一の Kubernetes クラスター内で、耐障害性のあるアプリケーションの Pod をスポットのマネージド型ノードグループにスケジュールし、非フォールトトレラントなアプリケーションの Pod をオンデマンドのノードグループにスケジュールできます。デフォルトでは、マネージド型ノードグループはオンデマンド Amazon EC2 インスタンスをデプロイします。

### オンデマンド
<a name="managed-node-group-capacity-types-on-demand"></a>

オンデマンドインスタンスでは、長期契約なしで、コンピューティング性能に対して秒単位で支払います。

デフォルトでは、**キャパシティータイプ**を指定しない場合、マネージド型ノードグループはオンデマンドインスタンスでプロビジョニングされます。マネージド型ノードグループは、ユーザーの代わりに Amazon EC2 Auto Scaling グループを次のように設定します。
+ オンデマンドキャパシティーをプロビジョニングするための配分戦略は、`prioritized` に設定されます。マネージド型ノードグループは、API 内部で渡されたインスタンスタイプの優先度を使用して、オンデマンドキャパシティーを満たすときに最初に使用するインスタンスタイプを決定します。例えば、3 つのインスタンスタイプを `c5.large`、`c4.large`、`c3.large` の順序で指定するとします。オンデマンドインスタンスが起動されると、マネージド型ノードグループは `c5.large`、`c4.large`、`c3.large` の順でオンデマンドキャパシティーを満たします。詳しくは、*Amazon EC2 Auto Scaling ユーザーガイド*の [Amazon EC2 Auto Scaling グループ](https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-purchase-options.html#asg-allocation-strategies)を参照してください。
+ Amazon EKS は、キャパシティータイプを `eks.amazonaws.com/capacityType: ON_DEMAND` に指定しているマネージド型ノードグループ内のすべてのノードに、次の Kubernetes ラベルを追加します。このラベルを使用すると、オンデマンドノードで、ステートフルまたは非フォールトトレラントなアプリケーションをスケジュールできます。

### Spot
<a name="managed-node-group-capacity-types-spot"></a>

Amazon EC2 スポットインスタンスは、オンデマンドの料金から大きな割引で提供される、Amazon EC2 の予備容量です。Amazon EC2 スポットインスタンスは、EC2 から容量の返却を求められると 2 分間の中断通知をもって中断されることがあります。詳細については、「*Amazon EC2 ユーザーガイド*」の「[スポットインスタンス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)」を参照してください。Amazon EC2 スポットインスタンスを使用してマネージド型ノードグループを構成し、Amazon EKS クラスターで実行されているコンピューティングノードのコストを最適化できます。

マネージド型ノードグループ内でスポットインスタンスを使用するには、キャパシティータイプを `spot` に設定してマネージド型ノードグループを作成してください。マネージド型ノードグループは、ユーザーの代わりに Amazon EC2 Auto Scaling グループを設定し、次のようなスポットベストプラクティスを適用します。
+ Spot ノードが最適な Spot キャパシティプールにプロビジョニングされるように、割り当て戦略を以下のいずれかに設定します。
  +  `price-capacity-optimized` (PCO) – Kubernetes バージョン `1.28` 以降のクラスターに新しいノードグループを作成すると、割り当てストラテジーは `price-capacity-optimized` に設定されます。ただし、Amazon EKS マネージドノードグループが PCO をサポートし始める前に `capacity-optimized` で作成済みのノードグループの割り当て戦略は変更されません。
  +  `capacity-optimized` (CO) – Kubernetes バージョン `1.27` 以前のクラスターに新しいノードグループを作成すると、割り当て戦略は `capacity-optimized` に設定されます。

  容量を割り当てるために利用可能なスポットキャパシティープールの数を増やすには、複数のインスタンスタイプを使用するようにマネージド型ノードグループを設定します。
+ スポットノードが中断するリスクが高い場合に、Amazon EKS がスポットノードを適切にドレーンおよび再調整して、アプリケーションの中断を最小限に抑えられるように、Amazon EC2 Spot Capacity Rebalancing が有効化されています。詳細については、*Amazon EC2 Auto Scaling ユーザーガイド*の [Amazon EC2 Auto Scaling キャパシティーの再調整](https://docs.aws.amazon.com/autoscaling/ec2/userguide/capacity-rebalance.html)を参照してください。
  + スポットノードが再調整の推奨事項を受け取ると、Amazon EKS は自動的に新しい代替スポットノードの起動を試みます。
  + 代替スポットノードが `Ready` 状態になる前にスポットの 2 分間の中断通知が到着すると、Amazon EKS は再調整に関する推奨事項を受け取ったスポットノードのドレーンを開始します。Amazon EKS はベストエフォートベースでノードをドレインします。そのため、Amazon EKS が既存のノードをドレインする前に、代替ノードがクラスターに参加するのを待機するという保証はありません。
  + 代替スポットノードがブートストラップされ、Kubernetes 上で `Ready` 状態になると、Amazon EKS は再調整に関する推奨事項を受信したスポットノードを遮断し、ドレインします。スポットノードを遮断すると、サービスコントローラーがこのスポットノードに新しいリクエストを送信しないようにします。正常でアクティブなスポットノードのリストからも削除されます。スポットノードをドレインすると、実行中の Pod が適切に削除されます。
+ Amazon EKS は、キャパシティータイプを `eks.amazonaws.com/capacityType: SPOT` に指定しているマネージド型ノードグループ内のすべてのノードに、次の Kubernetes ラベルを追加します。このラベルを使用して、スポットノードで耐障害性のあるアプリケーションをスケジュールできます。
**重要**  
EC2 は、スポットインスタンスを終了する 2 分前に[スポットの中断通知](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html)を発行します。ただし、スポットノード上のポッドは、正常なシャットダウンのために 2 分間すべてを確保できない場合があります。EC2 が通知を発行すると、Amazon EKS がポッドのエビクションを開始するまでに遅延が発生します。エビクションは Kubernetes API サーバーを保護するために順次実行されるため、複数のスポット回収が同時に発生した場合、一部のポッドではエビクション通知の受信が遅れることがあります。特にポッド密度が高いノード上、同時回収中、または長い終了猶予期間を使用している場合、ポッドは終了シグナルを受信せずに強制終了される場合があります。スポットワークロードでは、中断耐性のあるアプリケーションを設計し、30 秒以下の終了猶予期間を使用し、長時間実行される preStop フックを回避し、ポッドエビクションメトリクスをモニタリングして、クラスターで実際に適用される猶予期間を把握することをお勧めします。正常な終了が保証される必要があるワークロードについては、代わりにオンデマンドキャパシティーを使用することをお勧めします。

オンデマンドキャパシティーとスポットキャパシティーのどちらでノードグループをデプロイするかを決定するときは、次の条件を考慮する必要があります。
+ スポットインスタンスは、ステートレスかつフォールトトレラントで、柔軟性の高いアプリケーションに適しています。これには、バッチトレーニングワークロード、機械学習トレーニングワークロード、Apache Spark などのビッグデータ ETL、キュー処理アプリケーション、ステートレス API エンドポイントなどがあります。スポットは Amazon EC2 の予備容量であり、時間の経過とともに変化する可能性があるため、中断されても問題ないワークロードには、スポットキャパシティーを使用することをお勧めします。具体的には、スポット容量は、必要な容量が使用できない期間を許容できるワークロードに適しています。
+ 非フォールトトレラントなアプリケーションには、オンデマンドを使用することをお勧めします。これには、モニタリングツールやオペレーションツールなどのクラスター管理ツール、`StatefulSets` を必要とするデプロイ、データベースなどのステートフルなアプリケーションなどが含まれます。
+ スポットインスタンスの使用中にアプリケーションの可用性を最大化するには、スポットのマネージド型ノードグループが複数のインスタンスタイプを使用するように構成することをお勧めします。複数のインスタンスタイプを使用する場合は、次のルールを適用することをお勧めします。
  + マネージド型ノードグループ内で [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) を使用している場合、同じサイズの vCPU とメモリリソースを持つインスタンスタイプを柔軟に組み合わせて使用することをお勧めします。これは、クラスター内のノードが期待どおりにスケールされるようにするためです。例えば、4 つの vCPU と 8 GiB のメモリが必要な場合は、`c3.xlarge`、`c4.xlarge`、`c5.xlarge`、`c5d.xlarge`、`c5a.xlarge`、`c5n.xlarge`、またはその他の同等なインスタンスタイプを使用してください。
  + アプリケーションの可用性を高めるために、複数のスポットマネージド型ノードグループをデプロイすることをお勧めします。これを行うには、各グループが、同じ vCPU とメモリリソースを持つ、インスタンスタイプの柔軟な組み合わせを使用する必要があります。例えば、4 つの vCPU および 8 GiB のメモリが必要な場合は、`c3.xlarge`、`c4.xlarge`、`c5.xlarge`、`c5d.xlarge`、`c5a.xlarge`、`c5n.xlarge`、または他の同等なインスタンスタイプのマネージド型ノードグループを 1 つ作成し、`m3.xlarge`、`m4.xlarge`、`m5.xlarge`、`m5d.xlarge`、`m5a.xlarge`、`m5n.xlarge`、または他の同等なインスタンスタイプで 2 つ目のマネージド型ノードグループを作成することをお勧めします。
  + カスタム起動テンプレートを使用しているスポットキャパシティータイプでノードグループをデプロイする場合、API を使用して複数のインスタンスタイプを渡します。起動テンプレートを使って 1 つのインスタンスタイプを渡さないでください。起動テンプレートを使用したノードグループのデプロイについての詳細は、「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」をご覧ください。

# クラスターのマネージドノードグループを作成する
<a name="create-managed-node-group"></a>

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

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

**重要**  
Amazon EKS ノードは、標準の Amazon EC2 インスタンスです。通常の Amazon EC2 料金に基づいて請求されます。詳細については、[Amazon EC2 の料金表](https://aws.amazon.com/ec2/pricing/)を参照してください。
AWS Outposts または AWS Wavelength が有効になっている AWS リージョンでは、マネージドノードを作成できません。ユーザーは代わりに、セルフマネージド型ノードを作成できます。詳細については[セルフマネージド Amazon Linux ノードを作成する](launch-workers.md)、[セルフマネージド Microsoft Windows ノードの作成](launch-windows-workers.md)、および[セルフマネージド Bottlerocket ノードの作成](launch-node-bottlerocket.md)を参照してください。また、Outpost に自己管理型 Amazon Linux ノードグループを作成することもできます。詳細については、「[AWS Outposts で Amazon Linux ノードを作成する](eks-outposts-self-managed-nodes.md)」を参照してください。
Amazon EKS 最適化 Linux または Bottlerocket に含まれる `bootstrap.sh` ファイル用に [AMI ID を指定](launch-templates.md#launch-template-custom-ami)しない場合、マネージドノードグループは `maxPods` の値に最大数を適用します。vCPU が 30 未満のインスタンスの場合、最大数は `110` です。30 を超える vCPU を持つインスタンスの場合、最大数は `250` に跳ね上がります。この適用は、`maxPodsExpression` を含む他の `maxPods` 設定を上書きします。`maxPods` の決定方法とカスタマイズ方法の詳細については、「[maxPods の決定方法](choosing-instance-type.md#max-pods-precedence)」を参照してください。
+ 既存の Amazon EKS クラスター。デプロイするには「[Amazon EKS クラスターを作成します。](create-cluster.md)」を参照してください。
+ ノードが使用する既存の IAM ロール。作成する場合は「[Amazon EKS ノードの IAM ロール](create-node-role.md)」を参照してください。この役割に VPC CNI のポリシーがどちらも含まれていない場合、VPC CNI ポッドには以下の別の役割が必要です。
+ (オプションですが推奨) 必要な IAM ポリシーがアタッチされた独自の IAM ロールで構成された Amazon VPC CNI plugin for Kubernetes アドオン。詳細については、「[IRSA を使用するように Amazon VPC CNI プラグインを設定する](cni-iam-role.md)」を参照してください。
+ 「[最適な Amazon EC2 ノードインスタンスタイプを選択する](choosing-instance-type.md)」に記載されている考慮事項に精通していること。選択したインスタンスタイプによってはクラスターと VPC に関する追加の前提条件がある場合もあります。
+ Windows マネージドノードグループを追加するには、まずクラスターの Windows サポートを有効にする必要があります。詳細については、「[EKS クラスターに WiWindows ノードをデプロイする](windows-support.md)」を参照してください。

マネージド型ノードグループを作成するには、以下のいずれかを使用します。
+  [`eksctl`](#eksctl_create_managed_nodegroup) 
+  [AWS マネジメントコンソール](#console_create_managed_nodegroup) 

## `eksctl`
<a name="eksctl_create_managed_nodegroup"></a>

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

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

```
eksctl version
```

`eksctl` のインストールまたはアップグレードの手順については、`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。

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

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

   ```
   eksctl create nodegroup --help
   ```

   次のコマンドで、*my-cluster* をクラスターの名前に置き換え、*my-mng* をノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。
**重要**  
マネージド型ノードグループを最初に作成する際にカスタム起動テンプレートを使用しない場合は、後でノードグループに使用しないでください。カスタム起動テンプレートを指定しなかった場合、システムにより起動テンプレートが自動生成されます。これを手動で変更することはお勧めしません。自動生成された起動テンプレートを手動で変更すると、エラーが発生する場合があります。

 **起動テンプレートなし** 

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

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

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

Amazon EC2 キーペアをまだ持っていない場合は、AWS マネジメントコンソール で作成できます。Linux の詳細については、「*Amazon EC2 ユーザーガイド*」の「[Amazon EC2 key pairs and Linux instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)」を参照してください。Windows の詳細については、「*Amazon EC2 ユーザーガイド*」の「[Amazon EC2 key pairs and Windows instances](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)」を参照してください。

次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
+ IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
+ クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

詳細については、「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

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
```

ご使用のインスタンスでは、オプションで大量の IP アドレスをポッドに割り当てることや、インスタンスではなく CIDR ブロックから Pod に IP アドレスを割り当てることができます。また、そのインスタンスはインターネットにアクセスできないクラスターにデプロイすることも可能です。詳細については、追加オプションの[プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす](cni-increase-ip-addresses.md)、[カスタムネットワーキングを使用して代替サブネットに Pod をデプロイする](cni-custom-network.md)および [インターネットアクセスが制限されたプライベートクラスターをデプロイする](private-clusters.md) を参照して、前のコマンドに追加します。

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

 **起動テンプレートの使用** 

起動テンプレートがすでに存在している必要があり、また、「[起動テンプレート設定の基本](launch-templates.md#launch-template-basics)」で指定されている要件を満たしている必要があります。次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
+ IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
+ クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

詳細については、「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

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

1. 次のコンテンツをデバイスにコピーします。サンプル値を置き換えたら、変更したコマンドを実行して `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](https://eksctl.io/usage/schema/)」を参照してください。オプションで、インスタンスはポッドに大量の IP アドレスを割り当てたり、インスタンスのブロックとは異なる CIDR ブロックから IP アドレスをポッドに割り当てたり、アウトバウンドのインターネットアクセスのないクラスターにデプロイしたりできます。詳細については、「[プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす](cni-increase-ip-addresses.md)」、「[カスタムネットワーキングを使用して代替サブネットに Pod をデプロイする](cni-custom-network.md)」、および「[インターネットアクセスが制限されたプライベートクラスターをデプロイする](private-clusters.md)」を参照して、設定ファイルに追加する追加オプションを確認してください。

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

   起動テンプレートで AMI ID を指定した場合、[カスタムネットワーク](cni-custom-network.md)を使用しているか、または[インスタンスに割り当てられている IP アドレスの数を増やす](cni-increase-ip-addresses.md)場合には、ノードグループの各ノードで実行できる Pod の最大数を指定します。詳細については、「」を参照してください。

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

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

## AWS マネジメントコンソール
<a name="console_create_managed_nodegroup"></a>

 **AWS マネジメントコンソール を使用してマネージド型ノードグループを作成する** 

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

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

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

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

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

1. **[ノードグループの設定]** ページで、必要に応じてパラメータを指定し、**[次へ]** を選択します。
   +  **[名前]** – マネージド型ノードグループの一意の名前を入力します。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。
   +  **[ノード IAM ロール]** – ノードグループで使用するノードインスタンスロールを選択します。詳細については、「[Amazon EKS ノードの IAM ロール](create-node-role.md)」を参照してください。
**重要**  
クラスターの作成に使用したロールは使用できません。
セルフマネージド型ノードグループによって現在使用されていないロールを使用することをお勧めします。それ以外の場合は、新しいセルフマネージド型ノードグループで使用します。詳細については、「[クラスターからマネージドノードグループを削除する](delete-managed-node-group.md)」を参照してください。
   +  **起動テンプレートを使用する** — (オプション) 既存の起動テンプレートを使用するかどうかを選択します。**[起動テンプレート名]** を選択します。次に、**[起動テンプレートのバージョン]** を選択します。バージョンを選択しない場合、Amazon EKS はテンプレートのデフォルトのバージョンを使用します。起動テンプレートを使用すると、ノードグループを詳細にカスタマイズできます。これにより、カスタム AMI のデプロイ、ポッドへの大量の IP アドレスの割り当て、インスタンスのブロックとは異なる CIDR ブロックからのポッドに対する IP アドレスの割り当て、さらにアウトバウンドのインターネットアクセスのないクラスターに対するノードのデプロイが可能になります。詳細については[プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす](cni-increase-ip-addresses.md)、[カスタムネットワーキングを使用して代替サブネットに Pod をデプロイする](cni-custom-network.md)、および[インターネットアクセスが制限されたプライベートクラスターをデプロイする](private-clusters.md)を参照してください。

     起動テンプレート は、「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」の要件を満たしている必要があります。独自の起動テンプレートを使用しない場合、Amazon EKS API はデフォルトの Amazon EC2 起動テンプレートをアカウントに作成し、デフォルトの起動テンプレートを使用してノードグループをデプロイします。

     [サービスアカウントの IAM ロール](iam-roles-for-service-accounts.md)を実装する場合は、AWS サービスへのアクセス許可を必要とするすべての Pod に必要なアクセス許可を直接割り当て、クラスター内の Pod が、現在の AWS リージョンを取得するなどの理由で IMDS にアクセスしないようにします。また、起動テンプレートでホストネットワークを使用しないポッドの、IMDS へのアクセスを無効にすることもできます。詳細については、「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。
   +  [**Kubernetes ラベル**]: (オプション) マネージド型ノードグループ内のノードに Kubernetes ラベルを適用するように選択できます。
   +  **Kubernetes テイント** - (オプション) 管理対象ノードグループ内のノードに Kubernetes テイントを適用することを選択できます。**[効果]** メニューでの利用可能なオプションは ` NoSchedule `、` NoExecute `、および ` PreferNoSchedule ` です。詳細については、「[レシピ: 特定のノードでポッドがスケジュールされないようにする](node-taints-managed-node-groups.md)」を参照してください。
   +  **[タグ]** – (オプション) Amazon EKS マネージド型ノードグループにタグを付けることを選択できます。これらのタグは、Auto Scaling グループやインスタンスなど、ノードグループ内の他のリソースには伝達されません。詳細については、「[タグを使用して Amazon EKS リソースを整理する](eks-using-tags.md)」を参照してください。

1. **[コンピューティング構成とスケーリングの設定]** ページで、必要に応じてパラメータを指定し、**[次へ]** を選択します。
   +  **[AMI タイプ]** – AMI タイプを選択します。Arm インスタンスをデプロイする場合は、デプロイする前に「[Amazon EKS optimized Arm Amazon Linux AMIs](eks-optimized-ami.md#arm-ami)」の考慮事項を確認してください。

     前のページで起動テンプレートを指定し、起動テンプレートで AMI を指定した場合は、値を選択できません。テンプレートの値が表示されます。テンプレートで指定された AMI は、「[AMI の指定](launch-templates.md#launch-template-custom-ami)」の要件を満たしている必要があります。
   +  **[キャパシティータイプ]** – キャパシティタイプを選択します。キャパシティータイプの選択の詳細については、「[マネージド型ノードグループのキャパシティータイプ](managed-node-groups.md#managed-node-group-capacity-types)」を参照してください。同じノードグループ内で、異なるキャパシティータイプを混在させることはできません。両方のキャパシティータイプを使用したい場合は、キャパシティータイプとインスタンスタイプをそれぞれに持つ、別々のノードグループを作成します。GPU アクセラレーテッドワーカーノードのプロビジョニングとスケーリングについては、「[マネージドノードグループの GPU を予約する](https://docs.aws.amazon.com/eks/latest/userguide/capacity-blocks-mng.html)」を参照してください。
   +  **[インスタンスタイプ]** – デフォルトで 1 つまたは複数のインスタンスタイプが指定されています。デフォルトのインスタンスタイプを削除するには、インスタンスタイプの右側にある `X` を選択します。マネージド型ノードグループで使用するインスタンスタイプを選択します。詳細については、「[最適な Amazon EC2 ノードインスタンスタイプを選択する](choosing-instance-type.md)」を参照してください。

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

     前のページで起動テンプレートを指定した場合は、値を起動テンプレートで指定する必要があるため、値を選択できません。
   +  **[必要なサイズ]** – マネージド型ノードグループが起動時に保持する必要があるノードの現在の数を指定します。
**注記**  
Amazon EKS は、ノードグループを自動的にスケールインまたはスケールアウトしません。ただし、これを行うように Kubernetes Cluster Autoscaler を設定することはできます。詳細については、「[AWS の Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)」を参照してください。
   +  **[最小サイズ]** – マネージド型ノードグループがスケールインできるノードの最小数を指定します。
   +  **[最大サイズ]** – マネージド型ノードグループがスケールアウトできるノードの最大数を指定します。
   +  **ノードグループの更新設定** – (オプション) 並行して更新するノードの数または割合を選択できます。これらのノードは、更新中は使用できません。**[使用できない最大値]** で、次のいずれかのオプションを選択し、その **[値]** を指定します:
     +  **[数値]** – 並行して更新できるノードグループ内のノード数を選択して指定します。
     +  **[パーセンテージ]** – 並行して更新できるノードグループ内のノードの割合を選択して指定します。ノードグループに多数のノードがある場合に便利です。
   +  **ノードの自動修復設定** – (オプション) **[ノードの自動修復を有効にする]** チェックボックスを有効にすると、Amazon EKS は検出された問題が発生したときにノードを自動的に置き換えます。詳細については、「[ノードのヘルス問題を検出し、自動ノード修復を有効にする](node-health.md)」を参照してください。

1. **[ネットワーキングを指定]** ページで、必要に応じてパラメータを指定し、**[次へ]** を選択します。
   +  **[サブネット]**: マネージド型ノードを起動するサブネットを選択します。
**重要**  
Amazon EBS ボリュームによってバックアップされ、Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) を使用する複数のアベイラビリティーゾーンにわたってステートフルアプリケーションを実行している場合、それぞれが単一のアベイラビリティーゾーンにスコープされる複数のノードグループを設定する必要があります。また、`--balance-similar-node-groups` 機能を有効にする必要があります。
**重要**  
パブリックサブネットを選択し、クラスターでパブリック API サーバーのエンドポイントのみが有効になっている場合は、サブネットの `MapPublicIPOnLaunch` に `true` をセットして、インスタンスがクラスターに正常に参加できるようにします。サブネットが 2020 年 3 月 26 日以降に `eksctl` または [Amazon EKS で発行された AWS CloudFormation テンプレート](creating-a-vpc.md)を使用して作成された場合は、この設定はすでに `true` に設定されています。サブネットが 2020 年 3 月 26 日より前に `eksctl` または AWS CloudFormation テンプレートを使用して作成されている場合は、設定を手動で変更する必要があります。詳細については「[サブネットの IPv4 アドレス指定属性の変更](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)」を参照してください。
起動テンプレートを使用しており、複数のネットワークインターフェイスを指定している場合には、たとえ `MapPublicIpOnLaunch` が `true` に設定されていても、Amazon EC2 はパブリック `IPv4` アドレスの自動的な割り当てを行いません。このシナリオでノードがクラスターに参加するには、クラスターのプライベート API サーバーエンドポイントを有効にするか、NAT ゲートウェイなどの別の方法によってアウトバウンドインターネットアクセスを提供する、プライベートサブネットでノードを起動する必要があります。詳細については、「*Amazon EC2 ユーザーガイド*」の「[Amazon EC2 インスタンスの IP アドレス指定](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html)」を参照してください。
   +  **ノードへの SSH アクセスの設定** (オプション)。SSH を有効にすることにより、インスタンスに接続し、問題がある場合に診断情報を収集できます。ノードグループを作成するときは、リモートアクセスを有効にすることを強くお勧めします。ノードグループの作成後にリモートアクセスを有効にすることはできません。

     起動テンプレートの使用を選択した場合、このオプションは表示されません。ノードへのリモートアクセスを有効にするには、起動テンプレートでキーペアを指定し、起動テンプレートで指定したセキュリティグループのノードに対して適切なポートが開いていることを確認します。詳細については、「[カスタムセキュリティグループを使用する](launch-templates.md#launch-template-security-groups)」を参照してください。
**注記**  
Windows の場合、このコマンドは SSH を有効にしません。代わりに Amazon EC2 キーペアをインスタンスに関連付け、インスタンスに RDP できるようにします。
   + **[SSH キーペア]** (オプション) の場合は、使用する Amazon EC2 SSH キーを選択します。Linux の詳細については、「*Amazon EC2 ユーザーガイド*」の「[Amazon EC2 key pairs and Linux instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)」を参照してください。Windows の詳細については、「*Amazon EC2 ユーザーガイド*」の「[Amazon EC2 key pairs and Windows instances](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)」を参照してください。起動テンプレートを使用することを選択した場合、選択することはできません。Bottlerocket AMI を使用するノードグループに Amazon EC2 SSH キーが提供されると、管理コンテナも有効になります。詳細については、GitHub の [Admin container](https://github.com/bottlerocket-os/bottlerocket#admin-container) を参照してください。
   + **[次からの SSH リモートアクセスを許可する]** の場合、特定のインスタンスへのアクセスを制限するには、それらのインスタンスに関連付けられているセキュリティグループを選択します。特定のセキュリティグループを選択しないと、インターネット上のどの場所 (`0.0.0.0/0`) からでも SSH アクセスが許可されます。

1. **[確認と作成]** ページで、マネージド型ノードグループの設定を確認し、**[作成]** を選択してください。

   ノードがクラスターに参加できない場合はトラブルシューティングの章にある「[ノードをクラスターに結合できません](troubleshooting.md#worker-node-fail)」を参照してください。

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

   ```
   kubectl get nodes --watch
   ```

1. (GPU ノードのみ) GPU インスタンスタイプと Amazon EKS 最適化高速 AMI を選択した場合は、クラスター上の DaemonSet として [Kubernetes 用の NVIDIA デバイスプラグイン](https://github.com/NVIDIA/k8s-device-plugin)を適用する必要があります。次のコマンドを実行する前に、*vX.X.X* を必要となる [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin/releases) バージョンに置き換えます。

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

## Kubernetes アドオンをインストールする
<a name="_install_kubernetes_add_ons"></a>

ノードが関連付けられた Amazon EKS クラスターが実行中になったところで、Kubernetes アドオンのインストールとクラスターへのアプリケーションのデプロイを開始できます。以下のトピックはクラスターの機能を拡張するのに役立ちます。
+ クラスターを作成した [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)は、`kubectl` または AWS マネジメントコンソール を使用して Kubernetes API サーバーを呼び出すことができる唯一のプリンシパルです。他の IAM プリンシパルがクラスターにアクセスできるようにする場合はそれらを追加する必要があります。詳細については、「[IAM ユーザーおよびロールに Kubernetes API へのアクセスを付与する](grant-k8s-access.md)」および「[必要なアクセス許可](view-kubernetes-resources.md#view-kubernetes-resources-permissions)」を参照してください。
+ 次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
  + IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
  + クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

  詳細については「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。
+ ノードグループ内のノード数を自動的に調整するように Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) を設定します。
+ [サンプルアプリケーション](sample-deployment.md)をクラスターにデプロイします。
+  クラスターを管理するための重要なツールを使用して、[クラスターリソースを整理およびモニタリング](eks-managing.md)します。

# クラスターのためにマネージドノードグループを更新する
<a name="update-managed-node-group"></a>

マネージド型ノードグループの更新を開始すると、Amazon EKS はノードを自動的に更新し、「[ノードの更新の各フェーズを理解する](managed-node-update-behavior.md)」でリストされた手順を完了します。Amazon EKS 最適化 AMI を使用している場合、Amazon EKS は最新のセキュリティパッチとオペレーティングシステムの更新を、最新の AMI リリースバージョンの一部として自動的にノードに適用します。

いくつかのシナリオでは、Amazon EKS マネージド型ノードグループのバージョンや設定を更新すると便利です。
+ Amazon EKS クラスターの Kubernetes バージョンを更新し、同じ Kubernetes バージョンを使用するようにノードを更新する場合。
+ マネージド型ノードグループでは、新しい AMI リリースバージョンを使用できます。AMI バージョンの詳細については、次のセクションを参照してください。
  +  [Amazon Linux AMI のバージョン情報を取得する](eks-linux-ami-versions.md) 
  +  [最適化された Bottlerocket AMI を使用してノードを作成する](eks-optimized-ami-bottlerocket.md) 
  +  [Windows AMI バージョンに関する情報を取得する](eks-ami-versions-windows.md) 
+ マネージド型ノードグループ内のインスタンスの最小数、最大数、または必要な数を調整する場合。
+ マネージド型ノードグループのインスタンスで Kubernetes ラベルを追加または削除する場合。
+ マネージド型ノードグループに AWS タグを追加または削除する場合。
+ カスタム AMI の更新などの設定の変更を伴う、新しいバージョンの起動テンプレートをデプロイする必要があります。
+ Amazon VPC CNI アドオンのバージョン `1.9.0` 以降をデプロイし、プレフィックス委任用のアドオンを有効にし、ノードグループ内の新しい AWS Nitro System インスタンスで大幅に増加した Pod の数をサポートしたい場合。詳細については、「[プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす](cni-increase-ip-addresses.md)」を参照してください。
+ Windows ノードの IP プレフィックスの委任を有効にし、ノードグループ内の新しい AWS Nitro System インスタンスで、大幅に増加したポッドをサポートした場合。詳細については、「[プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす](cni-increase-ip-addresses.md)」を参照してください。

マネージドノードグループの Kubernetes バージョンに対して、新しい AMI リリースバージョンがある場合は、ノードグループのバージョンを更新して、新しい AMI バージョンを使用することができます。同様に、クラスターがノードグループより新しい Kubernetes バージョンを実行している場合、クラスターの Kubernetes バージョンに一致する最新の AMI リリースバージョンを使用するようにノードグループを更新できます。

スケーリングオペレーションまたは更新によってマネージドノードグループ内のノードが終了すると、そのノードの Pod が最初にドレインされます。詳細については、「[ノードの更新の各フェーズを理解する](managed-node-update-behavior.md)」を参照してください。

## ノードグループバージョンの更新
<a name="mng-update"></a>

ノードグループのバージョンは、次のいずれかを使用して更新できます。
+  [`eksctl`](#eksctl_update_managed_nodegroup) 
+  [AWS マネジメントコンソール](#console_update_managed_nodegroup) 

更新するバージョンは、コントロールプレーンバージョンよりも新しいバージョンにすることはできません。

## `eksctl`
<a name="eksctl_update_managed_nodegroup"></a>

 **`eksctl` を使用してマネージドノードグループを更新する** 

次のコマンドを使用して、マネージドノードグループを、ノードに現在デプロイされているのと同じ Kubernetes バージョンの最新 AMI リリースに更新します。各*サンプル値*は独自の値に置き換えます。

```
eksctl upgrade nodegroup \
  --name=node-group-name \
  --cluster=my-cluster \
  --region=region-code
```

**注記**  
起動テンプレートでデプロイされたノードグループを、新しい起動テンプレートのバージョンにアップグレードする場合は、上記のコマンドに `--launch-template-version version-number ` を追加します。起動テンプレート は、「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」に記載されている要件を満たしている必要があります。起動テンプレートにカスタム AMI が含まれている場合、AMI は「[Specifying an AMI](launch-templates.md#launch-template-custom-ami)」(AMI の指定) の要件を満たしている必要があります。ノードグループを新しいバージョンの起動テンプレートにアップグレードすると、指定した起動テンプレートバージョンの新しい設定と一致するように、すべてのノードがリサイクルされます。

起動テンプレートなしでデプロイしたノードグループを、新しい起動テンプレートバージョンに直接アップグレードすることはできません。代わりに、起動テンプレートを使用して新しいノードグループをデプロイし、新しい起動テンプレートバージョンにノードグループを更新する必要があります。

コントロールプレーンの Kubernetes バージョンと同じバージョンにノードグループをアップグレードできます。例えば、Kubernetes `1.35` を実行しているクラスターがある場合、次のコマンドを使用して、現在 Kubernetes `1.34` を実行しているノードをバージョン `1.35` にアップグレードできます。

```
eksctl upgrade nodegroup \
  --name=node-group-name \
  --cluster=my-cluster \
  --region=region-code \
  --kubernetes-version=1.35
```

## AWS マネジメントコンソール
<a name="console_update_managed_nodegroup"></a>

 **AWS マネジメントコンソール を使用してマネージドノードグループを更新する** 

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 更新するノードグループを含むクラスターを選択します。

1. 少なくとも 1 つのノードグループに利用可能な更新がある場合、ページの上部に利用可能な更新について通知するボックスが表示されます。**[Compute]** (コンピューティング) タブを選択すると、利用可能な更新があるノードグループの **[Node Groups]** (ノードグループ) 表の、**[AMI release version]** (AMI リリースバージョン) 列に、**[Update now]** (今すぐ更新) が表示されます。ノードグループを更新するには、**[Update now]** (今すぐ更新) を選択します。

   カスタム AMI でデプロイされたノードグループの通知は表示されません。ノードがカスタム AMI でデプロイされている場合は、次の手順を実行して、新しく更新されたカスタム AMI をデプロイします。

   1. AMI の新しいバージョンを作成します。

   1. 新しい AMI ID を使用して、新しい起動テンプレートのバージョンを作成します。

   1. 起動テンプレートの新しいバージョンにノードを更新する

1. **[Update node group version]** (ノードグループバージョンの更新) ダイアログボックスで、次のオプションを有効または無効にします。
   +  **[Update node group version]** (ノードグループのバージョンの更新) - カスタム AMI をデプロイした場合、あるいは Amazon EKS に最適化された AMI が現在のクラスターで最新のバージョンである場合には、このオプションは利用できません。
   +  **[Change launch template version]** (起動テンプレートバージョンの変更) - ノードグループがカスタムの起動テンプレートを使用せずにデプロイされている場合、このオプションは利用できません。カスタム起動テンプレートを使用してデプロイされたノードグループの、起動テンプレートのバージョンのみ更新できます。ノードグループを更新する **[Launch template version]** (起動テンプレートバージョン) を選択します。ノードグループがカスタム AMI で設定されている場合は、選択するバージョンも AMI を指定する必要があります。新しいバージョンの起動テンプレートにアップグレードすると、指定した起動テンプレートバージョンの新しい設定と一致するように、すべてのノードがリサイクルされます。

1. **[Update strategy]** (更新戦略) で、次のいずれかのオプションを選択します。
   +  **[ローリング更新]**: このオプションは、クラスターの Pod の中断予算を尊重します。Pod 中断予算の問題により、Amazon EKS がこのノードグループで実行されている Pod を正常にドレインできない場合、更新が失敗します。
   +  **[強制更新]**: このオプションは Pod の中断予算を尊重しません。ノードの再起動を強制的に実行することにより、Pod の中断予算の問題に関係なく更新が行われます。

1. **[更新]** を選択します。

## ノードグループ設定の編集
<a name="mng-edit"></a>

マネージド型ノードグループの設定の一部を変更できます。

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 編集するノードグループを含むクラスターを選択します。

1. **[Compute]** (コンピューティング) タブを選択します。

1. 編集するノードグループを選択し、次に **[Edit]** (編集) を選択します。

1. (オプション) **[Edit Node Group]** (ノードグループの編集) ページで以下を実行します。

   1. **ノードグループのスケーリング設定**を編集します。
      +  **[Desired size]** (必要なサイズ) - マネージド型ノードグループが保持する必要があるノードの現在の数を指定します。
      +  **[最小サイズ]** – マネージド型ノードグループがスケールインできるノードの最小数を指定します。
      +  [**最大サイズ**]: マネージド型ノードグループがスケールアウトできるノードの最大数を指定します。ノードグループでサポートされるノードの最大数については、「[Amazon EKS と Fargate Service Quotas を表示して管理する](service-quotas.md)」を参照してください。

   1. (オプション) ノードグループ内のノードに **[Kubernetes ラベル]** を追加または削除します。ここに示すラベルは、Amazon EKS で適用したラベルのみです。ここには表示されていない他のラベルがノードに存在する可能性があります。

   1. (オプション) ノードグループ内のノードに **[Kubernetes テイント]** を追加または削除します。追加されたテイントは、` NoSchedule `、` NoExecute `、または ` PreferNoSchedule ` の影響があります。詳細については、「[レシピ: 特定のノードでポッドがスケジュールされないようにする](node-taints-managed-node-groups.md)」を参照してください。

   1. (オプション) ノードグループリソースに**[Tags]** (タグ) を追加または削除します。これらのタグは、Amazon EKS ノードグループにのみ適用されます。これらは、Amazon EC2 インスタンスやサブネットなど、ノードグループの他のリソースには伝達されません。

   1. (オプション) **ノードグループの更新設定**を編集します。**[Number]** (数値) または **[Percentage]** (パーセンテージ) のいずれかを選択します。
      +  **[数値]**: 並行して更新できるノードグループ内のノード数を選択して指定します。これらのノードは、更新中は使用できません。
      +  **[パーセンテージ]**: 並行して更新できるノードグループ内のノードの割合を選択して指定します。これらのノードは、更新中は使用できません。ノードグループに多数のノードがある場合に便利です。

   1. 編集が終了したら、**[変更の保存]** を選択します。

**重要**  
ノードグループ設定を更新する場合、[https://docs.aws.amazon.com/eks/latest/APIReference/API_NodegroupScalingConfig.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_NodegroupScalingConfig.html) を変更しても Pod 中断予算 (PDB) は考慮されません。[ノードグループの更新](managed-node-update-behavior.md)プロセス (アップグレードフェーズ中にノードをドレインし、PDB を考慮する) とは異なり、スケーリング設定を更新すると、Auto Scaling グループ (ASG) スケールダウンコールによってノードがすぐに終了します。これは、スケールダウン先のターゲットサイズに関係なく、PDB を考慮せずに発生します。つまり、Amazon EKS マネージドノードグループの `desiredSize` を減らすと、ノードが終了するとすぐに、PDB を尊重せずに Pod が削除されます。

# ノードの更新の各フェーズを理解する
<a name="managed-node-update-behavior"></a>

Amazon EKS マネージド型ワーカーノードのアップグレード戦略には、次のセクションで説明する 4 つの異なるフェーズがあります。

## セットアップフェーズ
<a name="managed-node-update-set-up"></a>

セットアップフェーズには、次の手順があります。

1. ノードグループに関連付けられた Auto Scaling グループ用に新しい Amazon EC2 起動テンプレートバージョンを作成します。新しい起動テンプレートバージョンでは、ターゲットの AMI またはカスタム起動テンプレートバージョンを更新に使用します。

1. 最新の起動テンプレートバージョンを使用するように、Auto Scaling グループを更新します。

1. ノードグループの `updateConfig` プロパティを使用して、並列でアップグレードするノードの最大数を決定します。使用不可の最大値には、クォータとして 100 ノードがあります。デフォルト値は 1 ノードです。詳細については、Amazon EKS API リファレンス内の [updateConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateNodegroupConfig.html#API_UpdateNodegroupConfig_RequestSyntax) プロパティを参照してください。

## スケールアップフェーズ
<a name="managed-node-update-scale-up"></a>

マネージド型ノードグループ内のノードをアップグレードするとき、アップグレードされたノードは、アップグレードされているノードと同じアベイラビリティーゾーンで起動されます。この配置を保証するために、Amazon EC2 のアベイラビリティーゾーンの再調整を使用します。詳細については、[Amazon EC2 Auto Scaling ユーザーガイド](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage)の*アベイラビリティーゾーンの再調整*を参照してください。この要件を満たすために、マネージド型ノードグループのアベイラビリティーゾーンごとに最大 2 つのインスタンスを起動できます。

スケールアップフェーズには、次の手順があります。

1. Auto Scaling グループの最大サイズと希望のサイズを、次のうちいずれか大きい方だけ増加させます。
   + Auto Scaling グループがデプロイされているアベイラビリティーゾーン数の最大 2 倍。
   + アップグレードができない最大値。

     たとえば、ノードグループのアベイラビリティーゾーンが 5 つで、`maxUnavailable` が 1 である場合、アップグレードプロセスで最大 10 個のノードを起動できます。しかし、`maxUnavailable` が 20 (または 10 より大きいいずれかの値) である場合、プロセスにより起動される新しいノードは 20 個です。

1. Auto Scaling グループのスケーリング後、最新の設定を使用するノードがノードグループに存在するかどうかをチェックします。この手順は、次の基準を満たす場合にのみ成功します。
   + ノードが存在するすべてのアベイラビリティーゾーンで、少なくとも 1 つの新しいノードが起動されます。
   + 新しいノードはすべて、`Ready` 状態である必要があります。
   + 新しいノードには Amazon EKS 適用ラベルが必要です。

     これは、通常のノードグループのワーカーノード上の Amazon EKS 適用ラベルです。
     +  `eks.amazonaws.com/nodegroup-image=$amiName` 
     +  `eks.amazonaws.com/nodegroup=$nodeGroupName` 

     これは、カスタム起動テンプレートまたは AMI ノードグループのワーカーノード上の Amazon EKS 適用ラベルです。
     +  `eks.amazonaws.com/nodegroup-image=$amiName` 
     +  `eks.amazonaws.com/nodegroup=$nodeGroupName` 
     +  `eks.amazonaws.com/sourceLaunchTemplateId=$launchTemplateId` 
     +  `eks.amazonaws.com/sourceLaunchTemplateVersion=$launchTemplateVersion` 

1. 新しい Pod がスケジュールされないように、ノードをスケジュール不可としてマークします。古いノードを終了する前にロードバランサーからノードを削除するため、ノードに `node.kubernetes.io/exclude-from-external-load-balancers=true` のラベルを付けます。

このフェーズで `NodeCreationFailure` エラーが発生する既知の原因を次に示します。

 **アベイラビリティーゾーンの容量が不十分です**   
アベイラビリティーゾーンに、リクエストされたインスタンスタイプの容量がない可能性があります。マネージド型ノードグループを作成するときは、複数のインスタンスタイプを設定することをお勧めします。

 **アカウント内の EC2 インスタンス制限**   
Service Quotas を使用してアカウントが同時に実行できる Amazon EC2 インスタンスの数を増やす必要がある場合があります。詳細については、*Linux インスタンス向け Amazon Elastic Compute Cloud ユーザーガイド*の [EC2 の Service Quotas](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html) を参照してください。

 **カスタムユーザーデータ**   
カスタムユーザーデータは、ブートストラッププロセスを中断することがあります。このシナリオでは、ノードで `kubelet` が起動しないか、ノードで想定される Amazon EKS ラベルが取得されない可能性があります。詳細については、「[AMI を指定する](launch-templates.md#launch-template-custom-ami)」を参照してください。

 **ノードを異常な状態または準備ができていない状態にする変更**   
ノードのディスク負荷、メモリ負荷、および同様の条件により、ノードが `Ready` 状態にならない可能性があります。

 **各ノードのブートストラップにかかる時間は通常 15 分以内**   
ブートストラップしてクラスターに加わるまでに 15 分以上かかるノードがあると、アップグレードがタイムアウトします。この時間は、新しいノードが必要になってからクラスターに加わるまで、新しいノードのブートストラップに要した合計時間です。マネージドノードグループをアップグレードする場合は、Auto Scaling グループのサイズが大きくなると、すぐに時間の測定が始まります。

## アップグレードフェーズ
<a name="managed-node-update-upgrade"></a>

アップグレードフェーズの動作には 2 通りの方法があり、*更新戦略*によって異なります。**デフォルト**と**最小**という 2 つの更新戦略があります。

通常は、デフォルト戦略をお勧めします。古いノードを終了する前に新しいノードを作成するという戦略で、アップグレードフェーズ中も使用可能な容量が維持されます。最小は、リソースやコスト (例えば、GPU などのハードウェアアクセラレーター) が限られている場合に便利な戦略です。新しいノードを作成する前に古いノードを終了するため、合計容量が設定しておいた数量を超えることはありません。

*デフォルト*更新戦略のステップは次のとおりです。

1. Auto Scaling グループ内のノード数を (必要な数だけ) 増やして、ノードグループに追加でノードを作成します。

1. ノードグループのために設定されている使用不可の最大数を上限として、アップグレードが必要なノードをランダムに選択します。

1. ノードから Pod をドレインします。Pod が 15 分以内にノードを離れず、強制フラグがない場合は、`PodEvictionFailure` というエラーが表示されて、アップグレードフェーズは失敗します。この状況になった場合、`update-nodegroup-version` リクエストで強制フラグを適用して Pod を削除できます。

1. すべての Pod が削除されたらノードを遮断し、60 秒間待機します。これは、サービスコントローラーがこのノードに新しくリクエストを送信しないようにするためと、アクティブなノードのリストからこのノードを削除するために行われます。

1. 遮断されたノードの Auto Scaling グループに終了リクエストを送信します。

1. 以前のバージョンの起動テンプレートでデプロイされたノードグループ内にノードが存在しなくなるまで、以前のアップグレード手順を繰り返します。

*最小*更新戦略のステップは次のとおりです。

1. ノードグループのすべてのノードを最初に遮断して、サービスコントローラーがこれらのノードに新しいリクエストを送信しないようにします。

1. ノードグループのために設定されている使用不可の最大数を上限として、アップグレードが必要なノードをランダムに選択します。

1. 選択したノードからポッドをドレインします。Pod が 15 分以内にノードを離れず、強制フラグがない場合は、`PodEvictionFailure` というエラーが表示されて、アップグレードフェーズは失敗します。この状況になった場合、`update-nodegroup-version` リクエストで強制フラグを適用して Pod を削除できます。

1. すべてのポッドを削除し 60 秒間待機すると、終了リクエストが、選択したノードの Auto Scaling グループに送信されます。Auto Scaling グループは、不足分の容量を補うために (選択したノードと同数の) 新しいノードを作成します。

1. 以前のバージョンの起動テンプレートでデプロイされたノードグループ内にノードが存在しなくなるまで、以前のアップグレード手順を繰り返します。

### アップグレードフェーズ中の `PodEvictionFailure` エラー
<a name="_podevictionfailure_errors_during_the_upgrade_phase"></a>

このフェーズで `PodEvictionFailure` エラーが発生する既知の原因を次に示します。

 **アグレッシブ PDB**   
Pod にアグレッシブ PDB が定義されているか、同じ Pod を指す複数の PDB が存在します。

 **すべてのテイントを許容するデプロイ**   
すべての Pod が削除されたら、前のステップでノードが[テイント](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)されているため、ノードは空になるはずです。ただし、デプロイがすべてのテイントを許容する場合、ノードが空でない可能性が高くなり、Pod のエビクションが失敗します。

## スケールダウンフェーズ
<a name="managed-node-update-scale-down"></a>

スケールダウンフェーズでは、Auto Scaling グループの最大サイズと希望するサイズが 1 ずつ減り、更新が開始される前の値に戻ります。

ワークフローのスケールダウンフェーズ中に Cluster Autoscaler がノードグループをスケールアップしているとアップグレードワークフローが判断した場合、ノードグループを元のサイズに戻すことなく、すぐに終了します。

# 起動テンプレートを使用してマネージドノードをカスタマイズする
<a name="launch-templates"></a>

このページの手順に基づいて自分の起動テンプレートを使用することで、マネージド型ノードをデプロイでき、最高レベルのカスタマイズを実現できます。起動テンプレートを使用すると、ノードのデプロイ中にブートストラップ引数 (追加の [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引数など) を指定したり、ノードに割り当てられた IP アドレスとは異なる CIDR ブロックからポッドに IP アドレスを割り当てたり、独自のカスタム AMI をノードにデプロイしたり、独自のカスタム CNI をノードにデプロイしたりできます。

最初にマネージドノードグループを作成するときに独自の起動テンプレートを指定する場合にも、後で高い柔軟性を得ることができます。自分の起動テンプレートを使用してマネージド型ノードグループをデプロイする限り、同じ起動テンプレートの異なるバージョンとして繰り返し更新できます。ノードグループを別のバージョンの起動テンプレートに更新すると、指定した起動テンプレートバージョンの新しい設定と一致するように、グループ内のすべてのノードがリサイクルされます。

マネージド型ノードグループは常に アマゾン EC2 自動スケーリング グループで使用する起動テンプレートでデプロイされます。起動テンプレートを指定しない場合、アマゾン EKS API はアカウントのデフォルト値を使用して起動テンプレートを自動的に作成します。ただし、自動生成された起動テンプレートを変更することは推奨しません。さらに、カスタム起動テンプレートを使用していない既存のノードグループは直接更新できません。代わりに、カスタム起動テンプレートを使用して、新しいノードグループを作成する必要があります。

## 起動テンプレート設定の基本
<a name="launch-template-basics"></a>

AWS マネジメントコンソール、AWS CLI、または AWS SDK を使用して、アマゾン EC2 自動スケーリング 起動テンプレートを作成できます。詳細については*「アマゾン EC2 自動スケーリング ユーザーガイド」*の「[自動スケーリング グループの起動テンプレートを作成する](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html)」を参照してください。起動テンプレートの一部の設定はマネージド型ノードで使われている設定と似ています。起動テンプレートを使用してノードグループをデプロイまたは更新する場合、一部の設定はノードグループ設定または起動テンプレートのいずれかで指定する必要があります。両方の場所で設定を指定しないでください。存在してはいけない場所に設定が存在する場合、ノードグループの作成や更新などの操作は失敗します。

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


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

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


| アマゾン EKS ノードグループ設定 — 禁止 | 起動テンプレート | 
| --- | --- | 
|  (起動テンプレートでカスタム AMI を指定した場合のみ) **[コンピューティングとスケーリングの設定を実行]** ページの **[ノードグループのコンピューティング設定]** の下の **[AMI タイプ]** — **[起動テンプレートで指定]** と、指定した AMI ID がコンソールに表示されます。 起動テンプレートで **[アプリ and OS Images (アマゾン Machine Image)]** (アプリケーションと OS のイメージ (アマゾン マシンイメージ)) が指定されていない場合はノードグループ設定で AMI を選択できます。  |   **[Launch template contents]** (起動テンプレートのコンテンツ) での **[Application and OS Images (Amazon Machine Image)]** (アプリケーションと OS のイメージ (Amazon マシンイメージ)) - 次のいずれかの要件がある場合はID を指定する必要があります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/launch-templates.html)  | 
|   **[Set compute and scaling configuration]** (コンピューティングとスケーリングの設定を実行) ページの **[Node Group compute configuration]** (ノードグループのコンピューティング設定) の下の **[Disk size]** (ディスクサイズ) — **[Specified in launch template]** (起動テンプレートで指定) がコンソールに表示されます。  |   [**ストレージ (ボリューム)**] ([**新しいボリュームの追加**]) の下の [**サイズ**]。これを起動テンプレートで指定する必要があります。  | 
|   **[Specify Networking]** (ネットワーキングを指定) ページの **[Node group configuration]** (ノードグループ設定) の下の **[SSH key pair]** (SSH キーペア) — コンソールに起動テンプレートで指定したキーまたは **[Not specified in launch template]** (起動テンプレートで指定されていません) が表示されます。  |   [**キーペア (ログイン)**] の下の [**キーペア名**]。  | 
|  起動テンプレートを使用する場合はリモートアクセスを許可するソースセキュリティグループを指定できません。  |   インスタンスの場合、[**ネットワーク設定**] の下の [**セキュリティグループ**]、または [**ネットワークインターフェイス**] ([**ネットワークインターフェイスを追加**])の下の [**セキュリティグループ**]。両方設定することはできません。詳細については「[カスタムセキュリティグループを使用する](#launch-template-security-groups)」を参照してください。  | 

**注記**  
起動テンプレートを使用してノードグループをデプロイする場合は起動テンプレート内の **[起動テンプレートのコンテンツ]** で 0 または 1 の **[インスタンスタイプ]** を指定します。またはコンソールの **[コンピューティングとスケーリングの構成を設定する]** ページにある **[インスタンスタイプ]** で 0 から 20 までのインスタンスタイプを指定できます。またはアマゾン EKS API を使用する他のツールを使用して行うこともできます。起動テンプレートでインスタンスタイプを指定し、その起動テンプレートを使用してノードグループをデプロイする場合、コンソールや、アマゾン EKS API を使用する他のツールを使用してインスタンスタイプを指定することはできません。起動テンプレートやコンソール、または アマゾン EKS API を使用する他のツールを使用してインスタンスタイプを指定しない場合は`t3.medium` インスタンスタイプが使用されます。ノードグループがスポットキャパシティータイプを使用している場合はコンソールを使用して複数のインスタンスタイプを指定することをお勧めします。詳細については「[マネージド型ノードグループのキャパシティータイプ](managed-node-groups.md#managed-node-group-capacity-types)」を参照してください。
ノードグループにデプロイするコンテナが、インスタンスメタデータサービスバージョン 2 を使用している場合は起動テンプレートの **[メタデータレスポンスのホップ制限]** を `2` に設定してください。詳細については*「アマゾン EC2 ユーザーガイド」*の「[Instance metadata and user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)」(インスタンスメタデータとユーザーデータ) を参照してください。
起動テンプレートでは、インスタンスタイプを柔軟に選択できるようにする `InstanceRequirements` 機能はサポートされていません。

## アマゾン EC2 インスタンスへのタグ付け
<a name="launch-template-tagging"></a>

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

## カスタムセキュリティグループを使用する
<a name="launch-template-security-groups"></a>

起動テンプレートでカスタムの アマゾン EC2 [セキュリティグループ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html)を指定し、ノードグループ内のインスタンスに適用できます。これはインスタンスレベルのセキュリティグループのパラメータ内か、ネットワークインターフェイス設定のパラメータの一部として指定できます。しかし、インスタンスレベルとネットワークインタフェイス、両方のセキュリティグループを指定して、起動テンプレートを作成することはできません。マネージドノード型グループでカスタムセキュリティグループを使用する際に適用される、次の条件を考慮してください。
+ AWS マネジメントコンソール を使用する場合、アマゾン EKS では単一のネットワークインターフェイス仕様の起動テンプレートのみ使用できます。
+ デフォルトではAmazon EKS は[クラスターセキュリティグループ](sec-group-reqs.md)をノードグループ内のインスタンスに追加して、ノードとコントロールプレーンとの間の通信を容易にします。前述のいずれかのオプションを使用して、起動テンプレートでカスタムセキュリティグループを指定した場合、アマゾン EKS はクラスターセキュリティグループを追加しません。したがって、セキュリティグループのインバウンドルールとアウトバウンドルールで、クラスターのエンドポイントとの通信が有効になっていることを確認する必要があります。セキュリティグループのルールが正しくない場合、ワーカーノードはクラスターに参加できません。セキュリティグループルールの詳細については[クラスターの Amazon EKS セキュリティグループ要件を表示する](sec-group-reqs.md)を参照してください。
+ ノードグループ内のインスタンスへの SSH アクセスが必要な場合はそのアクセスを許可するセキュリティグループを含めてください。

## アマゾン EC2 ユーザーデータ
<a name="launch-template-user-data"></a>

起動テンプレートにはカスタムユーザーデータのセクションが含まれています。このセクションでは、個々のカスタム AMI を手動で作成しなくても、ノードグループの構成設定を指定できます。Bottlerocket で使用できる設定の詳細については、GitHub で [Using user data](https://github.com/bottlerocket-os/bottlerocket#using-user-data) を参照してください。

`cloud-init` を使用すると、インスタンス起動時に起動テンプレート内の Amazon EC2 ユーザーデータを提供できます。詳細については「[cloud-init ドキュメント](https://cloudinit.readthedocs.io/en/latest/index.html)」を参照してください。ユーザーデータを使用すると、一般的な設定操作を実行できます。これには次の操作が含まれます。
+  [ユーザーまたはグループを含む](https://cloudinit.readthedocs.io/en/latest/topics/examples.html#including-users-and-groups) 
+  [パッケージのインストール](https://cloudinit.readthedocs.io/en/latest/topics/examples.html#install-arbitrary-packages) 

マネージド型ノードグループで使用される起動テンプレートの Amazon EC2 ユーザーデータは、Amazon Linux AMI の場合は、[MIME マルチパートアーカイブ](https://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive)、Bottlerocket AMI の場合は TOML の形式であることが必要です。これはユーザーデータが、ノードがクラスターに参加するために必要な Amazon EKS ユーザーデータにマージされるためです。`kubelet` を起動または変更するコマンドをユーザーデータに指定しないでください。これは アマゾン EKS によってマージされたユーザーデータの一部として実行されます。ノードへのラベル設定などの一部の `kubelet` パラメータはマネージド型ノードグループ API 経由で直接設定できます。

**注記**  
手動での起動や、カスタムの設定パラメータの受け渡しなど、高度な `kubelet` のカスタマイズについては[AMI を指定する](#launch-template-custom-ami)を参照してください。起動テンプレートでカスタム AMI ID が指定されている場合、アマゾン EKS はユーザーデータをマージしません。

次の詳細はユーザーデータセクションについて説明しています。

 **アマゾン リナックス 2 ユーザーデータ**   
複数のユーザーデータブロックと単一の MIME マルチパートファイルを組み合わせることができます。例えば、カスタムパッケージをインストールするユーザーデータのシェルスクリプトを、Docker デーモンを設定するクラウドブートフックに組み合わせることができます。MIME マルチパートファイルには次のコンポーネントが含まれます。  
+ コンテンツタイプとパートバウンダリの宣言: `Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="` 
+ MIME バージョンの宣言: `MIME-Version: 1.0` 
+ 次のコンポーネントを含む 1 つ以上のユーザーデータブロック:
  + ユーザーデータブロックの始まりを示す開始境界:`--==MYBOUNDARY==` 
  + ブロックのコンテンツの種類の宣言: `Content-Type: text/cloud-config; charset="us-ascii"`。コンテンツタイプの詳細については[cloud-init](https://cloudinit.readthedocs.io/en/latest/topics/format.html) のドキュメントを参照してください。
  + ユーザーデータのコンテンツ (例えば、シェルコマンドや `cloud-init` ディレクティブのリスト)。
  + MIME マルチパートファイルの終わりを示す、終了境界: `--==MYBOUNDARY==--` 

  自分で 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==--
```

 **アマゾン リナックス 2023 ユーザーデータ**   
アマゾン リナックス 2023 (AL2023) ではYAML 設定スキーマを使用する新しいノード初期化プロセス `nodeadm` が導入されています。セルフマネージド型ノードグループまたは起動テンプレートを持つ AMI を使用している場合は新しいノードグループの作成時に追加のクラスターメタデータを明示的に指定する必要があります。最低限必要なパラメータの[例](https://awslabs.github.io/amazon-eks-ami/nodeadm/)を以下に示します。ここで、`apiServerEndpoint`、`certificateAuthority`、サービスの `cidr` が必要になります。  

```
---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
```
通常、この設定はユーザーデータにそのまま設定するか、MIME マルチパートドキュメントに埋め込まれます。  

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig spec: [...]

--BOUNDARY--
```
AL2 ではこれらのパラメータからのメタデータは アマゾン EKS `DescribeCluster` API コールから検出されていました。AL2023 ではノードの大規模なスケールアップ中に API コールによってスロットリングが発生するリスクがあるため、この動作が変更されました。この変更は起動テンプレートのないマネージド型ノードグループを使用している場合や、Karpenter を使用している場合には影響しません。`certificateAuthority` とサービス `cidr` の詳細については、「*Amazon EKS API リファレンス*」の「[https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html)」を参照してください。  
次に、AL2023 ユーザーデータの詳しい例を示します。ノードをカスタマイズするシェルスクリプト (パッケージのインストールやコンテナイメージの事前キャッシュなど) を必要な `nodeadm` 設定と結合しています。この例では、よく使用されるカスタマイズを示しています。\$1 追加でシステムパッケージをインストールする \$1 コンテナイメージを事前キャッシュしてポッドの起動時間を改善する \$1 HTTP プロキシ設定を設定する \$1 ノードのラベル付けに関する `kubelet` フラグを設定する  

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset

# Install additional packages
yum install -y htop jq iptables-services

# Pre-cache commonly used container images
nohup docker pull public.ecr.aws/eks-distro/kubernetes/pause:3.2 &

# Configure HTTP proxy if needed
cat > /etc/profile.d/http-proxy.sh << 'EOF'
export HTTP_PROXY="http://proxy.example.com:3128"
export HTTPS_PROXY="http://proxy.example.com:3128"
export NO_PROXY="localhost,127.0.0.1,169.254.169.254,.internal"
EOF

--BOUNDARY
Content-Type: application/node.eks.aws

apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
  kubelet:
    config:
      clusterDNS:
      - 10.100.0.10
    flags:
    - --node-labels=app=my-app,environment=production

--BOUNDARY--
```

 **Bottlerocket ユーザーデータ**   
Bottlerocket はユーザーデータを TOML 形式で構造化しています。Amazon EKS が提供するユーザーデータとマージするユーザーデータを提供できます。たとえば、追加の `kubelet` 設定を指定できます。  

```
[settings.kubernetes.system-reserved]
cpu = "10m"
memory = "100Mi"
ephemeral-storage= "1Gi"
```
サポートされる設定について詳しくは[Bottlerocket のドキュメント](https://github.com/bottlerocket-os/bottlerocket)を参照してください。ユーザーデータにノードラベルと[テイント](node-taints-managed-node-groups.md)を設定できます。ただし、代わりにノードグループ内にこれらを設定することをお勧めします。この場合、アマゾン EKS によりこれらの設定が適用されます。  
ユーザーデータをマージしても、書式設定は保持されませんが、コンテンツは同じままです。ユーザーデータに指定した設定はアマゾン EKS によって構成された設定よりも優先されます。したがって、`settings.kubernetes.max-pods` または `settings.kubernetes.cluster-dns-ip` を設定した場合、ユーザーデータのこれらの値がノードに適用されます。  
アマゾン EKS で、有効な TOML がすべてサポートされるわけではありません。以下はサポートされていない既知の形式の一覧です。  
+ 引用符で囲まれたキー内の引用符: `'quoted "value"' = "value"` 
+ 値内のエスケープされた引用符: `str = "I’m a string. \"You can quote me\""` 
+ 浮動小数点と整数の混在: `numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]` 
+ 配列内の混合型: `contributors = ["[foo@example.com](mailto:foo@example.com)", { name = "Baz", email = "[baz@example.com](mailto:baz@example.com)" }]` 
+ 引用符付きキーを含む括弧で囲まれたヘッダー: `[foo."bar.baz"]` 

 **Windows ユーザーデータ**   
Windows ユーザーデータでは、PowerShell コマンドを使用します。マネージド型ノードグループを作成すると、カスタムユーザーデータが Amazon EKS マネージドユーザーデータと結合されます。まず PowerShell コマンドが表示され、その後にマネージドユーザーデータコマンドが続きます。そのいずれも 1 つの `<powershell></powershell>` タグ内にあります。  
Windows ノードグループを作成すると、Amazon EKS は Linux ベースのノードがクラスターに参加できるように `aws-auth` `ConfigMap` を更新します。このサービスは、Windows AMI に対するアクセス許可を自動的には設定しません。Windows ノードを使用している場合は、アクセスエントリ API を利用するか、`aws-auth` `ConfigMap` を直接更新することで、アクセスを管理する必要があります。詳細については、「[EKS クラスターに WiWindows ノードをデプロイする](windows-support.md)」を参照してください。
起動テンプレートに AMI ID が指定されていない場合はユーザーデータで Windows Amazon EKS ブートストラップスクリプトを使用して Amazon EKS を設定しないでください。
ユーザーデータの例は次のとおりです。  

```
<powershell>
Write-Host "Running custom user data script"
</powershell>
```

## AMI を指定する
<a name="launch-template-custom-ami"></a>

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

### Amazon EKS に最適化された Linux/Bottlerocket AMI に含まれる `bootstrap.sh` ファイルに引数を渡すためのユーザーデータを提供する
<a name="mng-specify-eks-ami"></a>

ブートストラップとはインスタンスの起動時に実行できるコマンドの追加を表す用語です。例えば、ブートストラップでは追加の [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引数を使用できます。起動テンプレートを指定せずに、`eksctl` を使用して引数を `bootstrap.sh` スクリプトに渡すことができます。または起動テンプレートのユーザーデータセクションに情報を指定することでこれを行うことができます。

 **起動テンプレートを指定しない eksctl**   
*my-nodegroup.yaml* という名前のファイルを以下の内容で作成します。各*サンプル値*は独自の値に置き換えます。`--apiserver-endpoint`、`--b64-cluster-ca`、および `--dns-cluster-ip` 引数はオプションです。しかし、これらを定義すると、`bootstrap.sh` スクリプトによる `describeCluster` 呼び出しを避けることができます。これはプライベートクラスターのセットアップや、ノードを頻繁にスケールインおよびスケールアウトするクラスターで役立ちます。`bootstrap.sh` スクリプトの詳細については、GitHub で「[bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)」ファイルを参照してください。  
+ 必須となる引数はクラスター名 (*マイクラスター*) のみです。
+ `ami-1234567890abcdef0 ` に最適化された AMI ID を取得するには、次のセクションを参照してください。
  +  [推奨 Amazon Linux AMI ID を取得する](retrieve-ami-id.md) 
  +  [推奨 Bottlerocket AMI ID を取得する](retrieve-ami-id-bottlerocket.md) 
  +  [推奨 Microsoft Windows AMI ID を取得する](retrieve-windows-ami-id.md) 
+ クラスターの *認証機関* を取得するには次のコマンドを実行してください。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ クラスターの *api-server-endpoint* を取得するには次のコマンドを実行してください。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ 最終的に、`--dns-cluster-ip` の値はサービス CIDR を示す `.10` となります。クラスターの *service-cidr* を取得するには次のコマンドを実行してください。例えば、戻り値が `ipv4 10.100.0.0/16` であれば、自分の値は *10.100.0.10* です。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ この例ではカスタムの `max-pods` 値を設定するために `kubelet` 引数を指定します。その際、Amazon EKS 最適化 AMI に含まれている `bootstrap.sh` スクリプトを使用します。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。*my-max-pods-value* を選択する方法については「」を参照してください。マネージド型ノードグループを使用する場合の `maxPods` の決定方法の詳細については、「[maxPods の決定方法](choosing-instance-type.md#max-pods-precedence)」を参照してください。

  ```
  ---
  apiVersion: eksctl.io/v1alpha5
  kind: ClusterConfig
  
  metadata:
    name: my-cluster
    region: region-code
  
  managedNodeGroups:
    - name: my-nodegroup
      ami: ami-1234567890abcdef0
      instanceType: m5.large
      privateNetworking: true
      disableIMDSv1: true
      labels: { x86-al2-specified-mng }
      overrideBootstrapCommand: |
        #!/bin/bash
        /etc/eks/bootstrap.sh my-cluster \
          --b64-cluster-ca certificate-authority \
          --apiserver-endpoint api-server-endpoint \
          --dns-cluster-ip service-cidr.10 \
          --kubelet-extra-args '--max-pods=my-max-pods-value' \
          --use-max-pods false
  ```

  利用可能な `eksctl` `config` ファイルオプションについては「`eksctl` ドキュメント」の「[Config file schema](https://eksctl.io/usage/schema/)」(Config ファイルスキーマ) を参照してください。`eksctl` ユーティリティは引き続き起動テンプレートを作成し、`config` ファイルに提供したデータを使用してユーザーデータを設定します。

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

  ```
  eksctl create nodegroup --config-file=my-nodegroup.yaml
  ```

 **起動テンプレートのユーザーデータ**   
起動テンプレートのユーザーデータセクションで次の情報を指定します。各*サンプル値*は独自の値に置き換えます。`--apiserver-endpoint`、`--b64-cluster-ca`、および `--dns-cluster-ip` 引数はオプションです。しかし、これらを定義すると、`bootstrap.sh` スクリプトによる `describeCluster` 呼び出しを避けることができます。これはプライベートクラスターのセットアップや、ノードを頻繁にスケールインおよびスケールアウトするクラスターで役立ちます。`bootstrap.sh` スクリプトの詳細については、GitHub で「[bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)」ファイルを参照してください。  
+ 必須となる引数はクラスター名 (*マイクラスター*) のみです。
+ クラスターの *認証機関* を取得するには次のコマンドを実行してください。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ クラスターの *api-server-endpoint* を取得するには次のコマンドを実行してください。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ 最終的に、`--dns-cluster-ip` の値はサービス CIDR を示す `.10` となります。クラスターの *service-cidr* を取得するには次のコマンドを実行してください。例えば、戻り値が `ipv4 10.100.0.0/16` であれば、自分の値は *10.100.0.10* です。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ この例ではカスタムの `max-pods` 値を設定するために `kubelet` 引数を指定します。その際、Amazon EKS 最適化 AMI に含まれている `bootstrap.sh` スクリプトを使用します。*my-max-pods-value* を選択する方法については「」を参照してください。マネージド型ノードグループを使用する場合の `maxPods` の決定方法の詳細については、「[maxPods の決定方法](choosing-instance-type.md#max-pods-precedence)」を参照してください。

  ```
  MIME-Version: 1.0
  Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
  
  --==MYBOUNDARY==
  Content-Type: text/x-shellscript; charset="us-ascii"
  
  #!/bin/bash
  set -ex
  /etc/eks/bootstrap.sh my-cluster \
    --b64-cluster-ca certificate-authority \
    --apiserver-endpoint api-server-endpoint \
    --dns-cluster-ip service-cidr.10 \
    --kubelet-extra-args '--max-pods=my-max-pods-value' \
    --use-max-pods false
  
  --==MYBOUNDARY==--
  ```

### Amazon EKS に最適化された Windows AMI に含まれる `Start-EKSBootstrap.ps1` ファイルに引数を渡すためのユーザーデータを提供する
<a name="mng-specify-eks-ami-windows"></a>

ブートストラップとはインスタンスの起動時に実行できるコマンドの追加を表す用語です。起動テンプレートを指定せずに、`eksctl` を使用して引数を `Start-EKSBootstrap.ps1` スクリプトに渡すことができます。または起動テンプレートのユーザーデータセクションに情報を指定することでこれを行うことができます。

カスタム Windows AMI ID を指定する場合は、次の考慮事項に留意してください。
+ 起動テンプレートを使用し、必要なブートストラップコマンドをユーザーデータセクションに入力する必要があります。目的の Windows ID を取得するには、「[最適化された Windows AMI を使用してノードを作成する](eks-optimized-windows-ami.md)」のテーブルを使用できます。
+ いくつかの制限と条件があります。例えば、`eks:kube-proxy-windows` を AWS IAM 認証 設定マップに追加する必要があります。詳細については「[AMI ID を指定する場合の制限と条件](#mng-ami-id-conditions)」を参照してください。

起動テンプレートのユーザーデータセクションで次の情報を指定します。各*サンプル値*は独自の値に置き換えます。`-APIServerEndpoint`、`-Base64ClusterCA`、および `-DNSClusterIP` 引数はオプションです。しかし、これらを定義すると、`Start-EKSBootstrap.ps1` スクリプトによる `describeCluster` 呼び出しを避けることができます。
+ 必須となる引数はクラスター名 (*マイクラスター*) のみです。
+ クラスターの *認証機関* を取得するには次のコマンドを実行してください。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ クラスターの *api-server-endpoint* を取得するには次のコマンドを実行してください。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ 最終的に、`--dns-cluster-ip` の値はサービス CIDR を示す `.10` となります。クラスターの *service-cidr* を取得するには次のコマンドを実行してください。例えば、戻り値が `ipv4 10.100.0.0/16` であれば、自分の値は *10.100.0.10* です。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ その他の引数については「[ブートストラップスクリプトの設定パラメータ](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)」を参照してください。
**注記**  
カスタムサービス CIDR を使用している場合は`-ServiceCIDR` パラメータを使用して指定する必要があります。そうしないと、クラスター内の Pod の DNS 解決が失敗します。

```
<powershell>
[string]$EKSBootstrapScriptFile = "$env:ProgramFiles\Amazon\EKS\Start-EKSBootstrap.ps1"
& $EKSBootstrapScriptFile -EKSClusterName my-cluster `
	 -Base64ClusterCA certificate-authority `
	 -APIServerEndpoint api-server-endpoint `
	 -DNSClusterIP service-cidr.10
</powershell>
```

### 特定のセキュリティ、コンプライアンス、または社内的なポリシー要件のために、カスタム AMI を実行する
<a name="mng-specify-custom-ami"></a>

詳細については*「アマゾン EC2 ユーザーガイド」*の「[アマゾン マシンイメージ (AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)」を参照してください。Amazon EKS AMI ビルド仕様にはAmazon Linux をベースにしたカスタム Amazon EKS AMI を構築するためのリソースと設定スクリプトが含まれています。詳細については、GitHubの「[Amazon EKS AMI ビルド仕様](https://github.com/awslabs/amazon-eks-ami/)」を参照してください。他のオペレーティングシステムがインストールされたカスタム AMI を作成するには、GitHubの「[Amazon EKS Sample Custom AMIs](https://github.com/aws-samples/amazon-eks-custom-amis)」を参照してください。

マネージドノードグループで使用される起動テンプレートで AMI ID に動的パラメータ参照を使用することはできません。

**重要**  
AMI を指定する場合、Amazon EKS はクラスターのコントロールプレーンバージョンに対して AMI に埋め込まれた Kubernetes バージョンを検証しません。ユーザーは、カスタム AMI の Kubernetes バージョンが以下の [Kubernetes バージョンスキューポリシー](https://kubernetes.io/releases/version-skew-policy)に準拠していることを確認する責任があります。  
ノード上の `kubelet` バージョンはクラスターバージョンより新しいものであってはならない
ノード上の `kubelet` バージョンは、お使いのクラスターバージョン (Kubernetes バージョン `1.28` およびそれ以降) から最大 マイナーバージョン 3 つ前まで、またはクラスターバージョン (Kubernetes バージョン `1.27` およびそれ以前) から最大 マイナーバージョン 2 つ前までである必要がある  
バージョンスキューポリシーに違反したマネージド型ノードグループを作成すると、次の結果になる可能性があります。
ノードをクラスターに結合できない
未定義の動作または API の非互換性
クラスターの不安定性またはワークロード障害
AMI を指定する際、Amazon EKS ではユーザーデータをマージしません。代わりに、ノードのクラスターへの参加に必要な `bootstrap` コマンドを、ユーザーが提供する必要があります。ノードがクラスターに参加できない場合、アマゾン EKS `CreateNodegroup` および `UpdateNodegroupVersion` アクションも失敗します。

## AMI ID を指定する場合の制限と条件
<a name="mng-ami-id-conditions"></a>

以下に、マネージド型ノードグループで AMI ID を指定する際の制限と条件を示します。
+ 起動テンプレートで AMI ID を指定する場合と、AMI ID を指定しない場合は新しいノードグループを作成して切り替える必要があります。
+ 新しい AMI バージョンが利用可能になっても、コンソールでは通知を表示しません。ノードグループを新しい AMI バージョンに更新するには更新された AMI ID で新しいバージョンの起動テンプレートを作成する必要があります。次に、新しい起動テンプレートバージョンでノードグループを更新する必要があります。
+ AMI ID を指定した場合はAPI の次のフィールドを設定することはできません。
  +  `amiType` 
  +  `releaseVersion` 
  +  `version` 
+ AMI ID を指定する場合、API で設定されたすべての `taints` は非同期に適用されます。ノードがクラスターに参加する前にテイントを適用するには`--register-with-taints` コマンドラインフラグを使用してユーザーデータ内の `kubelet` にテイントを渡す必要があります。詳細については、Kubernetes ドキュメントの「[kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)」を参照してください。
+ Windows マネージド型ノードグループのカスタム AMI ID を指定するときは、AWS IAM オーセンティケーター設定マップに `eks:kube-proxy-windows` を追加します。これはDNS が正しく機能するために必要です。

  1. AWS IAM 認証 設定マップを編集用に開きます。

     ```
     kubectl edit -n kube-system cm aws-auth
     ```

  1. このエントリを、Windows ノードに関連付けられた各 `rolearn` の下にある `groups` リストに追加します。設定マップは [aws-auth-cm-windows.yaml](https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm-windows.yaml)に似ているはずです。

     ```
     - eks:kube-proxy-windows
     ```

  1. ファイルを保存し、テキストエディタを終了します。
+ カスタム起動テンプレートを使用する AMI の場合、マネージドノードグループのデフォルト `HttpPutResponseHopLimit` は `2` に設定されます。

# クラスターからマネージドノードグループを削除する
<a name="delete-managed-node-group"></a>

このトピックでは、Amazon EKS マネージド型ノードグループを削除する方法について説明します。マネージド型ノードグループを削除すると、まず Amazon EKS が Auto Scaling グループの最小サイズ、最大サイズ、および必要なサイズをゼロに設定します。これにより、ノードグループがスケールダウンされます。

各インスタンスが終了する前に、Amazon EKS はそのノードを排出するシグナルを送信します。排出プロセス中、Kubernetes はノード上の各ポッドに対して、設定されている `preStop` ライフサイクルフックを実行し、コンテナに `SIGTERM` シグナルを送信してから、正常なシャットダウンのために `terminationGracePeriodSeconds` の間待機します。5 分後もノードが排出されない場合、Amazon EKS は自動スケーリングにインスタンスの強制終了を続行させます。すべてのインスタンスが終了すると、Auto Scaling グループは削除されます。

**重要**  
クラスター内の、他のマネージド型ノードグループで使用されていないノード IAM ロールを使用している、マネージド型ノードグループを削除すると、そのロールは `aws-auth` `ConfigMap` から削除されます。クラスター内のいずれかのセルフマネージド型ノードグループが同じノード IAM ロールを使用している場合、セルフマネージド型ノードは `NotReady` ステータスに移行します。さらに、クラスター操作も中断されます。クラスターのプラットフォームバージョンが「[EKS アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する](access-entries.md)」の前提条件セクションに記載されている最低バージョン以上である場合、セルフマネージドノードグループにのみ使用しているロールのマッピングを追加するには、「[アクセスエントリを作成する](creating-access-entries.md)」を参照してください。プラットフォームバージョンがアクセスエントリに必要な最小バージョンより前の場合は、エントリを `aws-auth` `ConfigMap` に追加し直すことができます。詳細については、ターミナルに `eksctl create iamidentitymapping --help` を入力してください。

マネージド型ノードグループを削除するには、以下を使用します。
+  [`eksctl`](#eksctl-delete-managed-nodegroup) 
+  [AWS マネジメントコンソール](#console-delete-managed-nodegroup) 
+  [AWS CLI](#awscli-delete-managed-nodegroup) 

## `eksctl`
<a name="eksctl-delete-managed-nodegroup"></a>

 **マネージド型ノードグループを `eksctl` を使用して削除する** 

次のコマンドを入力します。`<example value>` をすべて自分の値に置き換えてください。

```
eksctl delete nodegroup \
  --cluster <my-cluster> \
  --name <my-mng> \
  --region <region-code>
```

その他のオプションについては、`eksctl` ドキュメントの「[ノードグループの削除と排出](https://eksctl.io/usage/nodegroups/#deleting-and-draining-nodegroups)」を参照してください。

## AWS マネジメントコンソール
<a name="console-delete-managed-nodegroup"></a>

 **マネージド型ノードグループを AWS マネジメントコンソール を使用して削除する** 

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. **[クラスター]** ページで、削除するノードグループを含むクラスターを選択します。

1. 選択したクラスターページで、**[コンピューティング]** タブを選択します。

1. **[Node groups]** (ノードグループ) セクションで、削除するノードグループを選択してください。その後、**[削除]** をクリックします。

1. **[ノードグループの削除]** 確認ダイアログボックスで、ノードグループの名前を入力します。その後、**[削除]** をクリックします。

## AWS CLI
<a name="awscli-delete-managed-nodegroup"></a>

 **マネージド型ノードグループを AWS CLI を使用して削除する** 

1. 次のコマンドを入力します。`<example value>` をすべて自分の値に置き換えてください。

   ```
   aws eks delete-nodegroup \
     --cluster-name <my-cluster> \
     --nodegroup-name <my-mng> \
     --region <region-code>
   ```

1. CLI 設定で `cli_pager=` が設定されている場合は、キーボードの矢印キーを使用して、応答出力をスクロールします。終了したら `q` キーを押します。

   その他のオプションについては、「*AWS CLI コマンドリファレンス*」の ` [delete-nodegroup](https://docs.aws.amazon.com/cli/latest/reference/eks/delete-nodegroup.html) ` コマンドを参照してください。

# セルフマネージドノードでノードを自分自身で維持する
<a name="worker"></a>

クラスターには、Pod がスケジュールされている Amazon EC2 ノードが 1 つ以上含まれています。Amazon EKS ノードは AWS アカウントで実行され、クラスター API サーバーエンドポイントを介してクラスターのコントロールプレーンに接続します。Amazon EC2 料金に基づいて請求されます。詳細については「[Amazon EC2 料金](https://aws.amazon.com/ec2/pricing/)」を参照してください。

クラスターには、複数のノードグループを含めることができます。各ノードグループには、[Amazon EC2 Auto Scaling グループ](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroup.html)にデプロイされる 1 つ以上のノードが含まれます。グループ内のノードのインスタンスタイプは、[Karpenter](https://karpenter.sh/) による[属性ベースのインスタンスタイプの選択](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html)を使用するときなどに、異なる場合があります。ノードグループ内のすべてのインスタンスは、[Amazon EKS ノードの IAM ロール](create-node-role.md)を使用する必要があります。

Amazon EKS は、Amazon EKS 最適化 AMI と呼ばれる特殊な Amazon マシンイメージ (AMI) を提供します。AMI は Amazon EKS と連携するように設定されています。そのコンポーネントには `containerd`、`kubelet`、および AWS IAM Authenticator が含まれます。また、AMI にはクラスターのコントロールプレーンを自動的に検出して接続を許可する、特別な[ブートストラップスクリプト](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)も含まれます。

CIDR ブロックを使用してクラスターのパブリックエンドポイントへのアクセスを制限する場合は、プライベートエンドポイントアクセスも有効にすることをお勧めします。これは、ノードがクラスターと通信できるようにするためです。プライベートエンドポイントが有効になっていない場合、パブリックアクセスに指定する CIDR ブロックに、VPC からの出力ソースを含める必要があります。詳細については、「[クラスター API サーバーエンドポイント](cluster-endpoint.md)」を参照してください。

Amazon EKS クラスターにセルフマネージド型ノードを追加するには、次のトピックを参照してください。セルフマネージドノードを手動で起動する場合は、各ノードに次のタグを追加すると共に、`<cluster-name>` がクラスターに一致することを確認します。詳細については、「[個々のリソースでのタグの追加と削除](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#adding-or-deleting-tags)」を参照してください。このガイドの手順に従うと、必要なタグがノードに自動的に追加されます。


| キー | 値 | 
| --- | --- | 
|   `kubernetes.io/cluster/<cluster-name>`   |   `owned`   | 

**重要**  
Amazon EC2 インスタンスメタデータサービス (IMDS) のタグは、EKS ノードと互換性がありません。インスタンスメタデータタグを有効にすると、タグ値でのスラッシュ (「/」) の使用が防止されます。この制限により、特に Karpenter や Cluster Autoscaler などのノード管理ツールを使用する場合、インスタンスの起動が失敗する可能性があります。これらのサービスは、スラッシュを含むタグに依存して適切に機能しているためです。

Kubernetes の一般的な視点から見たノードの詳細については、Kubernetes のドキュメントの「[Nodes](https://kubernetes.io/docs/concepts/architecture/nodes/)」を参照してください。

**Topics**
+ [セルフマネージド Amazon Linux ノードを作成する](launch-workers.md)
+ [セルフマネージド Bottlerocket ノードの作成](launch-node-bottlerocket.md)
+ [セルフマネージド Microsoft Windows ノードの作成](launch-windows-workers.md)
+ [セルフマネージドの Ubuntu Linux ノードを作成する](launch-node-ubuntu.md)
+ [クラスターのためにセルフマネージドノードを更新する](update-workers.md)

# セルフマネージド Amazon Linux ノードを作成する
<a name="launch-workers"></a>

このトピックでは、Amazon EKS クラスターに登録されている Linux ノードの Auto Scaling グループを起動する方法を説明します。ノードがクラスターに参加したら、それらのノードに Kubernetes アプリケーションをデプロイ可能になります。`eksctl` または AWS マネジメントコンソールを使用して、セルフマネージド型の Amazon Linux ノードを起動することもできます。AWS アウトポスト でノードを起動する必要がある場合は「[AWS Outposts で Amazon Linux ノードを作成する](eks-outposts-self-managed-nodes.md)」を参照してください。
+ 既存の Amazon EKS クラスター。デプロイするには「[Amazon EKS クラスターを作成します。](create-cluster.md)」を参照してください。AWS アウトポスト、AWS 波長、または AWS ローカルゾーンs が有効になっている AWS リージョンにサブネットがある場合はクラスターの作成時にそれらのサブネットが渡されるべきではありません。
+ ノードが使用する既存の IAM 役割。作成する場合は「[Amazon EKS ノードの IAM ロール](create-node-role.md)」を参照してください。この役割に VPC CNI のポリシーがどちらも含まれていない場合、VPC CNI ポッドには以下の別の役割が必要です。
+ (オプションですが推奨) 必要な IAM ポリシーがアタッチされた独自の IAM ロールで構成された Amazon VPC CNI plugin for Kubernetes アドオン。詳細については、「[IRSA を使用するように Amazon VPC CNI プラグインを設定する](cni-iam-role.md)」を参照してください。
+ 「[最適な Amazon EC2 ノードインスタンスタイプを選択する](choosing-instance-type.md)」に記載されている考慮事項に精通していること。選択したインスタンスタイプによってはクラスターと VPC に関する追加の前提条件がある場合もあります。

セルフマネージド Linux ノードは次のいずれかを使用して起動できます。
+  [`eksctl`](#eksctl_create_managed_amazon_linux) 
+  [AWS マネジメントコンソール](#console_create_managed_amazon_linux) 

## `eksctl`
<a name="eksctl_create_managed_amazon_linux"></a>

 **`eksctl` を使用してセルフマネージド型の Linux ノードを起動する** 

1. デバイスまたは AWS クラウドシェル にインストールされている `eksctl` コマンドラインツールのバージョン `0.215.0` 以降をインストールします。`eksctl` をインストールまたはアップグレードするには`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。

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

1. 次のコマンドは既存のクラスターにノードグループを作成します。*al-nodes* を、ノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。*マイクラスター* の部分は自分のクラスター名に置き換えます。この名前には英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前はクラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。残りの*サンプル値*は独自の値に置き換えます。デフォルトでは、ノードはコントロールプレーンと同じ Kubernetes バージョンで作成されます。

   `--node-type` の値を選択する前に、[「最適な Amazon EC2 ノードインスタンスタイプを選択する](choosing-instance-type.md)」を確認してください。

   *my-key* を Amazon EC2 キーペアまたはパブリックキーの名前に置き換えます。このキーは起動後のノードに SSH 接続するために使用されます。Amazon EC2 キーペアをまだ持っていない場合はAWS マネジメントコンソール で作成できます。詳細については「*Amazon EC2 ユーザーガイド*」の「[Amazon EC2 キーペア](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)」を参照してください。

   次のコマンドを使用して、ノードグループを作成します。
**重要**  
ノードグループを AWS アウトポスト、波長、または ローカルゾーンs サブネットにデプロイする場合、追加の考慮事項があります。  
クラスターを作成したときに、サブネットが渡されていない必要があります。
ノードグループはサブネットと ` [volumeType](https://eksctl.io/usage/schema/#nodeGroups-volumeType): gp2` を指定する設定ファイルを使用して作成する必要があります。詳細については「`eksctl` ドキュメント」の「[設定ファイルからノードグループを作成する](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)」と「[設定ファイルのスキーマ](https://eksctl.io/usage/schema/)」を参照してください。

   ```
   eksctl create nodegroup \
     --cluster my-cluster \
     --name al-nodes \
     --node-type t3.medium \
     --nodes 3 \
     --nodes-min 1 \
     --nodes-max 4 \
     --ssh-access \
     --managed=false \
     --ssh-public-key my-key
   ```

   次のノードグループをデプロイするには
   + デフォルト設定よりもはるかに多くの IP アドレスを Pod に割り当てることができるノードグループについては、「[プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす](cni-increase-ip-addresses.md)」を参照してください。
   + インスタンスのブロックとは異なる CIDR ブロックから `IPv4` アドレスを Pod に割り当てることができるノードグループについては、「[カスタムネットワーキングを使用して代替サブネットに Pod をデプロイする](cni-custom-network.md)」を参照してください。
   + Pod とサービスに `IPv6` アドレスを割り当てることができるノードグループについては、「[クラスター、Pod、サービスに対する IPv6 アドレスの説明](cni-ipv6.md)」を参照してください。
   + アウトバウンドインターネットアクセスがない場合は「[インターネットアクセスが制限されたプライベートクラスターをデプロイする](private-clusters.md)」を参照してください。

     すべての使用可能なオプションとデフォルト値の一覧を表示するには次のコマンドを入力してください。

     ```
     eksctl create nodegroup --help
     ```

     ノードがクラスターに参加できない場合はトラブルシューティングの章にある「[ノードをクラスターに結合できません](troubleshooting.md#worker-node-fail)」を参照してください。

     出力例は次のとおりです。ノードの作成中に、複数の行が出力されます。出力の最後の行は次のサンプル行が表示されます。

     ```
     [✔]  created 1 nodegroup(s) in cluster "my-cluster"
     ```

1. (オプション) [サンプルアプリケーション](sample-deployment.md)をデプロイして、クラスターと Linux ノードをテストします。

1. 次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
   + IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
   + クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

   詳細については「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

## AWS マネジメントコンソール
<a name="console_create_managed_amazon_linux"></a>

 **ステップ 1: AWS マネジメントコンソール を使用してセルフマネージド型の リナックス ノードを起動する**` 

1. AWS クラウドフォーメーション テンプレートの最新バージョンをダウンロードします。

   ```
   curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2025-11-26/amazon-eks-nodegroup.yaml
   ```

1. クラスターステータスが `ACTIVE` と表示されるまで待ちます。クラスターがアクティブになる前にノードを起動した場合、ノードはクラスターへの登録に失敗し、再起動する必要があります。

1. [AWS クラウドフォーメーション コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

1. **[スタックの作成]** を選択し、**[新しいリソースを使用 (標準)]** を選択してください。

1. **[テンプレートの指定]** で、**[テンプレートファイルのアップロード]** を選択し、**[ファイルを選択]** を選択してください。

1. ダウンロードした `amazon-eks-nodegroup.yaml` ファイルを選択してください。

1. **[次へ]** を選択してください。

1. **[スタックの詳細の指定]** ページで、必要に応じて次のパラメータを入力し、**[次へ]** を選択してください。
   +  **スタック名**: AWS クラウドフォーメーション スタックのスタック名を選択してください。例えば、*マイクラスター-nodes* という名前にすることができます。この名前には英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前はクラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。
   +  **[クラスター名]**: Amazon EKS クラスターの作成時に使用した名前を入力してください。この名前はクラスター名と同じにする必要があります。同じでない場合、ノードはクラスターに参加できません。
   +  [**クラスター制御プレーンセキュリティグループ**]: [VPC](creating-a-vpc.md) の作成時に生成した AWS クラウドフォーメーション 出力の [**セキュリティグループs**] 値を選択してください。

     次のステップでは該当するグループを取得する 1 つのオペレーションを説明します。

     1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

     1. クラスターの名前を選択してください。

     1. **[ネットワーキング]** タブを選択してください。

     1. **[クラスター制御プレーンセキュリティグループ]** ドロップダウンリストから選択する場合は**[追加のセキュリティグループ]** の値をリファレンスとして使用します。
   +  **[ApiServerEndpoint]**: EKS クラスターの API サーバーエンドポイントを入力します。これは EKS クラスターコンソールの [詳細] セクションにあります。
   +  **[CertificateAuthorityData]**: base64 でエンコードされた認証機関データを入力します。これは、EKS クラスターコンソールの [詳細] セクションにもあります。
   +  **[ServiceCidr]**: クラスター内の Kubernetes サービスに IP アドレスを割り当てるために使用される CIDR 範囲を入力します。これは、EKS クラスターコンソールの [ネットワーク] タブにあります。
   +  **[AuthenticationMode]**: EKS クラスターコンソール内の [アクセス] タブを確認して、EKS クラスターで使用されている認証モードを選択します。
   +  **[ノードグループ名]**: ノードグループの名前を入力してください。この名前はノードに対して作成される自動スケーリングノードグループを識別するために後で使用できます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。
   +  **[ノードオートスケーリンググループ最小サイズ]**: ノードの 自動スケーリング グループがスケールインできる最小ノード数を入力してください。
   +  **ノード自動スケーリンググループ希望容量**: スタック作成時にスケーリングする必要のあるノード数を入力してください。
   +  **[NodeAutoScalingGroupMaxSize]**: ノードの 自動スケーリング グループがスケールアウトできる最大ノード数を入力してください。
   +  **[ノードインスタンス型]**: ノードのインスタンスタイプを選択してください。詳細については、「[最適な Amazon EC2 ノードインスタンスタイプを選択する](choosing-instance-type.md)」を参照してください。
   +  **[NodeImageIdSSMParam]**: 最新の Amazon EKS 最適化 Amazon Linux 2023 AMI の Amazon EC2 Systems Manager のパラメータが、可変 Kubernetes バージョン用に事前設定されています。Amazon EKS でサポートされている別の Kubernetes マイナーバージョンを使用するには、*1.XX* を別の[サポートされているバージョン](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)に置き換えます。クラスターと同じ Kubernetes バージョンを指定することをお勧めします。

     *アマゾンリナックス-2023* を別の AMI タイプに置き換えることもできます。詳細については、「[推奨 Amazon Linux AMI ID を取得する](retrieve-ami-id.md)」を参照してください。
**注記**  
Amazon EKS ノード AMI は Amazon リナックス をベースとしています。[Amazon Linux セキュリティセンター](https://alas.aws.amazon.com/alas2023.html)で Amazon Linux 2023 のセキュリティイベントまたはプライバシーイベントを追跡するか、関連する [RSS フィード](https://alas.aws.amazon.com/AL2023/alas.rss)をサブスクライブします。セキュリティおよびプライバシーイベントには問題の概要、影響を受けるパッケージ、および問題を修正するためにインスタンスを更新する方法などがあります。
   +  **ノードイメージId**: (オプション) (Amazon EKS 最適化 AMI の代わりに) 独自のカスタム AMI を使用している場合はAWS リージョンのノード AMI ID を入力してください。ここで値を指定すると、**[ノードイメージIdSSMParam]** フィールドの値はすべて上書きされます。
   +  **[ノードボリュームサイズ]**: ノードのルートボリュームのサイズを GiB 単位で指定します。
   +  **[ノードボリューム型]**: ノードのルートボリュームタイプを指定します。
   +  **[キー名]**: 起動後に、SSH を使用してノードに接続するときに使用できる Amazon EC2 SSH キーペアの名前を入力してください。Amazon EC2 キーペアをまだ持っていない場合はAWS マネジメントコンソール で作成できます。詳細については「*Amazon EC2 ユーザーガイド*」の「[Amazon EC2 キーペア](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)」を参照してください。
   +  **[VpcId]**: 作成した [VPC](creating-a-vpc.md) の ID を入力してください。
   +  **[Subnets]**: VPC 用に作成したサブネットを選択してください。「[Amazon EKS クラスターの Amazon VPC を作成する](creating-a-vpc.md)」で説明されている手順で VPC を作成した場合は起動するノードの VPC 内のプライベートサブネットのみを指定します。クラスターの **[ネットワーキング]** タブから、各サブネットリンクを開き、プライベートのサブネットを確認できます。
**重要**  
いずれかのサブネットがパブリックサブネットである場合はパブリック IP アドレスの自動割り当て設定を有効にする必要があります。この設定がパブリックサブネットに対して有効になっていない場合、そのパブリックサブネットにデプロイするノードにはパブリック IP アドレスが割り当てられず、クラスターやその他の AWS のサービスと通信できなくなります。2020 年 3 月 26 日以前に、[Amazon EKS AWS クラウドフォーメーション VPC テンプレート](creating-a-vpc.md)を使用して、または `eksctl` を使用してサブネットがデプロイされた場合、パブリックサブネットではパブリック IP アドレスの自動割り当てが無効になります。サブネットのパブリック IP アドレス割り当てを有効にする方法については「[サブネットのパブリック IPv4 アドレス属性の変更](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)」を参照してください。ノードがプライベートサブネットにデプロイされている場合、NAT ゲートウェイを介してクラスターや他の AWS のサービスと通信できます。
サブネットにインターネットアクセスがない場合は「[インターネットアクセスが制限されたプライベートクラスターをデプロイする](private-clusters.md)」の考慮事項と追加の手順を確認してください。
AWS アウトポスト、波長、または ローカルゾーンs サブネット を選択する場合はクラスターの作成時にサブネットを渡さないようにします。

1. **[スタックオプションの設定]** ページで、希望する設定を選択し、**[次へ]** を選択してください。

1. **[AWS クラウドフォーメーション が IAM リソースを作成する可能性を認識しています]** の左にあるチェックボックスを選択して、**[スタックの作成]** を選択してください。

1. スタックの作成が完了したら、コンソールで選択し、**[出力]** を選択してください。`EKS API` または `EKS API and ConfigMap` 認証モードを使用している場合は、これが最後のステップです。

1. `ConfigMap` 認証モードを使用している場合は、作成されたノードグループの **NodeInstanceRole** を記録します。

 **ステップ 2: ノードを有効にしてクラスターに参加する** 

**注記**  
次の 2 つのステップは、EKS クラスター内で Configmap 認証モードを使用している場合にのみ必要です。さらに、アウトバウンドのインターネットアクセスのないプライベート VPC でノードを起動する場合はノードが VPC 内からクラスターに参加できるようにしてください。

1. `aws-auth` `ConfigMap` がすでにあるかどうかを確認します。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. `aws-auth` `ConfigMap` が表示されている場合は必要に応じて更新してください。

   1. 編集する `ConfigMap` を開きます。

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 必要に応じて新しい `mapRoles` エントリを追加します。`rolearn` 値を、前の手順で記録した **[ノードインスタンス役割]** 値に設定します。

      ```
      [...]
      data:
        mapRoles: |
          - rolearn: <ARN of instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
      [...]
      ```

   1. ファイルを保存し、テキストエディタを終了します。

1. 「`Error from server (NotFound): configmaps "aws-auth" not found`」というエラーが表示されたら、ストック `ConfigMap` を適用してください。

   1. 設定マップをダウンロードします。

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
      ```

   1. `aws-auth-cm.yaml` ファイルで、`rolearn` 値を前の手順で記録した **[ノードインスタンス役割]** 値に設定します。これを行うにはテキストエディタを使用するか、*マイノードインスタンス役割* を置き換えて次のコマンドを実行してください。

      ```
      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml
      ```

   1. 設定を適用します。このコマンドが完了するまで数分かかることがあります。

      ```
      kubectl apply -f aws-auth-cm.yaml
      ```

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

   ```
   kubectl get nodes --watch
   ```

   `Ctrl`\$1`C` を入力して、シェルプロンプトに戻ります。
**注記**  
認可またはリソースタイプのエラーが発生した場合はトラブルシューティングトピックの「[許可されていないか、アクセスが拒否されました (`kubectl`)](troubleshooting.md#unauthorized)」を参照してください。

   ノードがクラスターに参加できない場合はトラブルシューティングの章にある「[ノードをクラスターに結合できません](troubleshooting.md#worker-node-fail)」を参照してください。

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

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

 **ステップ 3: その他のアクション** 

1. (オプション) [サンプルアプリケーション](sample-deployment.md)をデプロイして、クラスターと Linux ノードをテストします。

1. (オプション) **AmazonEKS\$1CNI\$1Policy** マネージド IAM ポリシー (`IPv4` クラスターがある場合) または *AmazonEKS\$1CNI\$1IPv6\$1Policy* (`IPv6` クラスターがある場合には[ユーザー自身が作成した](cni-iam-role.md#cni-iam-role-create-ipv6-policy)もの) が [Amazon EKS ノードの IAM ロール](create-node-role.md)にアタッチされている場合、代わりに Kubernetes `aws-node` サービスアカウントに関連付けた IAM ロールに割り当てることをお勧めします。詳細については、「[IRSA を使用するように Amazon VPC CNI プラグインを設定する](cni-iam-role.md)」を参照してください。

1. 次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
   + IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
   + クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

   詳細については「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

# セルフマネージド Bottlerocket ノードの作成
<a name="launch-node-bottlerocket"></a>

**注記**  
マネージド型ノードグループでは、ユースケースにいくつかの利点がある場合があります。詳細については、「[マネージドノードグループを使用してノードライフサイクルを簡素化する](managed-node-groups.md)」を参照してください。

このトピックでは、Amazon EKS クラスターに登録する [Bottlerocket](https://aws.amazon.com/bottlerocket/) ノードの Auto Scaling グループを起動する方法について説明します。Bottlerocket は AWS が提供する Linux ベースのオープンソースのオペレーティングシステムで、仮想マシンやベアメタルホスト上でコンテナを実行するために使用できます。ノードがクラスターに参加したら、それらのノードに Kubernetes アプリケーションをデプロイ可能になります。Botttlerocket の詳細については、GitHub の [Using a Bottlerocket AMI with Amazon EKS](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-EKS.md) と `eksctl` ドキュメント内の [Custom AMI support](https://eksctl.io/usage/custom-ami-support/) を参照してください。

インプレースアップグレードについて詳しくは、GitHub の [Bottlerocket Update Operator](https://github.com/bottlerocket-os/bottlerocket-update-operator) を参照してください。

**重要**  
Amazon EKS ノードは標準の Amazon EC2 インスタンスであり、通常の Amazon EC2 インスタンス価格に基づいて請求されます。詳細については「[Amazon EC2 料金](https://aws.amazon.com/ec2/pricing/)」を参照してください。
AWS Outposts 上の Amazon EKS 拡張クラスターで Bottlerocket ノードを起動できますが、AWS Outposts 上のローカルクラスターでは起動できません。詳細については、「[AWS Outposts を使用して Amazon EKS をオンプレミスにデプロイする](eks-outposts.md)」を参照してください。
`x86` または Arm プロセッサを使用して Amazon EC2 インスタンスにデプロイできます。ただし、Inferentia チップがあるインスタンスにデプロイすることはできません。
Bottlerocket は、AWS CloudFormation と互換性があります。ただし、Amazon EKS の Bottlerocket ノードをデプロイするためにコピーできる公式の CloudFormation テンプレートはありません。
Bottlerocket のイメージには、SSH サーバーやシェルは付属していません。SSH で管理者コンテナを有効にし、ユーザーデータとともにブートストラップの設定ステップを渡すために、帯域外のアクセス方式を使用できます。詳細については、GitHub の「[bottleRocket readme.md](https://github.com/bottlerocket-os/bottlerocket)」のセクションを参照してください。  
 [探査](https://github.com/bottlerocket-os/bottlerocket#exploration) 
 [管理者コンテナ](https://github.com/bottlerocket-os/bottlerocket#admin-container) 
 [Kubernetes 設定](https://github.com/bottlerocket-os/bottlerocket#kubernetes-settings) 

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

```
eksctl version
```

`eksctl` のインストールまたはアップグレードの手順については、 `eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。注意: この手順は、`eksctl` で作成されたクラスターでのみ機能します。

1. 次のコンテンツをデバイスにコピーします。*マイクラスター* の部分は自分のクラスター名に置き換えます。この名前には英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。*ng-bottlerocket* をノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。Arm インスタンスにデプロイするには、*m5.large* を Arm インスタンスタイプに置き換えます。*my-ec2-keypair-name* を、起動後に、SSH を使用してノードに接続するときに使用できる Amazon EC2 SSH キーペアの名前に置き換えます。Amazon EC2 キーペアをまだ持っていない場合は、AWS マネジメントコンソール で作成できます。詳細については*「アマゾン EC2 ユーザーガイド」*の「[アマゾン EC2 キーペア](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)」を参照してください。残りのサンプル値はすべて独自の値に置き換えます。置き換えが完了したら、変更したコマンドを実行して `bottlerocket.yaml` ファイルを作成します。

   Arm Amazon EC2 インスタンスタイプを指定する場合は、デプロイする前に「[Amazon EKS 最適化 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami)」の考慮事項を確認してください。カスタム AMI を使用したデプロイの手順については、GitHub の [Building Bottlerocket](https://github.com/bottlerocket-os/bottlerocket/blob/develop/BUILDING.md) と、`eksctl` ドキュメントの [Custom AMI support](https://eksctl.io/usage/custom-ami-support/) を参照してください。マネージド型ノードグループをデプロイするには、起動テンプレートを使用してカスタム AMI をデプロイします。詳細については、「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」を参照してください。
**重要**  
ノードグループを AWS Outposts、AWS Wavelength、または AWS Local Zone サブネットにデプロイする場合、クラスターの作成時に AWS Outposts、AWS Wavelength、または AWS Local Zone サブネットは渡さないでください。次の例では、サブネットを指定する必要があります。詳細については、`eksctl` ドキュメントの「[設定ファイルからノードグループを作成する](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)」と「[Config ファイルのスキーマ](https://eksctl.io/usage/schema/)」を参照してください。*region-code* を、クラスターのある AWS リージョンに置き換えます。

   ```
   cat >bottlerocket.yaml <<EOF
   ---
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   
   metadata:
     name: my-cluster
     region: region-code
     version: '1.35'
   
   iam:
     withOIDC: true
   
   nodeGroups:
     - name: ng-bottlerocket
       instanceType: m5.large
       desiredCapacity: 3
       amiFamily: Bottlerocket
       ami: auto-ssm
       iam:
          attachPolicyARNs:
             - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
             - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
             - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
             - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
       ssh:
           allow: true
           publicKeyName: my-ec2-keypair-name
   EOF
   ```

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

   ```
   eksctl create nodegroup --config-file=bottlerocket.yaml
   ```

   出力例は次のとおりです。

   ノードの作成中に、複数の行が出力されます。出力の最後の行は次のサンプル行が表示されます。

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (オプション) [Amazon EBS CSI プラグイン](https://github.com/kubernetes-sigs/aws-ebs-csi-driver)を使用して、Bottlerocket ノード上に Kubernetes [永続ボリューム](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)を作成します。デフォルトの Amazon EBS ドライバーは、Bottlerocket に含まれていないファイルシステムツールを利用します。ドライバーを使用してストレージクラスを作成する方法の詳細については、「[Amazon EBS で Kubernetes ボリュームストレージを使用する](ebs-csi.md)」を参照してください。

1. (オプション) デフォルトでは、`kube-proxy` は `nf_conntrack_max` カーネルパラメータを、Bottlerocket がブート時に設定するものとは異なるデフォルト値に設定します。Bottlerocket の[デフォルト設定](https://github.com/bottlerocket-os/bottlerocket-core-kit/blob/develop/packages/release/release-sysctl.conf)を保持するには、次のコマンドを使用して `kube-proxy` 設定を編集します。

   ```
   kubectl edit -n kube-system daemonset kube-proxy
   ```

   次の例にある `kube-proxy` 引数に、`--conntrack-max-per-core` と `--conntrack-min` を追加します。`0` の設定は、変更がないことを意味します。

   ```
         containers:
         - command:
           - kube-proxy
           - --v=2
           - --config=/var/lib/kube-proxy-config/config
           - --conntrack-max-per-core=0
           - --conntrack-min=0
   ```

1. (オプション) [サンプルアプリケーション](sample-deployment.md)をデプロイして、Bottlerocket ノードをテストします。

1. 次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
   + IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
   + クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

   詳細については「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

# セルフマネージド Microsoft Windows ノードの作成
<a name="launch-windows-workers"></a>

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

**重要**  
Amazon EKS ノードは標準の Amazon EC2 インスタンスであり、通常の Amazon EC2 インスタンス価格に基づいて請求されます。詳細については「[Amazon EC2 料金](https://aws.amazon.com/ec2/pricing/)」を参照してください。
AWS Outposts 上の Amazon EKS 拡張クラスターで Windows ノードを起動できますが、AWS Outposts 上のローカルクラスターでは起動できません。詳細については、「[AWS Outposts を使用して Amazon EKS をオンプレミスにデプロイする](eks-outposts.md)」を参照してください。

クラスターに対して Windows サポートを有効にします。Windows ノードグループを起動する前に、重要な考慮事項を確認することをお勧めします。詳細については、「[Windows サポートを有効にする](windows-support.md#enable-windows-support)」を参照してください。

次のいずれかを使用して、セルフマネージド型の Windows ノードを起動できます。
+  [`eksctl`](#eksctl_create_windows_nodes) 
+  [AWS マネジメントコンソール](#console_create_windows_nodes) 

## `eksctl`
<a name="eksctl_create_windows_nodes"></a>

 **`eksctl` <2> を使用して自己管理型 Windows ノードを起動します。**

この手順では`eksctl` をインストール済みで、お使いの `eksctl` バージョンが `0.215.0` 以上であることが必要です。お使いのバージョンは以下のコマンドを使用して確認できます。

```
eksctl version
```

`eksctl` のインストールまたはアップグレードの手順については`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。

**注記**  
この手順は`eksctl` で作成されたクラスターに対してのみ機能します。

1. (オプション) **AmazonEKS\$1CNI\$1Policy** マネージド IAM ポリシー (`IPv4` クラスターがある場合) または *AmazonEKS\$1CNI\$1IPv6\$1Policy* (`IPv6` クラスターがある場合には[ユーザー自身が作成した](cni-iam-role.md#cni-iam-role-create-ipv6-policy)もの) が [Amazon EKS ノードの IAM ロール](create-node-role.md)にアタッチされている場合、代わりに Kubernetes `aws-node` サービスアカウントに関連付けた IAM ロールに割り当てることをお勧めします。詳細については、「[IRSA を使用するように Amazon VPC CNI プラグインを設定する](cni-iam-role.md)」を参照してください。

1. この手順では既存のクラスターがあることを前提としています。Windows ノードグループの追加先となる Amazon EKS クラスターと Amazon Linux ノードグループがまだ存在しない場合は、[Amazon EKS – `eksctl` の使用を開始する](getting-started-eksctl.md) に従うことをお勧めします。このガイドはAmazon Linux ノードで Amazon EKS クラスターを作成する方法についての完全なチュートリアルを提供します。

   次のコマンドを使用して、ノードグループを作成します。*地域コード* を、クラスターのある AWS リージョンに置き換えます。*マイクラスター* の部分は自分のクラスター名に置き換えます。この名前には英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前はクラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。*ng-windows* をノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。*2019* を `2022` に置き換えて Windows Server 2022 を使用するか、もしくは `2025` に置き換えて Windows Server 2025 を使用できます。残りのサンプル値は独自の値に置き換えます。
**重要**  
ノードグループを AWS Outposts、AWS 波長、または AWS ローカルゾーン サブネットにデプロイする場合、クラスターの作成時に AWS Outposts、波長、または ローカルゾーン サブネットは渡さないでください。AWS Outposts、波長、または ローカルゾーンサブネットを指定した設定ファイルを使用して、ノードグループを作成します。詳細については`eksctl` ドキュメントの「[設定ファイルからノードグループを作成する](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)」と「[設定ファイルのスキーマ](https://eksctl.io/usage/schema/)」を参照してください。

   ```
   eksctl create nodegroup \
       --region region-code \
       --cluster my-cluster \
       --name ng-windows \
       --node-type t2.large \
       --nodes 3 \
       --nodes-min 1 \
       --nodes-max 4 \
       --managed=false \
       --node-ami-family WindowsServer2019FullContainer
   ```
**注記**  
ノードがクラスターに参加できない場合はトラブルシューティングガイドの「[ノードをクラスターに結合できません](troubleshooting.md#worker-node-fail)」を参照してください。
`eksctl` コマンドで使用可能なオプションを表示するには次のコマンドを入力してください。  

     ```
     eksctl command -help
     ```

   出力例は次のとおりです。ノードの作成中に、複数の行が出力されます。出力の最後の行は次のサンプル行が表示されます。

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (オプション) [サンプルアプリケーション](sample-deployment.md)をデプロイして、クラスターと Windows ノードをテストします。

1. 次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
   + IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
   + クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

   詳細については、「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

## AWS マネジメントコンソール
<a name="console_create_windows_nodes"></a>

 **前提条件** 
+ 既存の Amazon EKS クラスターと Linux ノードグループ。これらのリソースがない場合は[Amazon EKS の使用を開始する](getting-started.md) のガイドのいずれかに従って作成することをお勧めします。これらのガイドでは、Linux ノードで Amazon EKS クラスターを作成する方法について説明しています。
+ Amazon EKS クラスターの要件を満たす、既存の VPC およびセキュリティグループ。詳細については[VPC とサブネットの Amazon EKS ネットワーキング要件を表示する](network-reqs.md)および[クラスターの Amazon EKS セキュリティグループ要件を表示する](sec-group-reqs.md)を参照してください。[Amazon EKS の使用を開始する](getting-started.md) のガイドでは要件を満たす VPC を作成します。または「[Amazon EKS クラスターの Amazon VPC を作成する](creating-a-vpc.md)」に従って手動で作成することもできます。
+ Amazon EKS クラスターの要件を満たす VPC およびセキュリティグループを使用している、既存の Amazon EKS クラスター。詳細については「[Amazon EKS クラスターを作成します。](create-cluster.md)」を参照してください。AWS Outposts、AWS 波長、または AWS ローカルゾーンが有効になっている AWS リージョンにサブネットがある場合はクラスターの作成時にそれらのサブネットが渡されるべきではありません。

 **ステップ 1: AWS マネジメントコンソール を使用してセルフマネージド型の Windows ノードを起動する** 

1. クラスターステータスが `ACTIVE` と表示されるまで待ちます。クラスターがアクティブになる前にノードを起動した場合、ノードはクラスターへの登録に失敗し、再起動が必要になります。

1. [AWS クラウドフォーメーション コンソール](https://console.aws.amazon.com/cloudformation/)を開きます 

1. **[スタックの作成]** を選択してください。

1. **[テンプレートを指定]** で、**[Amazon S3 URL]** を選択してください。

1. 次の URL をコピーして、**[Amazon S3 URL]** に貼り付けます。

   ```
   https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2023-02-09/amazon-eks-windows-nodegroup.yaml
   ```

1. **[次へ]** を 2 回選択してください。

1. **[スタックのクイック作成]** ページで、必要に応じて以下のパラメータを入力してください。
   +  **スタック名**: AWS クラウドフォーメーション スタックのスタック名を選択してください。例えば、`my-cluster-nodes` という名前にすることができます。
   +  **[クラスター名]**: Amazon EKS クラスターの作成時に使用した名前を入力してください。
**重要**  
この名前は「[ステップ 1: Amazon EKS クラスターを作成する](getting-started-console.md#eks-create-cluster)」で使用した名前と完全に一致する必要があります。そうしないと、ノードはクラスターに参加できません。
   +  **クラスター制御プレーンセキュリティグループ**: [VPC](creating-a-vpc.md) を作成する際に生成した AWS クラウドフォーメーション 出力からセキュリティグループを選択してください。次のステップでは該当するグループを取得する 1 つの方法を説明します。

     1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

     1. クラスターの名前を選択してください。

     1. **[ネットワーキング]** タブを選択してください。

     1. **[クラスター制御プレーンセキュリティグループ]** ドロップダウンリストから選択する場合は**[追加のセキュリティグループ]** の値をリファレンスとして使用します。
   +  **[ノードグループ名]**: ノードグループの名前を入力してください。この名前はノードに対して作成される自動スケーリングノードグループを識別するために後で使用できます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。
   +  **[ノードオートスケーリンググループ最小サイズ]**: ノードの 自動スケーリング グループがスケールインできる最小ノード数を入力してください。
   +  **ノード自動スケーリンググループ希望容量**: スタック作成時にスケーリングする必要のあるノード数を入力してください。
   +  **[NodeAutoScalingGroupMaxSize]**: ノードの 自動スケーリング グループがスケールアウトできる最大ノード数を入力してください。
   +  **[ノードインスタンス型]**: ノードのインスタンスタイプを選択してください。詳細については、「[最適な Amazon EC2 ノードインスタンスタイプを選択する](choosing-instance-type.md)」を参照してください。
**注記**  
最新バージョンの [Amazon VPC CNI plugin for Kubernetes](https://github.com/aws/amazon-vpc-cni-k8s) でサポートされているインスタンスタイプは、GitHub 上の [vpc\$1ip\$1resource\$1limit.go](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go) にリストされています。サポートされている最新のインスタンスタイプを利用するには、CNI のバージョンを更新することが必要になる場合があります。詳細については、「[Amazon VPC CNI を使用して Pod に IP を割り当てる](managing-vpc-cni.md)」を参照してください。
   +  **[NodeImageIdSSMParam]**: 現在推奨されている Amazon EKS 最適化 Windows Core AMI ID の Amazon EC2 Systems Manager パラメータが事前設定されています。Windows の通常版を使用する場合は、*Core* を `Full` に置き換えます。
   +  **ノードイメージId**: (オプション) (Amazon EKS 最適化 AMI の代わりに) 独自のカスタム AMI を使用している場合はAWS リージョンのノード AMI ID を入力してください。このフィールドに値を指定すると、**[ノードイメージIdSSMParam]** フィールドの値はすべて上書きされます。
   +  **[ノードボリュームサイズ]**: ノードのルートボリュームのサイズを GiB 単位で指定します。
   +  **[キー名]**: 起動後に、SSH を使用してノードに接続するときに使用できる Amazon EC2 SSH キーペアの名前を入力してください。Amazon EC2 キーペアをまだ持っていない場合はAWS マネジメントコンソール で作成できます。詳細については「*Amazon EC2 ユーザーガイド*」の「[Amazon EC2 キーペア](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)」を参照してください。
**注記**  
ここでキーペアを指定しないと、AWS クラウドフォーメーション スタックの作成は失敗します。
   +  [**ブートストラップ引数**]: `kubelet` を使用して、`-KubeletExtraArgs` の追加引数など、ノードブートストラップスクリプトに渡すオプションの引数を指定します。
   +  **[無効IMDSv1]**: 各ノードはデフォルトでインスタンスメタデータサービスバージョン 1 (IMDSv1) および IMDSv2 をサポートします。IMDSv1 は無効にできます。今後ノードグループのノードおよび Pod が MDSv1 を使用しないようにするには、**DisableIMDSv1** を **true** に設定します。IDMS の詳細については「[インスタンスメタデータサービスの設定](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)」を参照してください。
   +  **[VpcId]**: 作成した [VPC](creating-a-vpc.md) の ID を選択します。
   +  **[NodeSecurityGroups]**: [VPC](creating-a-vpc.md) の作成時に Linux ノードグループ用に作成したセキュリティグループを選択します。Linux ノードに複数のセキュリティグループがアタッチされている場合、それらのすべてを指定します。これは、たとえば、Linux ノードグループが `eksctl` を使用して作成された場合に行います。
   +  **[Subnets]**: 作成したサブネットを選択してください。「[Amazon EKS クラスターの Amazon VPC を作成する](creating-a-vpc.md)」で説明されている手順で VPC を作成した場合は起動するノードの VPC 内のプライベートサブネットのみを指定します。
**重要**  
いずれかのサブネットがパブリックサブネットである場合はパブリック IP アドレスの自動割り当て設定を有効にする必要があります。この設定がパブリックサブネットに対して有効になっていない場合、そのパブリックサブネットにデプロイするノードにはパブリック IP アドレスが割り当てられず、クラスターやその他の AWS のサービスと通信できなくなります。2020 年 3 月 26 日以前に、[Amazon EKS AWS クラウドフォーメーション VPC テンプレート](creating-a-vpc.md)を使用して、または `eksctl` を使用してサブネットがデプロイされた場合、パブリックサブネットではパブリック IP アドレスの自動割り当てが無効になります。サブネットのパブリック IP アドレス割り当てを有効にする方法については「[サブネットのパブリック IPv4 アドレス属性の変更](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)」を参照してください。ノードがプライベートサブネットにデプロイされている場合、NAT ゲートウェイを介してクラスターや他の AWS のサービスと通信できます。
サブネットにインターネットアクセスがない場合は「[インターネットアクセスが制限されたプライベートクラスターをデプロイする](private-clusters.md)」の考慮事項と追加の手順を確認してください
AWS Outposts、波長、またはローカルゾーンサブネット を選択する場合はクラスターの作成時にサブネットを渡さないようにします。

1. スタックが IAM リソースを作成する可能性があることを確認し、**[スタックの作成]** を選択してください。

1. スタックの作成が完了したら、コンソールで選択し、**[出力]** を選択してください。

1. 作成されたノードグループの [**NodeInstanceRole**] を記録します。これは、Amazon EKS Windows ノードを設定するときに必要になります。

 **ステップ 2: ノードを有効にしてクラスターに参加する** 

1. `aws-auth` `ConfigMap` がすでにあるかどうかを確認します。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. `aws-auth` `ConfigMap` が表示されている場合は必要に応じて更新してください。

   1. 編集する `ConfigMap` を開きます。

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 必要に応じて新しい `mapRoles` エントリを追加します。`rolearn` 値を、前の手順で記録した **[ノードインスタンス役割]** の値に設定します。

      ```
      [...]
      data:
        mapRoles: |
      - rolearn: <ARN of linux instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
          - rolearn: <ARN of windows instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
              - eks:kube-proxy-windows
      [...]
      ```

   1. ファイルを保存し、テキストエディタを終了します。

1. 「`Error from server (NotFound): configmaps "aws-auth" not found`」というエラーが表示されたら、ストック `ConfigMap` を適用してください。

   1. 設定マップをダウンロードします。

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm-windows.yaml
      ```

   1. `aws-auth-cm-windows.yaml` ファイルで、`rolearn` 値を、前の手順で記録した該当する **[ノードインスタンス役割]** 値に設定します。これを行うにはテキストエディタを使用するか、このサンプル値を置き換えて次のコマンドを実行してください。

      ```
      sed -i.bak -e 's|<ARN of linux instance role (not instance profile)>|my-node-linux-instance-role|' \
          -e 's|<ARN of windows instance role (not instance profile)>|my-node-windows-instance-role|' aws-auth-cm-windows.yaml
      ```
**重要**  
このファイルの他の行は変更しないでください。
Windows ノードと Linux ノードの両方に同じ IAM ロールを使用しないでください。

   1. 設定を適用します。このコマンドが完了するまで数分かかることがあります。

      ```
      kubectl apply -f aws-auth-cm-windows.yaml
      ```

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

   ```
   kubectl get nodes --watch
   ```

   `Ctrl`\$1`C` を入力して、シェルプロンプトに戻ります。
**注記**  
認可またはリソースタイプのエラーが発生した場合はトラブルシューティングトピックの「[許可されていないか、アクセスが拒否されました (`kubectl`)](troubleshooting.md#unauthorized)」を参照してください。

   ノードがクラスターに参加できない場合はトラブルシューティングの章にある「[ノードをクラスターに結合できません](troubleshooting.md#worker-node-fail)」を参照してください。

 **ステップ 3: その他のアクション** 

1. (オプション) [サンプルアプリケーション](sample-deployment.md)をデプロイして、クラスターと Windows ノードをテストします。

1. (オプション) **AmazonEKS\$1CNI\$1Policy** マネージド IAM ポリシー (`IPv4` クラスターがある場合) または *AmazonEKS\$1CNI\$1IPv6\$1Policy* (`IPv6` クラスターがある場合には[ユーザー自身が作成した](cni-iam-role.md#cni-iam-role-create-ipv6-policy)もの) が [Amazon EKS ノードの IAM ロール](create-node-role.md)にアタッチされている場合、代わりに Kubernetes `aws-node` サービスアカウントに関連付けた IAM ロールに割り当てることをお勧めします。詳細については、「[IRSA を使用するように Amazon VPC CNI プラグインを設定する](cni-iam-role.md)」を参照してください。

1. 次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
   + IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
   + クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

   詳細については「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

# セルフマネージドの Ubuntu Linux ノードを作成する
<a name="launch-node-ubuntu"></a>

**注記**  
マネージド型ノードグループでは、ユースケースにいくつかの利点がある場合があります。詳細については、「[マネージドノードグループを使用してノードライフサイクルを簡素化する](managed-node-groups.md)」を参照してください。

このトピックでは、[Amazon Elastic Kubernetes Service (EKS) ノード上で Ubuntu](https://cloud-images.ubuntu.com/aws-eks/) の Auto Scaling グループを起動するか、あるいは Amazon EKS クラスターに登録される [Amazon Elastic Kubernetes Service (EKS) ノード上で Ubuntu Pro](https://ubuntu.com/blog/ubuntu-pro-for-eks-is-now-generally-available) の Auto Scaling グループを起動する方法について説明します。EKS で動作する Ubuntu と Ubuntu Pro は、公式の Ubuntu Minimal LTS に基づいており、AWS と共同で開発されているカスタム AWS カーネルを搭載し、これまで特に EKS 向けに構築されています。Ubuntu Pro は、EKS 延長サポート期間、カーネルライブパッチ、FIPS の遵守、および無制限の Pro コンテナを実行する機能をサポートすることで、さらなるセキュリティの強化も図っています。

ノードがクラスターに参加したら、それらのノードにコンテナ化したアプリケーションをデプロイできるようになります。詳細については、「[Ubuntu on AWS](https://documentation.ubuntu.com/aws/en/latest/)」のドキュメントおよび `eksctl` ドキュメントの「[Custom AMI support](https://eksctl.io/usage/custom-ami-support/)」を参照してください。

**重要**  
Amazon EKS ノードは標準の Amazon EC2 インスタンスであり、通常の Amazon EC2 インスタンス価格に基づいて請求されます。詳細については「[Amazon EC2 料金](https://aws.amazon.com/ec2/pricing/)」を参照してください。
AWS Outposts 上の Amazon EKS 拡張クラスターで Ubuntu ノードを起動できますが、AWS Outposts 上のローカルクラスターでは起動できません。詳細については、「[AWS Outposts を使用して Amazon EKS をオンプレミスにデプロイする](eks-outposts.md)」を参照してください。
`x86` または Arm プロセッサを使用して Amazon EC2 インスタンスにデプロイできます。ただし、インスタンスに Inferentia チップがある場合は、先に [Neuron SDK](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/) をインストールしておく必要があります。

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

```
eksctl version
```

`eksctl` のインストールまたはアップグレードの手順については、 `eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。注意: この手順は、`eksctl` で作成されたクラスターでのみ機能します。

1. 次のコンテンツをデバイスにコピーします。`my-cluster` を自分のクラスター名に置き換えます。この名前には英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字はアルファベット文字である必要があります。また、100 文字より長くすることはできません。`ng-ubuntu` をノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。Arm インスタンスにデプロイするには、`m5.large` を Arm インスタンスタイプに置き換えます。`my-ec2-keypair-name` を、起動後に、SSH を使用してノードに接続するときに使用できる Amazon EC2 SSH キーペアの名前に置き換えます。Amazon EC2 キーペアをまだ持っていない場合は、AWS マネジメントコンソール で作成できます。詳細については、「Amazon EC2 ユーザーガイド」の「[Amazon EC2 キーペア](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)」を参照してください。残りのサンプル値はすべて独自の値に置き換えます。置き換えが完了したら、変更したコマンドを実行して `ubuntu.yaml` ファイルを作成します。
**重要**  
ノードグループを AWS Outposts、AWS Wavelength、または AWS Local Zone サブネットにデプロイする場合、クラスターの作成時に AWS Outposts、AWS Wavelength、または AWS Local Zone サブネットは渡さないでください。次の例では、サブネットを指定する必要があります。詳細については、`eksctl` ドキュメントの「[設定ファイルからノードグループを作成する](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)」と「[Config ファイルのスキーマ](https://eksctl.io/usage/schema/)」を参照してください。*region-code* を、クラスターのある AWS リージョンに置き換えます。

   ```
   cat >ubuntu.yaml <<EOF
   ---
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   
   metadata:
     name: my-cluster
     region: region-code
     version: '1.35'
   
   iam:
     withOIDC: true
   
   nodeGroups:
     - name: ng-ubuntu
       instanceType: m5.large
       desiredCapacity: 3
       amiFamily: Ubuntu2204
       iam:
          attachPolicyARNs:
             - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
             - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
             - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
             - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
       ssh:
           allow: true
           publicKeyName: my-ec2-keypair-name
   EOF
   ```

   Ubuntu Pro ノードグループを作成するには、`amiFamily` 値を `UbuntuPro2204` に変更します。

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

   ```
   eksctl create nodegroup --config-file=ubuntu.yaml
   ```

   出力例は次のとおりです。

   ノードの作成中に、複数の行が出力されます。出力の最後の行は次のサンプル行が表示されます。

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (オプション) [サンプルアプリケーション](sample-deployment.md)をデプロイして Ubuntu ノードをテストします。

1. 次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
   + IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
   + クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

   詳細については「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

# クラスターのためにセルフマネージドノードを更新する
<a name="update-workers"></a>

Amazon EKS に最適化された最新の AMI がリリースされたら、セフルマネージド型ノードグループのノードを新しい AMI に置き換えることを検討してください。同様に、Amazon EKS クラスターの Kubernetes バージョンを更新した場合は、ノードを更新して、同じ Kubernetes バージョンのノードを使用します。

**重要**  
このトピックでは、セルフマネージド型ノードのノードの更新について説明します。[マネージドノードグループ](managed-node-groups.md)を使用している場合は、「[クラスターのためにマネージドノードグループを更新する](update-managed-node-group.md)」を参照してください。

クラスター内のセルフマネージド型ノードグループを更新して新しい AMI を使用するには、2 つの基本的な方法があります。

 **[アプリケーションを新しいノードグループに移行する](migrate-stack.md)**   
新しいノードグループを作成し、Pod をそのグループに移行します。新しいノードグループへの移行は、既存の AWS CloudFormation スタックで AMI ID を単に更新するよりも適切です。これは、移行プロセスが古いノードグループを `NoSchedule` として[テイント](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)に設定し、新しいスタックが既存の Pod ワークロードを受け入れる準備ができた後にそのノードをドレインするためです。

 **[AWS CloudFormation ノードスタックを更新する](update-stack.md)**   
既存のノードグループの AWS CloudFormation スタックを更新して、新しい AMI が使用されるようにします。この方法は、`eksctl` を使用して作成されたノードグループではサポートされていません。

# アプリケーションを新しいノードグループに移行する
<a name="migrate-stack"></a>

このトピックは、新しいノードグループを作成し、既存のアプリケーションを新しいグループに適切に移行し、クラスターから古いノードグループを削除する方法について説明します。新しいノードグループに移行するには、`eksctl` または AWS マネジメントコンソール を使用します。
+  [`eksctl`](#eksctl_migrate_apps) 
+  [AWS マネジメントコンソール および AWS CLI](#console_migrate_apps) 

## `eksctl`
<a name="eksctl_migrate_apps"></a>

 **`eksctl` を使用してアプリケーションを新しいノードグループに移行する** 

eksctl を移行に使用する方法の詳細については、`eksctl` ドキュメントの「[管理対象外のノードグループ](https://eksctl.io/usage/nodegroup-unmanaged/)」を参照してください。

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

```
eksctl version
```

`eksctl` のインストールまたはアップグレードの手順については、`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。

**注記**  
この手順は、`eksctl` で作成されたクラスターとノードグループに対してのみ機能します。

1. *my-cluster* をクラスター名に置き換えて、既存のノードグループの名前を取得します。

   ```
   eksctl get nodegroups --cluster=my-cluster
   ```

   出力例は次のとおりです。

   ```
   CLUSTER      NODEGROUP          CREATED               MIN SIZE      MAX SIZE     DESIRED CAPACITY     INSTANCE TYPE     IMAGE ID
   default      standard-nodes   2019-05-01T22:26:58Z  1             4            3                    t3.medium         ami-05a71d034119ffc12
   ```

1. 次のコマンドを使用して、`eksctl` で新しいノードグループを起動します。コマンドのすべての*サンプル値*を独自の値に置き換えます。バージョン番号をお使いのコントロールプレーンの Kubernetes バージョンよりも新しいものにすることはできません。また、コントロールプレーンの Kubernetes バージョンより 3 つ以上前のマイナーなバージョンにすることもできません。コントロールプレーンと同じバージョンを使用することをお勧めします。

   次の条件が true の場合、IMDS への Pod アクセスをブロックすることをお勧めします。
   + IAM ロールをすべての Kubernetes サービスアカウントに割り当てることによって、必要最小限のアクセス許可のみを Pod に付与しようとしている。
   + クラスター内の Pod が、現在の AWS リージョンの取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

     詳細については「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。

     Pod から IMDS へのアクセスをブロックするには、次のコマンドに `--disable-pod-imds` オプションを追加します。
**注記**  
使用可能なフラグとその説明については、「https://eksctl.io/」を参照してください。

   ```
   eksctl create nodegroup \
     --cluster my-cluster \
     --version 1.35 \
     --name standard-nodes-new \
     --node-type t3.medium \
     --nodes 3 \
     --nodes-min 1 \
     --nodes-max 4 \
     --managed=false
   ```

1. 前のコマンドが完了したら、次のコマンドを使用して、すべてのノードが `Ready` 状態になったことを確認します。

   ```
   kubectl get nodes
   ```

1. 次のコマンドを使用して、元のノードグループを削除します。このコマンドで、すべての*サンプル値*を自分のクラスター名とノードグループ名に置き換えます。

   ```
   eksctl delete nodegroup --cluster my-cluster --name standard-nodes-old
   ```

## AWS マネジメントコンソール および AWS CLI
<a name="console_migrate_apps"></a>

 **AWS マネジメントコンソール と AWS CLI を使用してアプリケーションを新しいノードグループに移行する** 

1. 新しいノードグループを起動するには、「[セルフマネージド Amazon Linux ノードを作成する](launch-workers.md)」で説明されている手順に従います。

1. スタックの作成が完了したら、コンソールで選択し、**[出力]** を選択してください。

1.  作成されたノードグループの **NodeInstanceRole** を記録します。Amazon EKS ノードをクラスターに追加するには、これが必要です。
**注記**  
追加の IAM ポリシーを古いノードグループの IAM ロールにアタッチした場合は、この同じポリシーを新しいノードグループの IAM ロールにアタッチして、新しいグループでその機能を管理します。これは、たとえば、Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) のアクセス許可を追加した場合に適用されます。

1. 相互通信できるように、両方のノードグループのセキュリティグループを更新します。詳細については、「[クラスターの Amazon EKS セキュリティグループ要件を表示する](sec-group-reqs.md)」を参照してください。

   1. 両方のノードグループのセキュリティグループ ID を記録します。これは、AWS CloudFormation スタックからの出力に、**NodeSecurityGroup** の値として表示されます。

      次の AWS CLI コマンドを使用して、スタック名からセキュリティグループ ID を取得します。これらのコマンドで、`oldNodes` は、古いノードスタックの AWS CloudFormation スタック名、`newNodes` は、移行先のスタックの名前です。各*サンプル値*は独自の値に置き換えます。

      ```
      oldNodes="old_node_CFN_stack_name"
      newNodes="new_node_CFN_stack_name"
      
      oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      ```

   1. 互いにトラフィックを受け入れるように、各ノードのセキュリティグループに進入ルールを追加します。

      以下の AWS CLI コマンドでは、他のセキュリティグループからのすべてのプロトコルのトラフィックをすべて許可するインバウンドルールを各セキュリティグループに追加します。この設定により、ワークロードを新しいグループに移行している際に、各ノードグループ内の Pod が相互に通信できるようになります。

      ```
      aws ec2 authorize-security-group-ingress --group-id $oldSecGroup \
      --source-group $newSecGroup --protocol -1
      aws ec2 authorize-security-group-ingress --group-id $newSecGroup \
      --source-group $oldSecGroup --protocol -1
      ```

1. `aws-auth` configmap を編集して、新しいノードインスタンスロールを RBAC にマッピングします。

   ```
   kubectl edit configmap -n kube-system aws-auth
   ```

   新しいノードグループの新しい `mapRoles` エントリを追加します。

   ```
   apiVersion: v1
   data:
     mapRoles: |
       - rolearn: ARN of instance role (not instance profile)
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes>
       - rolearn: arn:aws:iam::111122223333:role/nodes-1-16-NodeInstanceRole-U11V27W93CX5
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes
   ```

   *インスタンスロールの ARN (インスタンスプロファイルではない)* スニペットを、[前の手順](#node-instance-role-step)で記録した **NodeInstanceRole** の値に置き換えます。次に、更新された configmap を適用するには、ファイルを保存して閉じます。

1. ノードのステータスを監視し、新しいノードがクラスターに結合され、`Ready` ステータスになるまで待機します。

   ```
   kubectl get nodes --watch
   ```

1. (オプション) [Kubernetes Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) を使用している場合は、スケーリングアクションの競合を回避するために、デプロイをゼロ (0) レプリカにスケールダウンします。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
   ```

1. 以下のコマンドを使用して、`NoSchedule` で削除する各ノードをテイントに設定します。その目的は、ノードを置き換えたときにそのノードで新しい Pod がスケジュールまたは再スケジュールされないようにすることです。詳細については、Kubernetes ドキュメントの「[テイントと容認](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)」を参照してください。

   ```
   kubectl taint nodes node_name key=value:NoSchedule
   ```

   ノードを新しい Kubernetes バージョンにアップグレードする場合は、次のコードスニペットを使用して、特定の Kubernetes バージョン (この場合は `1.33`) のすべてのノードを識別してテイントに設定できます。バージョン番号をお使いのコントロールプレーンの Kubernetes バージョンよりも新しいものにすることはできません。また、コントロールプレーンの Kubernetes バージョンより 3 つ以上前のマイナーなバージョンにすることもできません。コントロールプレーンと同じバージョンを使用することをお勧めします。

   ```
   K8S_VERSION=1.33
   nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}")
   for node in ${nodes[@]}
   do
       echo "Tainting $node"
       kubectl taint nodes $node key=value:NoSchedule
   done
   ```

1.  クラスターの DNS プロバイダーを決定します。

   ```
   kubectl get deployments -l k8s-app=kube-dns -n kube-system
   ```

   出力例は次のとおりです。このクラスターでは、DNS 解決に CoreDNS を使用していますが、クラスターからは `kube-dns` が返される場合もあります。

   ```
   NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   coredns   1         1         1            1           31m
   ```

1. 現在のデプロイメントで実行しているレプリカが 2 つ未満の場合は、そのデプロイメントを 2 つのレプリカにスケールアウトします。前のコマンドの出力が kubedns を返していた場合は、*coredns* を `kubedns` に置き換えます。

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. 次のコマンドを使用して、クラスターから削除する各ノードをドレーンします。

   ```
   kubectl drain node_name --ignore-daemonsets --delete-local-data
   ```

   ノードを新しい Kubernetes バージョンにアップグレードする場合は、次のコードスニペットを使用して、特定の Kubernetes バージョン (この場合は *1.33*) のすべてのノードを識別してドレインします。

   ```
   K8S_VERSION=1.33
   nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}")
   for node in ${nodes[@]}
   do
       echo "Draining $node"
       kubectl drain $node --ignore-daemonsets --delete-local-data
   done
   ```

1. 古いノードのドレーンが完了したら、以前承認したセキュリティグループのインバウンドルールを取り消します。次に、AWS CloudFormation スタックを削除してインスタンスを終了してください。
**注記**  
さらに IAM ポリシーを古いノードグループの IAM ロールにアタッチした場合 ([Kubernetes Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) に対するアクセス許可を追加する場合など) は、ロールからその追加ポリシーをデタッチしてから、AWS CloudFormation スタックを削除できます。

   1. 先ほどノードのセキュリティグループ用に作成したインバウンドルールを取り消します。これらのコマンドで、`oldNodes` は、古いノードスタックの AWS CloudFormation スタック名、`newNodes` は、移行先のスタックの名前です。

      ```
      oldNodes="old_node_CFN_stack_name"
      newNodes="new_node_CFN_stack_name"
      
      oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      aws ec2 revoke-security-group-ingress --group-id $oldSecGroup \
      --source-group $newSecGroup --protocol -1
      aws ec2 revoke-security-group-ingress --group-id $newSecGroup \
      --source-group $oldSecGroup --protocol -1
      ```

   1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

   1. 古いノードスタックを選択します。

   1. **[削除]** を選択します。

   1. **[スタックの削除]** 確認ダイアログボックスで、**[スタックを削除]** をクリックします。

1. `aws-auth` configmap を編集して、RBAC から古いノードインスタンスロールを削除します。

   ```
   kubectl edit configmap -n kube-system aws-auth
   ```

   古いノードグループの `mapRoles` エントリを削除します。

   ```
   apiVersion: v1
   data:
     mapRoles: |
       - rolearn: arn:aws:iam::111122223333:role/nodes-1-16-NodeInstanceRole-W70725MZQFF8
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes
       - rolearn: arn:aws:iam::111122223333:role/nodes-1-15-NodeInstanceRole-U11V27W93CX5
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes>
   ```

   更新された configmap を適用するには、ファイルを保存して閉じます。

1. (オプション) Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) を使用している場合は、デプロイのスケーリングを 1 レプリカに戻します。
**注記**  
必要に応じて、新しい Auto Scaling グループにタグ (`k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/my-cluster` など) を付け、新しくタグ付けした Auto Scaling グループを参照するように、Cluster Autoscaler デプロイのコマンドを更新する必要があります。詳細については、「[AWS の Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/cluster-autoscaler-release-1.3/cluster-autoscaler/cloudprovider/aws)」を参照してください。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
   ```

1. (オプション) 最新バージョンの [Amazon VPC CNI Plugin for Kubernetes](https://github.com/aws/amazon-vpc-cni-k8s) を使用していることを確認します。サポートされている最新のインスタンスタイプを利用するにはCNI のバージョンを更新することが必要になる場合があります。詳細については、「[Amazon VPC CNI を使用して Pod に IP を割り当てる](managing-vpc-cni.md)」を参照してください。

1. クラスターが DNS 解決 ([[migrate-determine-dns-step]](#migrate-determine-dns-step) を参照) に `kube-dns` を使用している場合は、`kube-dns` デプロイを 1 レプリカにスケールインします。

   ```
   kubectl scale deployments/kube-dns --replicas=1 -n kube-system
   ```

# AWS CloudFormation ノードスタックを更新する
<a name="update-stack"></a>

このトピックは、新しい AMI を使用して既存の AWS CloudFormation セルフマネージド型ノードスタックを更新する方法について説明します。この手順を使用して、クラスターの更新後にノードを新しいバージョンの Kubernetes に更新することができます。それ以外の場合は、Kubernetes の既存バージョン用の Amazon EKS に最適化された最新の AMI に更新することができます。

**重要**  
このトピックでは、セルフマネージド型ノードのノードの更新について説明します。「[マネージドノードグループを使用してノードライフサイクルを簡素化する](managed-node-groups.md)」方法の詳細については、「[クラスターのためにマネージドノードグループを更新する](update-managed-node-group.md)」を参照してください。

最新のデフォルトの Amazon EKS ノード AWS CloudFormation テンプレートは、古い AMI を一度に 1 つずつ削除する前に、新しい AMI を使用してインスタンスをクラスターに起動するように設定されています。この設定により、ローリング更新中にクラスター内で Auto Scaling グループのアクティブなインスタンスが常に必要数確保されるようになります。

**注記**  
この方法は、`eksctl` を使用して作成されたノードグループではサポートされていません。`eksctl` を使用してクラスターまたはノードグループを作成した場合は、「[アプリケーションを新しいノードグループに移行する](migrate-stack.md)」を参照してください。

1. クラスターの DNS プロバイダーを決定します。

   ```
   kubectl get deployments -l k8s-app=kube-dns -n kube-system
   ```

   出力例は次のとおりです。このクラスターでは、DNS 解決に CoreDNS を使用していますが、クラスターからは `kube-dns` が返される場合があります。使用しているバージョンの `kubectl` によって、出力が異なる場合があります。

   ```
   NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   coredns   1         1         1            1           31m
   ```

1. 現在のデプロイメントで実行しているレプリカが 2 つ未満の場合は、そのデプロイメントを 2 つのレプリカにスケールアウトします。前のコマンドの出力が kubedns を返していた場合は、*coredns* を `kube-dns` に置き換えます。

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. (オプション) [Kubernetes Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) を使用している場合は、スケーリングアクションの競合を回避するために、デプロイをゼロ (0) レプリカにスケールダウンします。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
   ```

1.  現在のノードグループのインスタンスタイプと必要なインスタンス数を決定します。グループの AWS CloudFormation テンプレートを更新する場合は、後でこれらの値を入力します。

   1. Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。

   1. 左ナビゲーションペインの **[Launch Configurations]** (起動設定) を選択し、既存のノードの起動設定のインスタンスタイプを書き留めます。

   1. 左ナビゲーションペインの **[Auto Scaling]** (グループ) を選択し、既存の Auto Scaling グループのノードの、インスタンスの **[Desired]** (必要) 数を書き留めます。

1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

1. ノードグループスタックを選択し、[**更新**] を選択します。

1. **[Replace current template]** (現在のテンプレートを置き換える) を選択し、**Amazon S3 URL** を選択します。

1. **Amazon S3 URL** で、ノードの AWS CloudFormation テンプレートの最新バージョンを使用していることを確認するために以下の URL をテキストエリアに貼り付けます。続いて、**[次へ]** を選択します。

   ```
   https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
   ```

1. **[Specify stack details]** (スタックの詳細の指定) ページで、以下のパラメータを指定し、**[Next]** (次へ) を選択します。
   +  **[NodeAutoScalingGroupDesiredCapacity]** – [前のステップ](#existing-worker-settings-step)で記録した必要なインスタンス数を入力します。または、スタック更新時にスケーリングする必要のある新しいノード数を入力します。
   +  **NodeAutoScalingGroupMaxSize** - ノードの Auto Scaling グループがスケールアウトする最大ノード数を入力します。この値は、必要な容量よりも少なくとも 1 ノード多い必要があります。これは、更新時にノード数を減らさずにノードのローリング更新を実行できるようにするためです。
   +  **NodeInstanceType** — [前のステップ](#existing-worker-settings-step)で記録したインスタンスタイプを選択します。または、ノードに別のインスタンスタイプを選択します。異なるインスタンスタイプを選択する前に、「[最適な Amazon EC2 ノードインスタンスタイプを選択する](choosing-instance-type.md)」を確認してください。各 Amazon EC2 インスタンスタイプは最大数の Elastic Network Interface (ネットワークインターフェイス) をサポートし、各ネットワークインターフェイスは最大数の IP アドレスをサポートします。ワーカーノードと Pod には、それぞれ IP アドレスが割り当てられています。そのため、各 Amazon EC2 ノードで実行する Pod の最大数をサポートするインスタンスタイプを選択することが重要です。インスタンスタイプごとにサポートされるネットワークインターフェイスと IP アドレスのリストについては、「[各インスタンスタイプのネットワークインターフェイスごとの IP アドレス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)」を参照してください。例えば、`m5.large` インスタンスタイプは、ワーカーノードと Pod に対して最大 30 の IP アドレスをサポートします。
**注記**  
最新バージョンの [Amazon VPC CNI plugin for Kubernetes](https://github.com/aws/amazon-vpc-cni-k8s) でサポートされているインスタンスタイプは、GitHub 上の [vpc\$1ip\$1resource\$1limit.go](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go) に示されています。サポートされている最新のインスタンスタイプを利用するには、Amazon VPC CNI Plugin for Kubernetes のバージョンを更新することが必要になる場合があります。詳細については、「[Amazon VPC CNI を使用して Pod に IP を割り当てる](managing-vpc-cni.md)」を参照してください。
**重要**  
AWS リージョンによっては利用できないインスタンスタイプがあります。
   +  [**NodeImageIdSSMParam**]: 更新する AMI ID の Amazon EC2 Systems Manager パラメータです。次の値では、Kubernetes バージョン `1.35` 用の最新の Amazon EKS 最適化 AMI が使用されています。

     ```
     /aws/service/eks/optimized-ami/1.35/amazon-linux-2/recommended/image_id
     ```

     *1.35* は、同一の [platform-version](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html) に置き換えることができます。または、コントロールプレーンで実行されている Kubernetes バージョンより 1 つ前までのバージョンである必要があります。ノードは、コントロールプレーンと同じバージョンにしておくことをお勧めします。*amazon-linux-2* を別の AMI タイプに置き換えることもできます。詳細については、「[推奨 Amazon Linux AMI ID を取得する](retrieve-ami-id.md)」を参照してください。
**注記**  
Amazon EC2 Systems Manager パラメータを使用すると、AMI ID を検索して指定することなく、後でノードを更新できます。AWS CloudFormation スタックがこの値を使用している場合、スタックの更新によって常に、指定された Kubernetes バージョンで推奨される最新の Amazon EKS 最適化 AMI が起動されます。これは、テンプレートの値を変更しない場合も同様です。
   +  **NodeImageId** - 独自のカスタム AMI を使用するには、使用する AMI の ID を入力します。
**重要**  
この値は、**NodeImageIdSSMParam** に指定されたすべての値を上書きします。**NodeImageIdSSMParam** 値を使用する場合は、 **NodeImageId** の値が空白であることを確認します。
   +  **[DisableIMDSv1]** – 各ノードは、デフォルトでインスタンスメタデータサービスバージョン 1 (IMDSv1) および IMDSv2 をサポートします。ただし、IMDSv1 を無効にできます。ノードグループでスケジュールされているノードまたは Pod で IMDSv1 を使用しない場合は、**[true]** を選択します。IDMS の詳細については「[インスタンスメタデータサービスの設定](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)」を参照してください。サービスアカウントの IAM ロールを実装した場合は、AWS のサービスへのアクセスを必要とするすべての Pod に対し、必要なアクセス許可を直接割り当てます。これにより、クラスター内の Pod は、現在の AWS リージョンの取得など、その他の理由で IMDS へのアクセスを必要としません。次に、ホストネットワークを使用しない Pod の IMDSv2 へのアクセスを無効にすることもできます。詳細については、[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) を参照してください。

1. (オプション) **オプション** ページで、スタックリソースをタグ付けします。[**次へ**] を選択します。

1. [**確認**] ページで情報を確認し、スタックで IAM リソースを作成することを承認して、[**スタックの更新**] を選択します。
**注記**  
クラスター内の各ノードの更新には数分かかります。すべてのノードの更新が完了するのを待ってから、次の手順を実行します。

1. クラスターの DNS プロバイダーが `kube-dns` の場合は、`kube-dns` デプロイを 1 レプリカにスケールインします。

   ```
   kubectl scale deployments/kube-dns --replicas=1 -n kube-system
   ```

1. (オプション) Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) を使用している場合は、デプロイのスケーリングを目的のレプリカ数に戻します。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
   ```

1. (オプション) 最新バージョンの [Amazon VPC CNI Plugin for Kubernetes](https://github.com/aws/amazon-vpc-cni-k8s) を使用していることを確認します。サポートされている最新のインスタンスタイプを利用するには、Amazon VPC CNI Plugin for Kubernetes のバージョンを更新することが必要になる場合があります。詳細については、「[Amazon VPC CNI を使用して Pod に IP を割り当てる](managing-vpc-cni.md)」を参照してください。

# AWS Fargate を使用してコンピューティング管理を簡素化する
<a name="fargate"></a>

このトピックでは、Amazon EKS を使用して AWS Fargate で Kubernetes Pod を実行する方法について説明します。Fargate は、[コンテナ](https://aws.amazon.com/what-are-containers)に適切なサイズのコンピューティング能力をオンデマンドで提供するテクノロジーです。Fargate を使用すると、コンテナを実行するために仮想マシンのグループをプロビジョニング、設定、スケールする必要がありません。これにより、サーバータイプの選択、ノードグループをスケールするタイミングの決定、クラスターのパッキングの最適化を行う必要がなくなります。

Fargate で起動する Pod と、[Fargate プロファイル](fargate-profile.md)での実行方法を制御できます。Fargate プロファイルは Amazon EKS クラスターの一部として定義されています。Amazon EKS は、Kubernetes が提供するアップストリームの拡張可能なモデルを使用して AWS により構築されたコントローラーを使用して、Kubernetes と Fargate を統合します。これらのコントローラーは、Amazon EKS マネージド Kubernetes コントロールプレーンの一部として実行され、ネイティブ Kubernetes Pod を Fargate にスケジューリングします。Fargate コントローラーには、いくつかの変更と検証アドミッションコントローラーに加えて、デフォルトの Kubernetes スケジューラーとともに実行される新しいスケジューラが含まれています。Fargate で実行する条件を満たす Pod を起動すると、クラスターで実行されている Fargate コントローラーは Pod を認識し、更新し、Fargate にスケジューリングします。

このトピックでは、Fargate で実行されている Pod のさまざまなコンポーネントについて説明し、Amazon EKS で Fargate を使用する際の特別な考慮事項を示します。

## AWS Fargate 考慮事項
<a name="fargate-considerations"></a>

Amazon EKS での Fargate の使用についての考慮事項を以下に示します。
+ Fargate で実行される各 Pod には、独自のコンピューティング境界があります。基本となるカーネル、CPU リソース、メモリリソース、または Elastic Network Interface を別のPod と共有しません。
+ Network Load Balancer と Application Load Balancer (ALBs) は、IPターゲットでのみ Fargate で使用できます。詳細については、「[ネットワークロードバランサーを作成する](network-load-balancing.md#network-load-balancer)」および「[Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする](alb-ingress.md)」を参照してください。
+ Fargate 公開サービスは、ターゲットタイプの IP モードでのみ実行され、ノード IP モードでは実行されません。マネージド型ノードで実行されているサービスと Fargate で実行されているサービスからの接続を確認するためのおすすめの方法は、サービス名を使用して接続することです。
+ Fargate で実行するには、ポッドがスケジューリングされた時点で Fargate プロファイルと一致する必要があります。Fargate プロファイルに一致しない Pod は `Pending` としてスタックする可能性があります。一致する Fargate プロファイルが存在する場合、Fargate に再スケジューリングするために作成した保留中の Pod を削除できます。
+ デーモンセットは Fargate ではサポートされていません。アプリケーションにデーモンが必要な場合は、そのデーモンを Pod のサイドカーコンテナとして実行するように再設定します。
+ 特権を持つコンテナは Fargate ではサポートされていません。
+ Fargate で実行されている Pod は、`HostPort` または `HostNetwork` を Pod マニフェストに指定できません。
+ Fargate Pod の場合、デフォルトの `nofile` および `nproc` のソフトリミットは 1024、ハードリミットは 65535 です。
+ GPU は現在、Fargate では使用できません。
+ Fargate で実行されているポッドは、プライベートサブネットでのみサポートされています (AWS のサービスへの NAT ゲートウェイアクセスができますが、インターネットゲートウェイへの直接ルーティングはできません)。そのため、クラスターの VPC ではプライベートサブネットを使用できるようにする必要があります。アウトバウンドインターネットアクセスのないクラスターについては、「」を参照してください[インターネットアクセスが制限されたプライベートクラスターをデプロイする](private-clusters.md)
+ 「[Vertical Pod Autoscaler でポッドリソースを調整する](vertical-pod-autoscaler.md)」を使用して Fargate Pod の CPU とメモリの適切な初期サイズを設定し、「[Horizontal Pod Autoscaler を使用してポッドデプロイをスケールする](horizontal-pod-autoscaler.md)」を使用してそれらの Pod をスケールできます。Vertical Pod Autoscaler で、より大きい CPU とメモリの組み合わせを持つ Fargate に Pod を自動的に再デプロイする場合は、正しい機能を確保するため、Vertical Pod Autoscaler のモードを `Auto` または `Recreate` に設定します。詳細については、GitHub で [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#quick-start) のドキュメントを参照してください。
+ VPC で DNS 解決と DNS ホスト名を有効にする必要があります。詳細については、「[VPC の DNS サポートを更新する](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)」を参照してください。
+ Amazon EKS Fargate は、仮想マシン (VM) 内の各ポッドを分離することで、Kubernetes アプリケーションの多重防御を追加します。この VM 境界は、コンテナエスケープが発生した場合に他のポッドが使用するホストベースのリソースへのアクセスを防ぎます。これは、コンテナ化されたアプリケーションを攻撃し、コンテナ外のリソースにアクセスする一般的な方法です。

  Amazon EKS を使用しても、[責任共有モデル](security.md)に基づくお客様の責任は変わりません。クラスターのセキュリティとガバナンスのコントロールの設定について、慎重に検討する必要があります。アプリケーションを分離する最も安全な方法は、常に別のクラスターで実行することです。
+ Fargate プロファイルでは、VPC セカンダリ CIDR ブロックからのサブネットの指定がサポートされています。セカンダリ CIDR ブロックを指定することもできます。サブネットの使用できる IP アドレスの数は限られています。結果的に、クラスター内に作成できる Pod の数も制限されます。Pod に別のサブネットを使用することで、使用可能な IP アドレスの数を増やすことができます。詳細については、「[IPv4 CIDR ブロックの VPC への追加](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-resize)」を参照してください。
+ Amazon EC2 インスタンスメタデータサービス (IMDS) は、Fargate ノードにデプロイされた Pod では使用できません。IAM 認証情報を必要とする Fargate にデプロイされた Pod がある場合は、[サービスアカウントの IAM ロール](iam-roles-for-service-accounts.md)を使用して Pod に割り当てます。Pod が IMDS を通じて利用可能な他の情報にアクセスする必要がある場合は、この情報を Pod 仕様にハードコーディングする必要があります。これには、Pod がデプロイされる AWS リージョンまたはアベイラビリティーゾーンが含まれます。
+ AWS Outposts、AWS Wavelength、または AWS Local Zones に Fargate Pod をデプロイすることはできません。
+ Amazon EKS は定期的に Fargate Pod にパッチを適用して安全に保つ必要があります。影響を軽減する方法で更新を試みますが、Pod のエビクションが正常に行われなかった場合、Pod を削除しなければならない場合があります。中断を最小限に抑えるために行えるアクションがいくつかあります。詳細については、「[AWS Fargate OS パッチ適用イベントのアクションを設定する](fargate-pod-patching.md)」を参照してください。
+ [Amazon VPC CNI plugin for Amazon EKS](https://github.com/aws/amazon-vpc-cni-plugins) は、Fargate ノードにインストールされています。Fargate ノードでは [Amazon EKS クラスターの代替 CNI プラグイン](alternate-cni-plugins.md)を使用することはできません。
+ Fargate 上で実行される Pod は、ドライバーの手動インストールステップなしで、Amazon EFS ファイルシステムを自動的にマウントします。Fargate ノードでは動的永続ボリュームプロビジョニングを使用できませんが、静的プロビジョニングを使用することはできます。
+ Amazon EKS は Fargate Spot をサポートしていません。
+ Amazon EBS ボリュームを Fargate Pod にマウントすることはできません。
+ Amazon EBS CSI コントローラーは Fargate ノードで実行できますが、Amazon EBS CSI ノード DaemonSet は Amazon EC2 インスタンスでのみ実行できます。
+ [Kubernetes Job](https://kubernetes.io/docs/concepts/workloads/controllers/job/) が `Completed` または `Failed` とマークされた後も、Job が作成した Pod は通常存在し続けます。この動作によりログと結果を表示できますが、Fargate を使用する場合、その後 Job をクリーンアップしないとコストが発生します。

  Job が完了または失敗した後に、関連する Pod を自動的に削除するには、有効期限 (TTL) コントローラーを使用して期間を指定できます。次の例では、Job マニフェストで `.spec.ttlSecondsAfterFinished` を指定する方法を示しています。

  ```
  apiVersion: batch/v1
  kind: Job
  metadata:
    name: busybox
  spec:
    template:
      spec:
        containers:
        - name: busybox
          image: busybox
          command: ["/bin/sh", "-c", "sleep 10"]
        restartPolicy: Never
    ttlSecondsAfterFinished: 60 # <-- TTL controller
  ```

## Fargate 比較テーブル
<a name="_fargate_comparison_table"></a>


| 条件 |  AWS Fargate | 
| --- | --- | 
|  [AWS Outposts](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html) にデプロイ可能   |  いいえ  | 
|  [AWS Local Zone](local-zones.md) にデプロイ可能   |  いいえ  | 
|  Windows を必要とするコンテナを実行できる  |  いいえ  | 
|  Linux を必要とするコンテナを実行可能  |  はい  | 
|  インフェクエンティア チップを必要とするワークロードを実行可能  |  いいえ  | 
|  GPU を必要とするワークロードを実行可能  |  いいえ  | 
|  Arm プロセッサを必要とするワークロードを実行可能  |  いいえ  | 
|  AWS [Bottlerocket](https://aws.amazon.com/bottlerocket/) を実行可能   |  いいえ  | 
|  Pod は、カーネルランタイム環境を他の Pod と共有します。  |  いいえ: 各 Pod には専用のカーネルがあります。  | 
|  ポッドはCPU、メモリ、ストレージ、およびネットワークリソースを他のポッドと共有します。  |  いいえ — 各 Pod には専用のリソースがあり、リソース使用率を最大化するために個別にサイズ設定できます。  | 
|  Pod 仕様で要求されているよりも多くのハードウェアとメモリを、Pod が使用できます。  |  いいえ: より大きな vCPU およびメモリー設定を使用して、Pod を再デプロイできます。  | 
|  Amazon EC2 インスタンスをデプロイおよび管理する必要がある  |  いいえ  | 
|  Amazon EC2 インスタンスのオペレーティングシステムの保護、保守、パッチ適用を行う必要がある  |  いいえ  | 
|  ノードをデプロイする時に、追加の [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引数 などのブートストラップ引数を提供できます。  |  いいえ  | 
|  ノードに割り当てられた IP アドレスとは異なる CIDR ブロックから、IP アドレスを Pod に割り当てることができます。  |  いいえ  | 
|  ノードに SSH 接続可能  |  いいえ – SSH 接続を行うノードホストオペレーティングシステムはありません。  | 
|  独自のカスタム AMI をノードにデプロイ可能  |  いいえ  | 
|  独自のカスタム CNI をノードにデプロイ可能  |  いいえ  | 
|  ノード AMI を自分で更新する必要がある  |  いいえ  | 
|  ノードの Kubernetes バージョンを自分で更新する必要があります。  |  いいえ: ノードを管理しません。  | 
|  Pod で Amazon EBS ストレージを使用可能  |  いいえ  | 
|  Pod で Amazon EFS ストレージを使用可能  |   [あり](efs-csi.md)   | 
|  Pod で Amazon FSx for Lustre ストレージを使用可能  |  いいえ  | 
|  Network Load Balancer をサービスに使用可能  |  はい、「[Network Load Balancer を作成する](network-load-balancing.md#network-load-balancer)」を使用する場合   | 
|  ポッドはパブリックサブネットで実行可能  |  いいえ  | 
|  それぞれの Pod に、異なる VPC セキュリティグループを割り当て可能  |  はい  | 
|  Kubernetes DaemonSets を実行可能  |  いいえ  | 
|  Pod マニフェストで `HostPort` および `HostNetwork` をサポートします  |  いいえ  | 
|   AWS が利用可能なリージョン  |   [一部の Amazon EKS 対応リージョン](https://docs.aws.amazon.com/general/latest/gr/eks.html)   | 
|  Amazon EC2 専有ホストでコンテナを実行できます  |  いいえ  | 
|  料金  |  個々のFargate メモリとCPU構成のコスト。各 Pod には、独自のコストがあります。詳細については、「[AWS Fargate の料金](https://aws.amazon.com/fargate/pricing/)」を参照してください。  | 

# クラスターの AWS Fargate の使用を開始する
<a name="fargate-getting-started"></a>

このトピックでは、Amazon EKS クラスターを使用して AWS Fargate で Pod の実行を開始する方法について説明します。

CIDR ブロックを使用してクラスターのパブリックエンドポイントへのアクセスを制限する場合は、プライベートエンドポイントアクセスも有効にすることをお勧めします。こうすることで、Fargate Pod がクラスターと通信できるようになります。プライベートエンドポイントが有効になっていない場合、パブリックアクセスに指定する CIDR ブロックに、VPC からのアウトバウンドソースを含める必要があります。詳細については、「[クラスター API サーバーエンドポイント](cluster-endpoint.md)」を参照してください。

**前提条件**  
既存のクラスター。既存の Amazon EKS クラスターがなければ、[Amazon EKS の使用を開始する](getting-started.md) を参照してください。

## ステップ 1: 既存のノードが Fargate Pod と通信できることを確認する
<a name="fargate-gs-check-compatibility"></a>

ノードのない新しいクラスター、またはマネージド型ノードグループ ([マネージドノードグループを使用してノードライフサイクルを簡素化する](managed-node-groups.md) を参照) のみを持つクラスターを使用している場合は、「[ステップ 2: Fargate Pod 実行ロールを作成する](#fargate-sg-pod-execution-role)」に進みます。

既にそれに関連付けられているノードがある既存のクラスターで作業していると仮定します。これらのノードの Pod が Fargate で実行されている Pod と自由に通信できることを確認する必要があります。Fargate で実行されている Pod は、関連付けられているクラスターのクラスターセキュリティグループを使用するように自動的に設定されます。クラスター内の既存のノードが、クラスターセキュリティグループとの間でトラフィックを送受信できることを確認します。マネージドノードグループもクラスターセキュリティグループを使用するように自動的に設定されるため、この互換性を変更または確認する必要はありません (「[マネージドノードグループを使用してノードライフサイクルを簡素化する](managed-node-groups.md)」を参照)。

`eksctl` または Amazon EKS マネージド型 AWS CloudFormation テンプレートで作成された既存のノードグループの場合、クラスターセキュリティグループをノードに手動で追加できます。または、ノードグループの Auto Scaling グループ起動テンプレートを変更して、クラスターセキュリティグループをインスタンスにアタッチすることもできます。詳細については、Amazon VPC ユーザーガイドの[インスタンスのセキュリティグループを変更する](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SG_Changing_Group_Membership)を参照してください。

AWS マネジメントコンソール で、クラスターの **[Networking]** (ネットワーク) セクションでクラスターのクラスターセキュリティグループを確認できます。これを行うには、次の AWS CLI コマンドを実行します。このコマンドを使用する場合は、`<my-cluster>` を自分のクラスター名に置き換えます。

```
aws eks describe-cluster --name <my-cluster> --query cluster.resourcesVpcConfig.clusterSecurityGroupId
```

## ステップ 2: Fargate Pod 実行ロールを作成する
<a name="fargate-sg-pod-execution-role"></a>

クラスターが AWS Fargate で Pod を作成する場合、Fargate インフラストラクチャで実行されるコンポーネントは、ユーザーに代わって AWS API を呼び出す必要があります。Amazon EKS の Pod 実行ロールにより、これらを行うための IAM アクセス許可が付与されます。AWS Fargate Pod 実行ロールを作成するには、「[Amazon EKS Pod 実行 IAM ロール](pod-execution-role.md)」を参照してください。

**注記**  
`--fargate` オプションを使用して `eksctl` でクラスターを作成した場合は、クラスターに Pod 実行ロールが既にあり、これは `eksctl-my-cluster-FargatePodExecutionRole-ABCDEFGHIJKL` というパターンで IAM コンソールに表示されます。同様に、`eksctl` を使用して Fargate プロファイルを作成する場合、`eksctl` では Pod 実行ロールを作成します (まだ存在しない場合)。

## ステップ 3: クラスターの Fargate プロファイルを作成する
<a name="fargate-gs-create-profile"></a>

クラスターの Fargate で実行されている Pod をスケジューリングする前に、起動時に Fargate を使用する Pod を指定する Fargate プロファイルを定義する必要があります。詳細については、「[起動時にどの Pod が AWS Fargate を使用するのかを定義する](fargate-profile.md)」を参照してください。

**注記**  
`--fargate` オプションを使用して `eksctl` でクラスターを作成した場合、クラスターの Fargate プロファイルは、`kube-system` と `default` の名前空間のすべての Pod のセレクターを使用して既に作成されています。Fargate で使用するその他の名前空間の Fargate プロファイルを作成するには、以下の手順に従います。

Fargate プロファイルを作成するには、次のツールのいずれかを使用します。
+  [`eksctl`](#eksctl_fargate_profile_create) 
+  [AWS マネジメントコンソール](#console_fargate_profile_create) 

### `eksctl`
<a name="eksctl_fargate_profile_create"></a>

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

```
eksctl version
```

`eksctl` のインストールまたはアップグレードの手順については、`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。

 ** で、Fargate プロファイルを作成するには`eksctl`** 

以下の `eksctl` コマンドで Fargate プロファイルを作成し、すべての `<example value>` を自分の値に置き換えます。名前空間を指定する必要があります。ただし、`--labels` オプションは必須ではありません。

```
eksctl create fargateprofile \
    --cluster <my-cluster> \
    --name <my-fargate-profile> \
    --namespace <my-kubernetes-namespace> \
    --labels <key=value>
```

`<my-kubernetes-namespace>` および `<key=value>` ラベルには、特定のワイルドカードを使用できます。詳細については、「[Fargate プロファイルのワイルドカード](fargate-profile.md#fargate-profile-wildcards)」を参照してください。

### AWS マネジメントコンソール
<a name="console_fargate_profile_create"></a>

 ** で、Fargate プロファイルを作成するにはAWS マネジメントコンソール** 

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. Fargate プロファイルを作成するクラスターを選択します。

1. **[コンピューティング]** タブを開きます。

1. **[Fargate プロファイル]** で、**[Fargate プロファイルを追加]** を選択します。

1. **[Fargate プロファイルを設定]** ページで、次の操作を行います。

   1. **[名前]** に Fargate プロファイルの名前を入力します。名前は一意である必要があります。

   1. **[Pod 実行ロール]** で、Fargate プロファイルで使用する Pod 実行ロールを選択します。`eks-fargate-pods.amazonaws.com` サービスプリンシパルを持つ IAM ロールのみが表示されます。ここにロールが表示されない場合は、ロールを作成する必要があります。詳細については、「[Amazon EKS Pod 実行 IAM ロール](pod-execution-role.md)」を参照してください。

   1. 選択した **[サブネット]** を必要に応じて変更します。
**注記**  
Fargate で実行される Pod では、プライベートサブネットのみがサポートされます。

   1. **[Tags]** (タグ) では、オプションで Fargate プロファイルにタグを付けることができます。これらのタグは、Pod など、プロファイルに関連付けられた他のリソースには伝達されません。

   1. [**次へ**] を選択します。

1. **[Pod の選択を設定]** ページで、次の操作を行います。

   1. **[名前空間]** に、Pod と照合する名前空間を入力します。
      + `kube-system` または `default` など、特定の名前空間を使用して照合できます。
      + 特定のワイルドカード (例: `prod-*`) を使用して、複数の名前空間 (例: `prod-deployment` および `prod-test`) と照合することができます。詳細については、「[Fargate プロファイルのワイルドカード](fargate-profile.md#fargate-profile-wildcards)」を参照してください。

   1. (オプション) セレクタに Kubernetes ラベルを追加します。特に、指定された名前空間内の Pod が一致する必要があるものにそれらを追加します。
      + ラベル `infrastructure: fargate` をセレクターに追加して、`infrastructure: fargate` Kubernetes ラベルも持つ指定された名前空間の Pod のみがセレクターと一致するようにすることができます。
      + 特定のワイルドカード (例: `key?: value?`) を使用して、複数の名前空間 (例: `keya: valuea` および `keyb: valueb`) と照合することができます。詳細については、「[Fargate プロファイルのワイルドカード](fargate-profile.md#fargate-profile-wildcards)」を参照してください。

   1. **[Next]** (次へ) を選択します。

1. **[確認と作成]** ページで、Fargate プロファイルの情報を確認し、**[作成]** を選択します。

## ステップ 4: CoreDNS を更新する
<a name="fargate-gs-coredns"></a>

デフォルトでは、CoreDNS は Amazon EKS クラスターの Amazon EC2 インフラストラクチャで実行するように設定されています。クラスター内で Fargate で*のみ* Pod を実行する場合は、次の手順を実行します。

**注記**  
`--fargate` オプションを使用して `eksctl` でクラスターを作成した場合は、[次のステップ](#fargate-gs-next-steps) にスキップできます。

1. 次のコマンドを使用して、CoreDNS の Fargate プロファイルを作成します。`<my-cluster>` をクラスター名、`<111122223333>` をアカウント ID、`<AmazonEKSFargatePodExecutionRole>` をポッド実行ロール名に置き換え、また、`<000000000000000a>`、`<000000000000000b>`、`<000000000000000c>` をプライベートサブネットの ID に置き換えます。Pod 実行ロールがない場合は、最初に作成する必要があります (「[ステップ 2: Fargate Pod 実行ロールを作成する](#fargate-sg-pod-execution-role)」を参照)。
**重要**  
ロール ARN に `/` 以外の[パス](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names)を含めることはできません。例えば、ロールの名前が `development/apps/AmazonEKSFargatePodExecutionRole` の場合、ロールの ARN を指定するときに `AmazonEKSFargatePodExecutionRole` に変更する必要があります。ロール ARN の形式は ` arn:aws:iam::<111122223333>:role/<AmazonEKSFargatePodExecutionRole>` であることが必要です。

   ```
   aws eks create-fargate-profile \
       --fargate-profile-name coredns \
       --cluster-name <my-cluster> \
       --pod-execution-role-arn arn:aws:iam::<111122223333>:role/<AmazonEKSFargatePodExecutionRole> \
       --selectors namespace=kube-system,labels={k8s-app=kube-dns} \
       --subnets subnet-<000000000000000a> subnet-<000000000000000b> subnet-<000000000000000c>
   ```

1. `coredns` デプロイのロールアウトをトリガーします。

   ```
   kubectl rollout restart -n kube-system deployment coredns
   ```

## 次のステップ
<a name="fargate-gs-next-steps"></a>
+ 以下のワークフローを使用すると、Fargate で実行するために既存のアプリケーションの移行を開始できます。

  1.  アプリケーションの Kubernetes 名前空間と Kubernetes ラベルに一致する [Fargate プロファイルの作成](fargate-profile.md#create-fargate-profile)。

  1. 既存のいずれかの Pod を削除および再作成し、Fargate でスケジューリングされるようにします。`<namespace>` と `<deployment-type>` を変更して、特定のポッドを更新します。

     ```
     kubectl rollout restart -n <namespace> deployment <deployment-type>
     ```
+ [Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする](alb-ingress.md) をデプロイして、Fargate で実行されている Pod が Ingress オブジェクトを使用できるようにします。
+ [Vertical Pod Autoscaler を使用してポッドリソースを調整する](vertical-pod-autoscaler.md) を使用して Fargate Pod の CPU とメモリの適切な初期サイズを設定し、[Horizontal Pod Autoscaler を使用してポッドデプロイをスケールする](horizontal-pod-autoscaler.md) を使用してそれらの Pod をスケールできます。Vertical Pod Autoscaler で、より上位の CPU とメモリの組み合わせを持つ Fargate に Pod を自動的に再デプロイする場合は、Vertical Pod Autoscaler のモードを `Auto` または `Recreate` に設定します。これは、正しい機能を保証するためです。詳細については、GitHub で [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#quick-start) のドキュメントを参照してください。
+ [これらの手順](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-EKS-otel.html)に従って、アプリケーションをモニタリングするための [AWS Distro for OpenTelemetry](https://aws.amazon.com/otel) (ADOT) コレクターをセットアップします。

# 起動時にどの Pod が AWS Fargate を使用するのかを定義する
<a name="fargate-profile"></a>

クラスターの Fargate で Pod をスケジューリングする前に、起動時に Fargate を使用するPod を指定する Fargate プロファイルを少なくとも 1 つ定義する必要があります。

管理者は、Fargate プロファイルを使用してどの Pod が Fargate で実行されるかを宣言できます。これはプロファイルのセレクターを介して行うことができます。1 つのプロファイルに最大 5 つのセレクターを追加できます。各セレクターには名前空間が含まれている必要があります。セレクターにはラベルを含めることもできます。ラベルフィールドは、複数のオプションのキーと値のペアで構成されます。セレクターに一致するポッドは Fargate でスケジュールされます。ポッドは、セレクターで指定された名前空間とラベルを使用して照合されます。名前空間セレクターがラベルなしで定義されている場合、Amazon EKS は、プロファイルを使用して、その名前空間で実行されるすべての Pod を Fargate にスケジュールしようとします。スケジューリングされる Pod が Fargate プロファイル内のいずれかのセレクターと一致する場合、その Pod は Fargate でスケジューリングされます。

Pod が複数の Fargate プロファイルと一致する場合、次の Kubernetes ラベルを Pod 仕様に追加することで、Pod がどのプロファイルを使用するかを指定することができます: `eks.amazonaws.com/fargate-profile: my-fargate-profile`。Pod を Fargate にスケジューリングするには、そのプロファイル内のセレクターと一致する必要があります。Kubernetes アフィニティ/アンチアフィニティルールは適用されないため、Amazon EKS Fargate Pod では必要ありません。

Fargate プロファイルを作成する際は、Pod 実行ロールを指定する必要があります。この実行ロールは、プロファイルを使用して Fargate インフラストラクチャで実行される Amazon EKS コンポーネントのためのものです。承認のためにクラスターの Kubernetes [ロールベースのアクセスコントロール](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) (RBAC) に追加されます。これにより、Fargate インフラストラクチャで実行されている `kubelet` が Amazon EKS クラスターに登録され、クラスター内でノードとして表示されるようになります。Pod 実行ロールは、Amazon ECR イメージリポジトリへの読み取りアクセスを許可するために、Fargate インフラストラクチャへの IAM アクセス許可も提供します。詳細については、「[Amazon EKS Pod 実行 IAM ロール](pod-execution-role.md)」を参照してください。

Fargate プロファイルは変更できません。ただし、新しい更新されたプロファイルを作成して既存のプロファイルを置き換え、その後元のプロファイルを削除することはできます。

**注記**  
Fargate プロファイルを使用して実行中の Pod は、プロファイルが削除されると停止され、保留状態になります。

クラスターのいずれかの Fargate プロファイルが `DELETING` ステータスである場合は、Fargate プロファイルの削除が完了するのを待ってから、そのクラスターに他のプロファイルを作成する必要があります。

**注記**  
Fargate は現在 Kubernetes [topologySpreadConstraints](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/) をサポートしていません。

Amazon EKS と Fargate は、Fargate プロファイルで定義されている各サブネットに Pod を分散させます。ただし、分散が偏ってしまう場合があります。均等な分散が必要な場合は、2 つの Fargate プロファイルを使用してください。2 つのレプリカをデプロイし、ダウンタイムを発生させたくないシナリオでは、均等な分散が重要になります。各プロファイルにはサブネットを 1 つだけ含めることをお勧めします。

## Fargate プロファイルのコンポーネント
<a name="fargate-profile-components"></a>

Fargate プロファイルには、次のコンポーネントが含まれています。

 **ポッド実行ロール**   
クラスターが AWS Fargate で Pod を作成するとき、Fargate インフラストラクチャ上で実行されている `kubelet` は、ユーザーに代わって AWS API を呼び出す必要があります。例えば、Amazon ECR からコンテナイメージを取得するためのコールを行う必要があります。Amazon EKS の Pod 実行ロールにより、これらを行うための IAM アクセス許可が付与されます。  
Fargate プロファイルを作成する際は、Pod で使用する Pod 実行ロールを指定する必要があります。このロールは、承認のためにクラスターの Kubernetes [ロールベースのアクセスコントロール](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) (RBAC) に追加されます。これにより、Fargate インフラストラクチャで実行されている `kubelet` が Amazon EKS クラスターに登録され、クラスター内でノードとして表示されるようになります。詳細については、「[Amazon EKS Pod 実行 IAM ロール](pod-execution-role.md)」を参照してください。

 **サブネット**   
このプロファイルを使用する Pod を起動するサブネットの ID。現時点では、Fargate で実行されている Pod にはパブリック IP アドレスが割り当てられていません。したがって、このパラメータには、プライベートサブネット (インターネットゲートウェイへの直接ルートなし) のみが受け入れられます。

 **セレクター**   
この Fargate プロファイルを使用するために Pod に一致するセレクター。1 つの Fargate プロファイルに最大 5 つのセレクターを指定できます。セレクターには次のコンポーネントがあります:  
+  **名前空間** – セレクターの名前空間を指定する必要があります。セレクターはこの名前空間で作成された Pod のみを照合します。ただし、複数のセレクターを作成して複数の名前空間をターゲットにすることはできます。
+  **ラベル** – オプションで、セレクターに一致する Kubernetes ラベルを指定できます。セレクターは、セレクターで指定されているすべてのラベルを持つ Pod のみに一致します。

## Fargate プロファイルのワイルドカード
<a name="fargate-profile-wildcards"></a>

名前空間、ラベルキー、およびラベル値のセレクター基準では、Kubernetes で許可されている文字に加えて、`*` および `?` の使用が許可されています。
+  `*` は、文字なし、1 文字、または複数の文字を表します。例: `prod*` は `prod` および `prod-metrics` を表します。
+  `?` は 1 文字を表します (例: `value?` は `valuea` を表します)。しかし、`value` および `value-a` を表すことはできません。`?` は厳密に 1 文字だけを表すためです。

これらのワイルドカード文字は、任意の位置や組み合わせで使用できます (例: `prod*`、`*dev`、および `frontend*?`)。正規表現など、他のワイルドカードやパターンマッチング形式はサポートされていません。

Pod 仕様内の名前空間とラベルに一致するプロファイルが複数ある場合、Fargate はプロファイル名による英数字ソートに基づいてプロファイルを選択します。例えば、(`beta-workload` という名前の) プロファイル A と (`prod-workload` という名前の) プロファイル B の両方に、起動する Pod に一致するセレクターがある場合、Fargate は Pod にプロファイル A (`beta-workload`) を選択します。Pod には、プロファイル A のラベルが付いています (例: `eks.amazonaws.com/fargate-profile=beta-workload`)。

ワイルドカードを使用する新しいプロファイルに既存の Fargate Pod を移行するには、次の 2 つの方法があります。
+ 一致するセレクターを持つ新しいプロファイルを作成し、古いプロファイルを削除します。古いプロファイルでラベル付けされたポッドは、一致する新しいプロファイルに再スケジュールされます。
+ ワークロードを移行したいものの、各 Fargate Pod にどの Fargate ラベルが付いているかわからない場合は、次の方法を使用できます。新しいプロファイルを作成し、同じクラスター上のプロファイルの中でアルファベット順で最初に並べられる名前を付けます。次に、新しいプロファイルに移行する必要がある Fargate Pod をリサイクルします。

## Fargate プロファイルの作成
<a name="create-fargate-profile"></a>

このセクションでは、Fargate プロファイルを作成する方法について説明します。また、Fargate プロファイルに使用する Pod 実行ロールを作成しておく必要があります。詳細については、「[Amazon EKS Pod 実行 IAM ロール](pod-execution-role.md)」を参照してください。Fargate で実行されている Pod は、プライベートサブネットでのみサポートされています (AWS サービスへの [NAT ゲートウェイ](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)アクセスはできますが、インターネットゲートウェイへの直接ルーティングはできません)。これは、クラスターの VPC がプライベートサブネットを使用できるようにするためです。

プロファイルは以下を使用して作成できます。
+  [`eksctl`](#eksctl_create_a_fargate_profile) 
+  [AWS マネジメントコンソール](#console_create_a_fargate_profile) 

## `eksctl`
<a name="eksctl_create_a_fargate_profile"></a>

 **`eksctl` で、Fargate プロファイルを作成するには** 

以下の `eksctl` コマンドで Fargate プロファイルを作成し、すべてのサンプル値を自分の値に置き換えます。名前空間を指定する必要があります。ただし、`--labels` オプションは必須ではありません。

```
eksctl create fargateprofile \
    --cluster my-cluster \
    --name my-fargate-profile \
    --namespace my-kubernetes-namespace \
    --labels key=value
```

`my-kubernetes-namespace` および `key=value` ラベルには、特定のワイルドカードを使用できます。詳細については、「[Fargate プロファイルのワイルドカード](#fargate-profile-wildcards)」を参照してください。

## AWS マネジメントコンソール
<a name="console_create_a_fargate_profile"></a>

 **AWS マネジメントコンソール で、Fargate プロファイルを作成するには** 

1. [アマゾン EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. Fargate プロファイルを作成するクラスターを選択します。

1. **[コンピューティング]** タブを開きます。

1. **[Fargate プロファイル]** で、**[Fargate プロファイルを追加]** を選択します。

1. **[Fargate プロファイルを設定]** ページで、次の操作を行います。

   1. **[名前]** に、Fargate プロファイルの一意の名前 (`my-profile` など) を入力します。

   1. **[Pod 実行ロール]** で、Fargate プロファイルで使用する Pod 実行ロールを選択します。`eks-fargate-pods.amazonaws.com` サービスプリンシパルを持つ IAM ロールのみが表示されます。ここにロールが表示されない場合は、ロールを作成する必要があります。詳細については、「[Amazon EKS Pod 実行 IAM ロール](pod-execution-role.md)」を参照してください。

   1. 選択した **[サブネット]** を必要に応じて変更します。
**注記**  
Fargate で実行される Pod では、プライベートサブネットのみがサポートされます。

   1. **[Tags]** (タグ) では、オプションで Fargate プロファイルにタグを付けることができます。これらのタグは、Pod など、プロファイルに関連付けられた他のリソースには伝達されません。

   1. [**Next**] を選択します。

1. **[Pod の選択を設定]** ページで、次の操作を行います。

   1. **[名前空間]** に、Pod と照合する名前空間を入力します。
      + `kube-system` または `default` など、特定の名前空間を使用して照合できます。
      + 特定のワイルドカード (例: `prod-*`) を使用して、複数の名前空間 (例: `prod-deployment` および `prod-test`) と照合することができます。詳細については、「[Fargate プロファイルのワイルドカード](#fargate-profile-wildcards)」を参照してください。

   1. (オプション) セレクタに Kubernetes ラベルを追加します。特に、指定された名前空間内の Pod が一致する必要があるものにそれらを追加します。
      + ラベル `infrastructure: fargate` をセレクターに追加して、`infrastructure: fargate` Kubernetes ラベルも持つ指定された名前空間の Pod のみがセレクターと一致するようにすることができます。
      + 特定のワイルドカード (例: `key?: value?`) を使用して、複数の名前空間 (例: `keya: valuea` および `keyb: valueb`) と照合することができます。詳細については、「[Fargate プロファイルのワイルドカード](#fargate-profile-wildcards)」を参照してください。

   1. [**Next**] を選択します。

1. **[確認と作成]** ページで、Fargate プロファイルの情報を確認し、**[作成]** を選択します。

# Fargate プロファイルを削除する
<a name="delete-fargate-profile"></a>

このトピックでは、Fargate プロファイルを削除する方法について説明します。Fargate プロファイルを削除すると、そのプロファイルで Fargate にスケジューリングされていた Pod はすべて削除されます。これらの Pod が別の Fargate プロファイルと一致する場合、それらの Pod はそのプロファイルで Fargate にスケジューリングされます。Fargate プロファイルがどのプロファイルとも一致しなくなった場合は、Fargate へのスケジューリングは行われず、保留中のままになる可能性があります。

一度にクラスター内の 1 つの Fargate プロファイルのみが、`DELETING` ステータスになることができます。そのクラスター内の他のプロファイルを削除する前に、Fargate プロファイルの削除が完了するまでお待ちください。

プロファイルは、次のいずれかのツールを使用して削除できます。
+  [`eksctl`](#eksctl_delete_a_fargate_profile) 
+  [AWS マネジメントコンソール](#console_delete_a_fargate_profile) 
+  [AWS CLI](#awscli_delete_a_fargate_profile) 

## `eksctl`
<a name="eksctl_delete_a_fargate_profile"></a>

 **`eksctl` で、Fargate プロファイルを削除する** 

クラスターからプロファイルを削除するには、次のコマンドを使用します。各*サンプル値*は独自の値に置き換えます。

```
eksctl delete fargateprofile  --name my-profile --cluster my-cluster
```

## AWS マネジメントコンソール
<a name="console_delete_a_fargate_profile"></a>

 **AWS マネジメントコンソール で、Fargate プロファイルを削除する** 

1. [アマゾン EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 左のナビゲーションペインで **[Clusters]** (クラスター) を選択してください。クラスターの一覧で Fargate プロファイルを削除するクラスターを選択します。

1. **[コンピューティング]** タブを開きます。

1. 削除する Fargate プロファイルを選択し、**[削除]** を選択します。

1. **[Fargate プロファイルの削除]** ページで、プロファイルの名前を入力し、**[削除]** を選択します。

## AWS CLI
<a name="awscli_delete_a_fargate_profile"></a>

 **AWS CLI で、Fargate プロファイルを削除する** 

クラスターからプロファイルを削除するには、次のコマンドを使用します。各*サンプル値*は独自の値に置き換えます。

```
aws eks delete-fargate-profile --fargate-profile-name my-profile --cluster-name my-cluster
```

# Fargate Pod 設定の詳細を理解する
<a name="fargate-pod-configuration"></a>

このセクションでは、AWS Fargate で Kubernetes Pod を実行するための固有の Pod 設定の詳細について説明します。

## ポッド CPU とメモリ
<a name="fargate-cpu-and-memory"></a>

Kubernetes では、Pod 内の各コンテナに割り当てられるリクエスト、最小量の vCPU およびメモリリソースを定義できます。Pod は Kubernetes によってスケジュールされ、少なくとも各 Pod に対してリクエストされたリソースがコンピューティングリソース上で利用可能になるようにします。詳細については、Kubernetes のドキュメントの「[Managing Compute Resources for Containers](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)」を参照してください。

**注記**  
Amazon EKS Fargate はノードごとに Pod を 1 つだけ実行するため、リソースが少ない場合に Pod を削除するシナリオは発生しません。すべての Amazon EKS Fargate Pod は保証された優先度で実行されるため、リクエストされた CPU とメモリは、すべてのコンテナの制限に等しくする必要があります。詳細については、Kubernetes ドキュメントの「[Configure Quality of Service for Pods (ポッド用にサービスの品質を設定する)](https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/)」を参照してください。

Pod が Fargate にスケジュールされている場合、Pod 仕様内の vCPU とメモリの予約によって、Pod にプロビジョニングする CPU とメモリの量が決まります。
+ Init コンテナからの最大リクエストは、Init リクエスト vCPU およびメモリ要件を決定するために使用されます。
+ 実行時間の長いコンテナのリクエストは、実行時間の長いリクエスト vCPU とメモリ要件を決定するために合計されます。
+ 前記の 2 つの値のうち大きい方が、Pod 用に使用する vCPU とメモリリクエストに対して選択されます。
+ Fargate は、必要な Kubernetes コンポーネント (`kubelet`、`kube-proxy`、および `containerd`) の各 Pod のメモリ予約に 256 MB を追加します。

Fargate では、Pod の実行に必要なリソースを常に確保するために、vCPU とメモリのリクエストの合計に最も近い、次に示すコンピューティング設定に切り上げられます。

vCPU とメモリの組み合わせを指定しない場合は、使用可能な最小の組み合わせ (.25 vCPU と 0.5 GB のメモリ) が使用されます。

次の表は、Fargate で実行されている Pod で使用可能な vCPU とメモリの組み合わせを示しています。


| vCPU 値 | メモリの値 | 
| --- | --- | 
|  .25 vCPU  |  0.5 GB、1 GB、2 GB  | 
|  .5 vCPU  |  1 GB、2 GB、3 GB、4 GB  | 
|  1 vCPU  |  2 GB、3 GB、4 GB、5 GB、6 GB、7 GB、8 GB  | 
|  2 vCPU  |  4 GB ～ 16 GB (1 GB のインクリメント)  | 
|  4 vCPU  |  8 GB ～ 30 GB (1 GB のインクリメント)  | 
|  8 vCPU  |  16 GB～60 GB (4 GB のインクリメント)  | 
|  16 vCPU  |  32 GB～120 GB (8 GB のインクリメント)  | 

Kubernetes コンポーネント用に予約されている追加メモリにより、要求よりも多くの vCPU による Fargate タスクがプロビジョニングされる可能性があります。例えば、1 つの vCPU と 8 GB のメモリを要求すると、メモリ要求に 256 MB が追加され、2 つの vCPU と 9 GB のメモリの Fargate タスクがプロビジョニングされます。これは、1 つの vCPU と 9 GB のメモリのタスクがないためです。

Fargate で実行されている Pod のサイズと、Kubernetes が `kubectl get nodes` でレポートするノードサイズに相関はありません。レポートされるノードサイズは、多くの場合 Pod のキャパシティーよりも大きくなります。次のコマンドを使用して、Pod キャパシティーを確認できます。*default* を Pod の名前空間に、*pod-name* を Pod の名前に置き換えます。

```
kubectl describe pod --namespace default pod-name
```

出力例は次のとおりです。

```
[...]
annotations:
    CapacityProvisioned: 0.25vCPU 0.5GB
[...]
```

`CapacityProvisioned` アノテーションは、実際の Pod キャパシティーを表し、これで Fargate で実行されている Pod のコストが決まります。コンピューティング設定の料金情報については、「[AWS Fargate の料金](https://aws.amazon.com/fargate/pricing/)」を参照してください。

## Fargate ストレージ
<a name="fargate-storage"></a>

Fargate 上で実行される Pod は、ドライバーの手動インストールステップなしで、Amazon EFS ファイルシステムを自動的にマウントします。Fargate ノードでは動的永続ボリュームプロビジョニングを使用できませんが、静的プロビジョニングを使用することはできます。詳細については、GitHub の「[Amazon EFS CSI ドライバー](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md)」を参照してください。

プロビジョニングすると、Fargate で実行されている各 Pod に対して、デフォルトで 20 GiB のエフェメラルストレージが割り当てられます。このタイプのストレージは、Pod の停止後に削除されます。Fargate に起動される新しい Pod では、エフェメラルストレージボリュームの暗号化がデフォルトで有効になっています。エフェメラル Pod ストレージは、AWS Fargate で管理されるキーを使用して AES-256 暗号化アルゴリズムで暗号化されます。

**注記**  
Fargate で実行される Amazon EKS Pod のデフォルトで使用可能なストレージは、20 GiB 未満です。これは、一部のスペースが `kubelet` と Pod 内に読み込まれるその他の Kubernetes モジュールによって使用されるためです。

エフェメラルストレージの総量は、最大 175 GiB まで増やすことができます。Kubernetes でサイズを設定するには、Pod 内の各コンテナに対して、`ephemeral-storage` リソースのリクエストを指定します。Kubernetes が Pod をスケジュールすると、各 Pod に対するリソースリクエストの合計が Fargate タスクの容量を下回ることが保証されます。詳細については、Kubernetes ドキュメントの「[Resource Management for Pods and Containers](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)」を参照してください。

Amazon EKS Fargate は、システム使用目的でリクエストされた数よりも大きなエフェメラルストレージをプロビジョニングします。たとえば、100 GiB のリクエストでは、115 GiB のエフェメラルストレージの Fargate タスクがプロビジョニングされます。

# AWS Fargate OS パッチ適用イベントのアクションを設定する
<a name="fargate-pod-patching"></a>

Amazon EKS は定期的に AWS Fargate ノードの OS にパッチを適用し、ノードを安全に保ちます。パッチ適用プロセスの一環として、ノードをリサイクルして OS パッチをインストールします。更新は、サービスへの影響を最小限に抑える方法で試行されます。ただし、Pod のエビクションが正常に行われない場合は、Pod を削除する必要がある場合があります。以下に示しているのは、中断の可能性を最小限に抑えるために実行できるアクションです。
+ 適切な Pod の中断予算 (PDB) を設定して、同時にダウンする Pod の数を制御します。
+ Pod が削除される前に、失敗したエビクションに対応する Amazon EventBridge ルールを作成します。
+ 受信した通知に記載されているエビクション日よりも前に、影響を受けるポッドを手動で再起動します。
+ AWS User Notifications で通知設定を作成します。

Amazon EKS は、Kubernetes コミュニティと緊密に協力して、できるだけ早く、バグ修正とセキュリティパッチが入手可能になるようにしています。すべての Fargate Pod は最新の Kubernetes パッチバージョンで起動されます。このバージョンは、Amazon EKS からクラスターの Kubernetes バージョンとして入手できます。以前のパッチバージョンの Pod をお持ちの場合、Amazon EKS はそれをリサイクルして最新バージョンに更新することがあります。これにより、Pod に最新のセキュリティアップデートが確実に装備されます。そのため、クリティカルな[共通脆弱性識別子](https://cve.mitre.org/) (CVE) 問題があっても、最新の状態に保たれてセキュリティリスクが軽減されています。

AWS Fargate OS が更新されると、Amazon EKS は影響を受けるリソースと今後のポッドのエビクション日を含む通知を送信します。指定されたエビクション日が不都合な場合は、通知に記載されたエビクション日よりも前に、影響を受けるポッドを手動で再起動するオプションを利用できます。通知を受け取る前に作成されたポッドは、エビクションの対象となります。ポッドを手動で再起動する方法の詳細については、[Kubernetes ドキュメント](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_rollout/kubectl_rollout_restart)を参照してください。

Pod がリサイクルされるときに一度にダウンする Pod の数を制限するために、Pod の中断予算 (PDB) を設定できます。PDB を使用して、更新の実行を許可しながら、各アプリケーションの要件に基づいて最小限使用可能なポッドを定義できます。PDB の最小可用性は 100% 未満である必要があります。詳細については、Kubernetes ドキュメントの「[アプリケーションに Disruption Budget 指定する](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)」を参照してください。

Amazon EKS は [Eviction API](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/#eviction-api) を使用して、アプリケーションに設定した PDB を尊重しながら Pod を安全に排出します。ポッドのエビクションは、影響を最小限に抑えるために、アベイラビリティーゾーンごとに行われます。エビクションが成功すると、新しい Pod には最新のパッチが適用され、それ以上のアクションは必要ありません。

Pod のエビクションが失敗すると、Amazon EKS はエビクションに失敗した Pod の詳細を含むイベントをアカウントに送信します。スケジュールされた終了時刻より前にメッセージに対応できます。具体的な時刻は、パッチの緊急性によって異なります。その時刻になると、Amazon EKS は Pod のエビクションを再び試行します。ただし、今回は、エビクションが失敗しても新しいイベントは送信されません。エビクションが再び失敗すると、新しい Pod に最新のパッチが適用できるように、既存の Pod が定期的に削除されます。

Pod のエビクションが失敗したときに受信されるイベントのサンプルを次に示します。これには、クラスター、Pod 名、Pod 名前空間、Fargate プロファイル、およびスケジュールされた終了時刻に関する詳細が含まれます。

```
{
    "version": "0",
    "id": "12345678-90ab-cdef-0123-4567890abcde",
    "detail-type": "EKS Fargate Pod Scheduled Termination",
    "source": "aws.eks",
    "account": "111122223333",
    "time": "2021-06-27T12:52:44Z",
    "region": "region-code",
    "resources": [
        "default/my-database-deployment"
    ],
    "detail": {
        "clusterName": "my-cluster",
        "fargateProfileName": "my-fargate-profile",
        "podName": "my-pod-name",
        "podNamespace": "default",
        "evictErrorMessage": "Cannot evict pod as it would violate the pod's disruption budget",
        "scheduledTerminationTime": "2021-06-30T12:52:44.832Z[UTC]"
    }
}
```

さらに、Pod に複数の PDB が関連付けられていると、エビクション失敗イベントが発生する可能性があります。このイベントは次のエラーメッセージを返します。

```
"evictErrorMessage": "This pod has multiple PodDisruptionBudget, which the eviction subresource does not support",
```

このイベントに基づいて、目的のアクションを作成できます。例えば、Pod の中断予算 (PDB) を調整して、Pod のエビクションの方法を制御できます。具体的には、利用可能な Pod の目標パーセンテージを指定する PDB から始めたとします。アップグレード中に Pod が強制終了される前に、PDB を異なる割合の Pod に調整できます。このイベントを受信するには、クラスターが属する AWS アカウントおよび AWS リージョンで Amazon EventBridge ルールを作成する必要があります。ルールでは、次の**カスタムパターン**を使用する必要があります。EventBridge ルールの作成の詳細については、*Amazon EventBridge ユーザーガイド*の「[イベントに反応する Amazon EventBridge ルールの作成](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)」を参照してください 。

```
{
  "source": ["aws.eks"],
  "detail-type": ["EKS Fargate Pod Scheduled Termination"]
}
```

キャプチャするためのイベントに適切なターゲットを設定できます。詳細については、「Amazon EventBridge ユーザーガイド」の「[Amazon EventBridge ターゲット](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html)」を参照してください。AWS User Notifications で通知設定を作成することもできます。AWS マネジメントコンソール を使用して通知を作成する場合は、**[イベントルール]** で、 **[AWS 名]**  に **[Elastic Kubernetes Service (EKS)]** を選択し、**[イベントタイプ]** に **[EKS Fargate Pod のスケジュールされた終了時刻]** を選択します。詳細については、「AWS User Notifications ユーザーガイド」の「[AWS User Notifications の開始方法](https://docs.aws.amazon.com/notifications/latest/userguide/getting-started.html)」を参照してください。

EKS Pod エビクションに関するよくある質問については、*AWS re:Post* の「[よくある質問: Fargate Pod のエビクション通知](https://repost.aws/knowledge-center/fargate-pod-eviction-notice)」を参照してください。

# AWS Fargate アプリケーションと使用状況のメトリクスを収集する
<a name="monitoring-fargate-usage"></a>

AWS Fargate のシステムメトリクスおよび CloudWatch 使用状況メトリクスを収集できます。

## アプリケーションメトリクス
<a name="fargate-application-metrics"></a>

Amazon EKS や AWS Fargate で動作するアプリケーションには、AWS Distro for OpenTelemetry (ADOT) を使用できます。ADOT では、システムメトリクスを収集し、CloudWatch コンテナインサイトダッシュボードに送信できます。Fargate で実行されているアプリケーションで ADOT の使用を開始するには、「ADOT ドキュメント」の「[Using CloudWatch Container Insights with AWS Distro for OpenTelemetry](https://aws-otel.github.io/docs/getting-started/container-insights)」( Distro for OpenTelemetry を活用した CloudWatch Container Insights の使用) を参照してください。

## 使用状況メトリクス
<a name="fargate-usage-metrics"></a>

CloudWatch 使用状況メトリクスを使用して、アカウントのリソースの使用状況を把握できます。これらのメトリクスを使用して、CloudWatch グラフやダッシュボードで現在のサービスの使用状況を可視化できます。

 AWS Fargate 使用状況メトリクスは、AWS Service Quotas に対応しています。使用量がサービスクォータに近づいたときに警告するアラームを設定することもできます。Fargate のサービスのクォータの詳細については、「[Amazon EKS と Fargate Service Quotas を表示して管理する](service-quotas.md)」を参照してください。

 AWS Fargate は、` AWS/Usage` 名前空間に以下のメトリクスを公開します。


| メトリクス | 説明 | 
| --- | --- | 
|   `ResourceCount`   |  アカウントで実行されている指定されたリソースの合計数。リソースは、メトリクスに関連付けられたディメンションによって定義されます。  | 

次のディメンションは、AWS Fargate によって公開される使用状況メトリクスを絞り込むために使用されます。


| ディメンション | 説明 | 
| --- | --- | 
|   `Service`   |  リソースを含む AWS のサービスの名前。AWS Fargate 使用状況メトリクスの場合、このディメンションの値は `Fargate` です。  | 
|   `Type`   |  報告されるエンティティのタイプ。現在、AWS Fargate 使用状況メトリクスの有効な値は `Resource` のみです。  | 
|   `Resource`   |  実行中のリソースのタイプ。 現在、AWS Fargate は Fargate のオンデマンド 使用状況に関する情報を返します。Fargate のオンデマンド使用状況のリソース値は `OnDemand` です。 [注意] ==== Fargate のオンデマンド使用状況とは、Fargate を使用した Amazon EKS Pod、Fargate 起動タイプを使用した Amazon ECS タスク、`FARGATE` キャパシティープロバイダーを使用した Amazon ECS タスクを組み合わせたものです。 ====  | 
|   `Class`   |  追跡されているリソースのクラス。現在、AWS Fargate はクラスディメンションを使用していません。  | 

### Fargate のリソース使用状況メトリクスをモニタリングするための CloudWatch アラームの作成
<a name="service-quota-alarm"></a>

 AWS Fargate は、Fargate オンデマンドリソース使用状況の AWS Service Quotas に対応する CloudWatch 使用状況メトリクスを提供します。Service Quotas コンソールでは、使用状況をグラフで可視化できます。また、使用量が Service Quotas に近づいたときに警告するアラームも設定できます。詳細については、「[AWS Fargate アプリケーションと使用状況のメトリクスを収集する](#monitoring-fargate-usage)」を参照してください。

以下の手順を使用して、Fargate リソース使用状況メトリクスに基づく CloudWatch アラームを作成します。

1. Service Quotas コンソールを開きますhttps://console.aws.amazon.com/servicequotas/

1. 左のナビゲーションペインで **[AWS サービス**] を選択します。

1. **[AWS サービス**] リストから、**[AWS Fargate]** を探して選択します。

1. **[Service quotas]** (サービスクォータ) リストで、アラームを作成する Fargate 使用量クォータを選択します。

1. Amazon CloudWatch アラームのセクションで **[Create]** (作成) を選択します。

1. [**アラームのしきい値**] で、適用されたクォータ値からアラーム値として設定する値の割合を選択します。

1. [**アラーム名**] にアラームの名前を入力し、[**Create (作成)**] を選択します。

# クラスターの AWS Fargate ログ記録を開始する
<a name="fargate-logging"></a>

Fargate の Amazon EKS では、Fluent Bit をベースにした組み込みのログルーターが利用できます。Fluent Bit コンテナをサイドカーとして明示的に実行する必要はなく、この実行は Amazon によって行われます。必要となるのは、ログルーターの設定だけです。設定は専用の `ConfigMap` を介して行い、その際は以下の基準を満たす必要があります。
+ 名前のついた `aws-logging` 
+ `aws-observability` と呼ばれる専用の名前空間での作成 
+ 5,300 文字以内にしてください。

`ConfigMap` を作成すると、Fargate の Amazon EKS は自動的にそれを検出しログルーターの設定を行います。Fargate は、Fluent Bit の AWS のバージョンを使用しています。これは、AWS によって管理される Fluent Bit の上流対応のディストリビューションです。詳細については、GitHub の「[AWS for Fluent Bit](https://github.com/aws/aws-for-fluent-bit)」を参照してください。

ログルーターを使用すると、AWS のさまざまなサービスをログの分析と保管に使用できます。Fargate からは、Amazon CloudWatch、Amazon OpenSearch Service に対し直接ログをストリーミングできます。また、[Amazon Data Firehose](https://aws.amazon.com/kinesis/data-firehose/) 経由で [Amazon S3](https://aws.amazon.com/s3/)、[Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/)、およびパートナーツールなどの送信先にログをストリーミングすることも可能です。
+ Fargate Pod をデプロイする既存の Kubernetes 名前空間を指定する既存の Fargate プロファイル。詳細については、「[ステップ 3: クラスターの Fargate プロファイルを作成する](fargate-getting-started.md#fargate-gs-create-profile)」を参照してください。
+ 既存の Fargate Pod 実行ロール。詳細については、「[ステップ 2: Fargate Pod 実行ロールを作成する](fargate-getting-started.md#fargate-sg-pod-execution-role)」を参照してください。

## ログルーターの設定
<a name="fargate-logging-log-router-configuration"></a>

**重要**  
ログを正常に公開するには、そのクラスターが属している VPC からログの送信先までの、ネットワークアクセスが必要になります。これには、ユーザーによる VPC の出力ルールの、カスタマイズが関係します。詳細については、「*Amazon CloudWatch Logs ユーザーガイド*」の「[Using CloudWatch Logs with interface VPC endpoints](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)」を参照してください。

以下のステップでは、すべての*サンプル値*を独自の値に置き換えます。

1. `aws-observability` という名前で、専用の Kubernetes 名前空間を作成します。

   1. 次の内容をコンピュータ上の `aws-observability-namespace.yaml` という名前のファイルに保存します。`name` の値は `aws-observability` である必要があり、`aws-observability: enabled` ラベルが必須です。

      ```
      kind: Namespace
      apiVersion: v1
      metadata:
        name: aws-observability
        labels:
          aws-observability: enabled
      ```

   1. 名前空間を作成します。

      ```
      kubectl apply -f aws-observability-namespace.yaml
      ```

1. データ値 `Fluent Conf` を使用して `ConfigMap` を作成し、コンテナログを送信先に送ります。Fluent Conf とは Fluent Bit であり、コンテナログを任意のログ送信先にルーティングするために使用される、高速で軽量なログプロセッサ構成言語です。詳細については、Fluent Bit ドキュメントの「[Configuration File](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file)」を参照してください。
**重要**  
典型的な `Fluent Conf` に含まれている主なセクションは、`Service``Input`、`Filter` および `Output` です。ただし、Fargate のログルータでは、以下だけを受け入れます。  
`Filter` および `Output` セクション。
`Parser` セクション。
他のセクションを提供した場合、拒否されます。

   Fargate ログルーターは `Service` および `Input` セクションを管理します。次の `Input` セクションがありますが、これらは変更できず、`ConfigMap` には必要ありません。ただし、メモリバッファー制限やログに適用されるタグなどの洞察は得られます。

   ```
   [INPUT]
       Name tail
       Buffer_Max_Size 66KB
       DB /var/log/flb_kube.db
       Mem_Buf_Limit 45MB
       Path /var/log/containers/*.log
       Read_From_Head On
       Refresh_Interval 10
       Rotate_Wait 30
       Skip_Long_Lines On
       Tag kube.*
   ```

   `ConfigMap` の作成時は、以下の (Fargate がフィールドの検証に使用する) ルールを考慮に入れます。
   +  `[FILTER]`、`[OUTPUT]`および `[PARSER]` は、それぞれが対応するキーにより指定する必要があります。例: `[FILTER]` が `filters.conf` の下にある必要があります。`filters.conf` には、複数の `[FILTER]` を含められます。また、`[OUTPUT]` および `[PARSER]` セクションは、それぞれと対応するキーの下に置く必要があります。複数の `[OUTPUT]` セクションを指定することで、ログを異なる送信先に同時にルーティングできます。
   + Fargate は各セクションに必要なキーを検証します。`Name` および `match` がそれぞれの `[FILTER]` および `[OUTPUT]` に必要です。`Name` および `format` がそれぞれの `[PARSER]` に必要です。キーの大文字と小文字は区別されません。
   + `${ENV_VAR}` などの環境変数は `ConfigMap` では許可されていません。
   + インデントは、それぞれの `filters.conf`、`output.conf`、および `parsers.conf` の中で、ディレクティブまたはキーと値のペアで同じである必要があります。キーと値のペアは、ディレクティブよりも深いインデントにする必要があります。
   + Fargate は、サポートされている次のフィルターに対して検証します。`grep`、`parser`、`record_modifier`、`rewrite_tag`、`throttle`、`nest`、`modify`、および `kubernetes`。
   + Fargate は、サポートされている次の出力に対して検証します。`es`、`firehose`、`kinesis_firehose`、`cloudwatch`、`cloudwatch_logs`、および `kinesis`。
   + ログ記録を有効にするには、サポートされている `Output` プラグインが少なくとも 1 つ `ConfigMap` にあることが必要です。`Filter` および `Parser` は、ログ記録を有効にするために必要ありません。

     また、希望の設定を使用して Amazon EC2 で Fluent Bit を実行し、検証によって発生する問題をトラブルシューティングすることもできます。以下のいずれかの例に従って、`ConfigMap` を作成します。
**重要**  
Amazon EKS Fargate のログ記録では、`ConfigMap` での動的設定をサポートしていません。`ConfigMap` に対する任意の変更は、新しい Pod に対してのみ適用されます。既存の Pod には、これらの変更は適用されません。

     例を使用して、必要なログ送信先用に `ConfigMap` を作成します。
**注記**  
また、Amazon Kinesis Data Streams をログの宛先として使用できます。Kinesis Data Streams を使用する場合は、ポッド実行ロールに `kinesis:PutRecords` 権限が付与されていることを確認してください。詳細については、「*Fluent Bit: 公式マニュアル*」の Amazon Kinesis Data Streams の「[許可](https://docs.fluentbit.io/manual/pipeline/outputs/kinesis#permissions)」を参照してください。  
**Example**  

------
#### [ CloudWatch ]

   CloudWatch を使用する場合、次の 2 つの出力オプションがあります。
   +  [C で記述された出力プラグイン](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/cloudwatch) 
   +  [Golang で記述された出力プラグイン](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit) 

   次の例は、`cloudwatch_logs` プラグインを使用して CloudWatch にログを送信する方法を示しています。

   1. 次の内容を `aws-logging-cloudwatch-configmap.yaml` という名前のファイルに保存します。*地域コード* を、クラスターのある AWS リージョンに置き換えます。`[OUTPUT]` のパラメータは必須です。

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        flb_log_cw: "false"  # Set to true to ship Fluent Bit process logs to CloudWatch.
        filters.conf: |
          [FILTER]
              Name parser
              Match *
              Key_name log
              Parser crio
          [FILTER]
              Name kubernetes
              Match kube.*
              Merge_Log On
              Keep_Log Off
              Buffer_Size 0
              Kube_Meta_Cache_TTL 300s
        output.conf: |
          [OUTPUT]
              Name cloudwatch_logs
              Match   kube.*
              region region-code
              log_group_name my-logs
              log_stream_prefix from-fluent-bit-
              log_retention_days 60
              auto_create_group true
        parsers.conf: |
          [PARSER]
              Name crio
              Format Regex
              Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
              Time_Key    time
              Time_Format %Y-%m-%dT%H:%M:%S.%L%z
      ```

   1. マニフェストをクラスターに適用します。

      ```
      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
      ```

------
#### [ Amazon OpenSearch Service ]

   ログを Amazon OpenSearch Service に送信したい場合、C で書かれたプラグインである、[es](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/elasticsearch) 出力を使用することができます。以下の例では、OpenSearch にログを送信するためにプラグインを使用する方法について説明します。

   1. 次の内容を `aws-logging-opensearch-configmap.yaml` という名前のファイルに保存します。各*サンプル値*は独自の値に置き換えます。

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        output.conf: |
          [OUTPUT]
            Name  es
            Match *
            Host  search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com
            Port  443
            Index example
            Type  example_type
            AWS_Auth On
            AWS_Region region-code
            tls   On
      ```

   1. マニフェストをクラスターに適用します。

      ```
      kubectl apply -f aws-logging-opensearch-configmap.yaml
      ```

------
#### [ Firehose ]

   Firehose にログを送信する場合、次の二つの出力オプションがあります。
   +  [kinesis\$1firehose](https://docs.fluentbit.io/manual/pipeline/outputs/firehose) – C 言語で記述された出力プラグイン。
   +  [firehose](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit) — Go 言語で記述された出力プラグイン。

     次の例は、Firehose にログを送信するために `kinesis_firehose` プラグインを使用する方法を示しています。

     1. 次の内容を `aws-logging-firehose-configmap.yaml` という名前のファイルに保存します。*region-code* を、クラスターのある AWS リージョンに置き換えます。

        ```
        kind: ConfigMap
        apiVersion: v1
        metadata:
          name: aws-logging
          namespace: aws-observability
        data:
          output.conf: |
            [OUTPUT]
             Name  kinesis_firehose
             Match *
             region region-code
             delivery_stream my-stream-firehose
        ```

     1. マニフェストをクラスターに適用します。

        ```
        kubectl apply -f aws-logging-firehose-configmap.yaml
        ```

------

1. 目的の宛先にログを送信できるように Fargate Pod 実行ロールに対するアクセス許可を設定します。

   1. 送信先の IAM ポリシーをコンピュータにダウンロードします。  
**Example**  

------
#### [ CloudWatch ]

      CloudWatch IAM ポリシーをコンピュータにダウンロードします。GitHub で[ポリシーの表示](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json)をすることもできます。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
      ```

------
#### [ Amazon OpenSearch Service ]

      OpenSearch IAM ポリシーをコンピュータにダウンロードします。GitHub で[ポリシーの表示](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json)をすることもできます。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json
      ```

      OpenSearch Dashboards のアクセスコントロールが適切に設定されていることを確認します。OpenSearch Dashboards の `all_access role` には、Fargate Pod 実行ロールと IAM ロールがマッピングされている必要があります。同様のマッピングが、`security_manager` ロールに対しても必要です。以前のマッピングを追加するには、`Menu`、`Security`、`Roles` の順にクリックした後、それぞれに対応するロールを選択します。詳細については、「[CloudWatch Logs が Amazon ES ドメインにストリーミングされるようにトラブルシューティングする方法を教えてください。](https://aws.amazon.com/tr/premiumsupport/knowledge-center/es-troubleshoot-cloudwatch-logs/)」を参照してください。

------
#### [ Firehose ]

      Firehose IAM ポリシーをコンピュータにダウンロードします。GitHub で[ポリシーの表示](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json)をすることもできます。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
      ```

------

   1. ダウンロードしたポリシーファイルから IAM ポリシーを作成します。

      ```
      aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
      ```

   1. 次のコマンドを使用して、Fargate プロファイルに指定されたポッド実行ロールに IAM ポリシーを添付します。*111122223333* は、ご自分のアカウント ID に置き換えます。*AmazonEKSFargatePodExecutionRole* を Pod 実行ロールに置き換えます (詳細については、「[ステップ 2: Fargate Pod 実行ロールを作成する](fargate-getting-started.md#fargate-sg-pod-execution-role)」を参照してください)。

      ```
      aws iam attach-role-policy \
        --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
        --role-name AmazonEKSFargatePodExecutionRole
      ```

### Kubernetes フィルターのサポート
<a name="fargate-logging-kubernetes-filter"></a>

Fluent Bit Kubernetes フィルターを使用すると、Kubernetes メタデータをログファイルに追加できます。フィルターの詳細については、Fluent Bit ドキュメントの [Kubernetes](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes) を参照してください。API サーバーエンドポイントを使用して、フィルターを適用できます。

```
filters.conf: |
    [FILTER]
        Name             kubernetes
        Match            kube.*
        Merge_Log           On
        Buffer_Size         0
        Kube_Meta_Cache_TTL 300s
```

**重要**  
 `Kube_URL`、`Kube_CA_File`、`Kube_Token_Command`、および `Kube_Token_File` はサービス所有の設定パラメータであるため、指定しないでください。Amazon EKS Fargate がこれらの値を設定します。
 `Kube_Meta_Cache_TTL` は、Fluent Bit が最新のメタデータを取得するために API サーバーと通信するまで待機する時間です。`Kube_Meta_Cache_TTL` が指定されていない場合、Amazon EKS Fargate は API サーバーの負荷を軽減するためにデフォルト値である 30 分を追加します。

### Fluent Bit プロセスログをアカウントに送付するには
<a name="ship-fluent-bit-process-logs"></a>

必要に応じて、Fluent Bit プロセスログは、以下の `ConfigMap` を使用して Amazon CloudWatch に送付できます。Fluent Bit プロセスログを CloudWatch に送信するには、追加のログの取り込みおよびストレージのコストがかかります。*region-code* を、クラスターのある AWS リージョンに置き換えます。

```
kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: aws-observability
  labels:
data:
  # Configuration files: server, input, filters and output
  # ======================================================
  flb_log_cw: "true"  # Ships Fluent Bit process logs to CloudWatch.

  output.conf: |
    [OUTPUT]
        Name cloudwatch
        Match kube.*
        region region-code
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true
```

ログは、CloudWatch 内のクラスターと同じ AWS リージョンにあります。ロググループ名は ` my-cluster-fluent-bit-logs` で、Fluent Bit のログストリーム名は `fluent-bit-podname-pod-namespace ` です。

**注記**  
プロセスログは、Fluent Bit プロセスが正常に開始された場合にのみ送付されます。Fluent Bit の起動中に障害が発生すると、プロセスログが失われます。プロセスログは CloudWatch にのみ送付できます。
送付プロセスログをアカウントにデバッグするには、前述の `ConfigMap` を適用してプロセスログを取得します。Fluent Bit が起動に失敗するのは、通常、起動中に `ConfigMap` が Fluent Bit によって解析または受け入れられていないためです。

### Fluent Bit プロセスログの送信を停止するには
<a name="stop-fluent-bit-process-logs"></a>

Fluent Bit プロセスログを CloudWatch に送信するには、追加のログの取り込みおよびストレージのコストがかかります。既存の `ConfigMap` 設定でプロセスログを除外するには、次のステップを実行します。

1. Fargate ログ記録を有効にした後、Amazon EKS クラスターの Fluent Bit プロセスログ用に自動的に作成された CloudWatch ロググループを見つけます。これはフォーマット ` my-cluster-fluent-bit-logs` に従います。

1. CloudWatch ロググループ内の各 Pod のプロセスログ用に作成された既存の CloudWatch ログストリームを削除します。

1. `ConfigMap` を編集して `flb_log_cw: "false"` を設定します。

1. クラスター内の既存の Pod を再起動します。

## アプリケーションをテストする
<a name="fargate-logging-test-application"></a>

1. サンプル Pod をデプロイします。

   1. 次の内容をコンピュータ上の `sample-app.yaml` という名前のファイルに保存します。

      ```
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sample-app
        namespace: same-namespace-as-your-fargate-profile
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
              - name: nginx
                image: nginx:latest
                ports:
                  - name: http
                    containerPort: 80
      ```

   1. マニフェストをクラスターに適用します。

      ```
      kubectl apply -f sample-app.yaml
      ```

1. `ConfigMap` で設定した送信先を使用して、NGINX ログを表示します。

## サイズに関する考慮事項
<a name="fargate-logging-size-considerations"></a>

ログルーター用のメモリは、最大 50 MBに収まるようにすることをお勧めします。アプリケーションで非常に高いスループットでログが生成されることが予想される場合は、最大 100 MB を想定して計画する必要があります。

## トラブルシューティング
<a name="fargate-logging-troubleshooting"></a>

`ConfigMap` が無効になっているなど、何らかの理由でログ機能が有効または無効になっているかどうか、および無効になっている理由を確認するには、Pod イベントを `kubectl describe pod pod-name ` でチェックしてください。出力には、次の出力例のように、ロギングが有効かどうかを明確にする Pod イベントが含まれる場合があります。

```
[...]
Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
[...]
Events:
  Type     Reason           Age        From                                                           Message
  ----     ------           ----       ----                                                           -------
  Warning  LoggingDisabled  <unknown>  fargate-scheduler                                              Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
```

Pod イベントは一時的なもので、その期間は設定によります。`kubectl describe pod pod-name ` を使用して Pod のアノテーションを表示することもできます。Pod アノテーションには、ロギング機能が有効か無効かとその理由に関する情報があります。

# 最適な Amazon EC2 ノードインスタンスタイプを選択する
<a name="choosing-instance-type"></a>

Amazon EC2 では、ワーカーノード用のインスタンスタイプが幅広く用意されています。インスタンスタイプごとに、コンピューティング、メモリ、ストレージの異なる機能が提供されます。また、各インスタンスファミリーは、これらの機能に基づきグループ化されています。リストについては、*「Amazon EC2 ユーザーガイド」*の「[利用可能なインスタンスタイプ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#AvailableInstanceTypes)」を参照してください。Amazon EKS は、(特定の) サポートを有効にするために、Amazon EC2 AMI のいくつかのバリエーションをリリースしています。選択したインスタンスタイプに Amazon EKS との互換性があることを確認する際は、次の基準を考慮してください。
+ `mac` ファミリは、現在、すべての Amazon EKS AMI でサポートされていません。
+ Arm およびアクセラレータ付きではない Amazon EKS AMI では、`g3`、`g4`、`inf`、および `p` ファミリはサポートされません。
+ アクセラレータ付き Amazon EKS AMI は、`a`、`c`、`hpc`、`m`、および `t` ファミリをサポートしていません。
+ Arm ベースのインスタンスの場合、Amazon Linux 2023 (AL2023) は Graviton2 以降のプロセッサを使用するインスタンスタイプのみをサポートします。AL2023 は `A1` インスタンスをサポートしていません。

Amazon EKS でサポートされているインスタンスタイプを選択する場合は、各タイプで次の機能を考慮してください。

 **ノードグループ内のインスタンス数**   
特に多くの DaemonSet が存在する場合などは、一般的に、数少ない大型のインスタンスの使用が適しています。各インスタンスには API サーバーへの API コールが必要です。したがって、インスタンス数が多いほど、API サーバーのロードが高くなります。

 **オペレーティングシステム**   
[Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)、[Windows](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instance-types.html)、および [Bottlerocket](https://aws.amazon.com/bottlerocket/faqs/) に対応しているインスタンスタイプを確認します。Windows インスタンスを作成する前に、「[Deploy Windows nodes on EKS clusters](windows-support.md)」を確認してください。

 **ハードウェアアーキテクチャ**   
x86 または Arm のどちらが必要か検討します。Arm インスタンスをデプロイする前に、「[Amazon EKS optimized Arm Amazon Linux AMIs](eks-optimized-ami.md#arm-ami)」を確認してください。Nitro System ([Linux](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/accelerated-computing-instances.html) または [Windows](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances)) 上に構築されたインスタンス、または[アクセラレータ付き](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instance-types.html#ec2-nitro-instances)機能が必要かを検討します。アクセラレータ付き機能は、Linux の Amazon EKS でのみ使用できます。

 **Pod の最大数**   
各 Pod には独自の IP アドレスが割り当てられているため、インスタンスタイプでサポートされている IP アドレスの数が、インスタンスで実行できる Pod の数を決定するための要因になります。インスタンスタイプがサポートする Pod の数を手動で確認するには、「」を参照してください。  
 [AWS Nitro システム](https://aws.amazon.com/ec2/nitro/)のインスタンスタイプには、サポートできる IP アドレスの数を、非 Nitro のシステムのインスタンスタイプよりも大幅に多くできるオプションがあります。ただし、インスタンスに割り当てられたすべての IP アドレスが Pod で使用できるわけではありません。インスタンスに割り当てる IP アドレスの数を大幅に増やすには、クラスターにバージョン `1.9.0` 以降の Amazon VPC CNI アドオンをインストールし、適切に設定する必要があります。詳細については、「[プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす](cni-increase-ip-addresses.md)」を参照してください。インスタンスに最大数の IP アドレスを割り当てるには、バージョン `1.10.1` 以降の Amazon VPC CNI アドオンをクラスターにインストールし、`IPv6` ファミリーを使用してそのクラスターをデプロイする必要があります。

 **IP ファミリー**   
クラスターで `IPv4` ファミリーを使用している場合、サポートされているすべてのインスタンスタイプが使用可能になります。これによりクラスターは、プライベート `IPv4` アドレスを Pod とサービスに割り当てることができます。ただし、クラスターに `IPv6` ファミリを使用する場合は、[AWS Nitro システム](https://aws.amazon.com/ec2/nitro/)インスタンスタイプ、またはベアメタルインスタンスタイプを使用する必要があります。Windows インスタンスでは、`IPv4` のみがサポートされています。クラスターでは、バージョン `1.10.1` 以降の Amazon VPC CNI アドオンを実行している必要があります。`IPv6` の使用の詳細については、「[クラスター、Pod、サービスに対する IPv6 アドレスの説明](cni-ipv6.md)」を参照してください。

 **実行している Amazon VPC CNI アドオンのバージョン**   
最新バージョンの [Amazon VPC CNI Plugin for Kubernetes](https://github.com/aws/amazon-vpc-cni-k8s) は、[こちらのインスタンスタイプ](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go)をサポートしています。サポートされている最新のインスタンスタイプを利用するには、Amazon VPC CNI アドオンのバージョンを更新する必要があります。詳細については、「[Amazon VPC CNI を使用して Pod に IP を割り当てる](managing-vpc-cni.md)」を参照してください。最新バージョンでは、Amazon EKS で使用できる最新の機能をサポートしています。以前のバージョンでは、すべての機能がサポートされているわけではありません。さまざまなバージョンでサポートされている機能は、GitHub の [Changelog](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/CHANGELOG.md) で確認できます。

 **ノードを作成している AWS リージョン**   
AWS リージョンによっては使用できないインスタンスタイプがあります。

 **Pod にセキュリティグループを使用しているかどうか**   
Pod にセキュリティグループを使用している場合は、特定のインスタンスタイプのみがサポートされます。詳細については、「[セキュリティグループを個別の Pod に割り当てる](security-groups-for-pods.md)」を参照してください。

## maxPods の決定方法
<a name="max-pods-precedence"></a>

ノードに適用される最終 `maxPods` 値は、特定の優先順位で相互作用する複数のコンポーネントによって異なります。この優先順位を理解することで、`maxPods` をカスタマイズする際に予期しない動作を回避できます。

 **優先順位 (最高から最低):** 

1.  **マネージド型ノードグループの適用** – [カスタム AMI](launch-templates.md#launch-template-custom-ami) なしでマネージド型ノードグループを使用する場合、Amazon EKS はノードのユーザーデータの `maxPods` に上限を適用します。vCPU が 30 未満のインスタンスの場合、上限は `110` です。vCPU が 30 を超えるインスタンスの場合、上限は `250` です。この値は、`maxPodsExpression` を含む他の `maxPods` 設定よりも優先されます。

1.  **kubelet `maxPods` 設定** – kubelet 設定で直接 `maxPods` を設定する場合 (カスタム AMI を使用した起動テンプレートなど)、この値は `maxPodsExpression` よりも優先されます。

1.  **nodeadm `maxPodsExpression` ** – `NodeConfig` で [https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/examples/#defining-a-max-pods-expression](https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/examples/#defining-a-max-pods-expression) を使用する場合、nodeadm は式を評価して `maxPods` を計算します。これは、値がより優先順位の高いソースによってすでに設定されていない場合にのみ有効です。

1.  **デフォルトの ENI ベースの計算** – 他の値が設定されていない場合、AMI はそのインスタンスタイプでサポートされている Elastic Network Interface と IP アドレスの数に基づいて `maxPods` を計算します。これは式 `(number of ENIs × (IPs per ENI − 1)) + 2` と同等です。`+ 2` は、ポッド IP アドレスを消費しないすべてのノードで実行される Amazon VPC CNI と `kube-proxy` を表します。

**重要**  
マネージド型ノードグループを使用して `NodeConfig` で `maxPodsExpression` を設定すると、マネージド型ノードグループの適用によって式が上書きされます。マネージド型ノードグループでカスタム `maxPods` 値を使用するには、起動テンプレートでカスタム AMI を指定し、`maxPods` を直接設定する必要があります。詳細については、「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」を参照してください。

 **マネージド型ノードグループとセルフマネージド型ノードの比較** 

マネージド型ノードグループ (カスタム AMI なし) では、Amazon EKS はノードのブートストラップユーザーデータに `maxPods` 値を挿入します。つまり、次のようになります。
+ `maxPods` 値は常にインスタンスサイズに応じて `110` または `250` に制限されます。
+ 設定するすべての `maxPodsExpression` は、この挿入された値によって上書きされます。
+ 別の `maxPods` 値を使用するには、起動テンプレートでカスタム AMI を指定し、`--use-max-pods false` を `--kubelet-extra-args '--max-pods=my-value'` と一緒に `bootstrap.sh` スクリプトに渡します。例については「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」を参照してください。

セルフマネージド型ノードを使用すると、ブートストラッププロセスを完全に制御できます。`NodeConfig` で `maxPodsExpression` を使用するか、もしくは `--max-pods` を `bootstrap.sh` に直接渡すことができます。

## EKS Auto Mode に関する考慮事項
<a name="_considerations_for_eks_auto_mode"></a>

EKS Auto Mode では、ノード上のポッドの数が以下のいずれか低い方に制限されます。
+ ハード上限の 110 ポッド
+ 上記の最大ポッド数計算の結果。

# 事前構築済みの最適化されたイメージを使用してノードを作成する
<a name="eks-optimized-amis"></a>

マネージドノードグループまたはセルフマネージド型ノードを使用する場合、事前に構築された Amazon EKS 最適化 [Amazon マシンイメージ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) (AMI)、または独自のカスタム AMI のいずれかを使用してノードをデプロイできます。ハイブリッドノードを実行している場合は、「[ハイブリッドノード用のオペレーティングシステムを準備する](hybrid-nodes-os.md)」を参照してください。Amazon EKS 最適化 AMI の各タイプの詳細については、以下のいずれかのトピックを参照してください。独自のカスタム AMI を作成する手順については、「[EKS に最適化されたカスタム Amazon Linux AMI の構築](eks-ami-build-scripts.md)」を参照してください。

Amazon EKS Auto Mode では、EKS は AMI の選択と更新を含め EC2 インスタンスを管理します。

**Topics**
+ [EKS AL2 AMI と AL2 高速化 AMI の移行機能ガイド](eks-ami-deprecation-faqs.md)
+ [最適化された Amazon Linux AMI を使用してノードを作成する](eks-optimized-ami.md)
+ [最適化された Bottlerocket AMI を使用してノードを作成する](eks-optimized-ami-bottlerocket.md)
+ [最適化された Ubuntu Linux AMI を使用してノードを作成する](eks-partner-amis.md)
+ [最適化された Windows AMI を使用してノードを作成する](eks-optimized-windows-ami.md)

# EKS AL2 AMI と AL2 高速化 AMI の移行機能ガイド
<a name="eks-ami-deprecation-faqs"></a>

**警告**  
Amazon EKS は、2025 年 11 月 26 日に、EKS 最適化 Amazon Linux 2 (AL2) AMI の公開を取り止めました。Amazon EKS 用の AL2023 および Bottlerocket ベースの AMI は、バージョン 1.33 以降をはじめサポート対象のすべての Kubernetes で使用できます。

 AWS は、EKS AL2 最適化 AMI と AL2 高速化 AMI に対するサポートを、2025 年 11 月 26 日に終了します。お客様は、こちらのサポート終了 (EOS) の日付 (2025 年 11 月 26 日) 以降も EKS AL2 AMI をご使用いただけますが、EKS はこの日以降、新しい Kubernetes バージョンや AL2 AMI の更新 (マイナーリリース、パッチ、バグ修正を含む) をリリースすることはありません。当社はお客様に、Amazon Linux 2023 (AL2023) または Bottlerocket AMI へのアップグレードを推奨しています。
+ AL2023 では、事前設定済みのセキュリティポリシー、SELinux の Permissive モード、IMDSv2 専用モードのデフォルトでの有効化、起動時間の最適化、セキュリティとパフォーマンスを向上させるパッケージ管理の改良によって、OS レベルの直接アクセスや広範なノード変更など大幅なカスタマイズを必要とするインフラストラクチャに最適な、セキュリティの機能や設定をデフォルトで組み込んだ「セキュアバイデフォルト」のアプローチを実現しています。詳細については、「[Amazon Linux 2023 に関するよくある質問](https://aws.amazon.com/linux/amazon-linux-2023/faqs/)」を参照するか、「[Amazon Linux 2 から Amazon Linux 2023 にアップグレードする](al2023.md)」にある詳細な移行ガイダンスを参照してください。
+ Bottlerocket は、ノードのカスタマイズを最小限に抑えたコンテナネイティブアプローチに最適な、専用のコンテナ最適化設計により、セキュリティの強化や起動時間の短縮、アタックサーフェスの縮小を実現して、効率の向上を可能にします。詳細については、「[Bottlerocket に関するよくある質問](https://aws.amazon.com/bottlerocket/faqs/)」を参照するか、「[最適化された Bottlerocket AMI を使用してノードを作成する](eks-optimized-ami-bottlerocket.md)」にある詳細な移行ガイダンスを参照してください。

または、EOS 日 (2025 年 11 月 26 日) までは、[EKS に最適化されたカスタム Amazon Linux AMI の構築](eks-ami-build-scripts.md)が可能です。また、Amazon Linux 2 の EOS 日 (2026 年 6 月 30 日) までは、Amazon Linux 2 ベースインスタンスを使用してカスタムの AMI を構築することができます。

## 移行とサポートに関するよくある質問
<a name="_migration_and_support_faqs"></a>

### AL2 から AL2023 AMI に移行するにはどうすればよいですか?
<a name="_how_do_i_migrate_from_my_al2_to_an_al2023_ami"></a>

詳細なアプリケーションワークロードテストと文書化されたロールバック手順を含む移行計画を作成、実装し、EKS の公式ドキュメントの「[Amazon Linux 2 から Amazon Linux 2023 にアップグレードする](https://docs.aws.amazon.com/eks/latest/userguide/al2023.html)」の手順に従うことが推奨されます。

### EKS 最適化 AL2 AMI の EKS サポート終了 (EOS) 日以降に、カスタム AL2 AMI を構築することは可能ですか?
<a name="_can_i_build_a_custom_al2_ami_past_the_eks_end_of_support_eos_date_for_eks_optimized_al2_amis"></a>

当社は、AL2023 または Bottlerocket 用として正式にサポートされ公開されている EKS 最適化 AMI に移行されることを推奨しますが、EKS AL2 最適化 AMI と AL2 高速化 AMI は、AL2 AMI の EOS 日 (2025 年 11 月 26 日) まで構築することが可能です。また、Amazon Linux 2 の EOS 日 (2026 年 6 月 30 日) までは、Amazon Linux 2 ベースインスタンスを使用してカスタムの AMI を構築することができます。カスタム EKS AL2 最適化 AMI および AL2 高速化 AMI の構築手順については、EKS 公式ドキュメント内の「[カスタム Amazon Linux AMI を構築する](https://docs.aws.amazon.com/eks/latest/userguide/eks-ami-build-scripts.html)」を参照してください。

### EKS Kubernetes のバージョンサポートポリシーは、Amazon Linux ディストリビューションに適用されますか?
<a name="_does_the_eks_kubernetes_version_support_policy_apply_to_amazon_linux_distributions"></a>

適用されません。EKS AL2 最適化 AMI と AL2 高速化 AMI の EOS 日は、EKS による Kubernetes バージョンの標準サポートおよび延長サポートのスケジュールとは無関係です。EKS の延長サポートをご利用いただいている場合でも、AL2023 または Bottlerocket への移行が必要になります。

### cgroupv1 から cgroupv2 に変更すると、自分の移行にどのような影響が及びますか?
<a name="_how_does_the_shift_from_cgroupv1_to_cgroupv2_affect_my_migration"></a>

[Kubernetes コミュニティ](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/4569-cgroup-v1-maintenance-mode/README.md)は、`cgroupv1` サポート (AL2 で使用) をメンテナンスモードに移行しました。つまり、今後は新機能は追加されず、重要なセキュリティ修正およびバグ修正のみが行われます。`cgroupv2` を Kubernetes に導入するには、OS、カーネル、コンテナランタイム、Kubernetes コンポーネント間で互換性を確保する必要があります。そのためには、AL2023、Bottlerocket、Red Hat Enterprise Linux (RHEL) 9\$1、Ubuntu 22.04\$1、Debian 11\$1 など、`cgroupv2` をデフォルトで有効にする Linux ディストリビューションが必要になります。これらのディストリビューションにはカーネルバージョン 5.8 以降が付属しています。こちらは Kubernetes で `cgroupv2` をサポートするための最小要件です。詳細については「[About cgroup v2](https://kubernetes.io/docs/concepts/architecture/cgroups/)」を参照してください。

### カスタム AL2 AMI で Neuron が必要な場合、どうすればよいですか?
<a name="_what_do_i_do_if_i_need_neuron_in_my_custom_al2_ami"></a>

AL2 ベースの AMI では、完全に Neuron をベースとするアプリケーションをネイティブに実行することはできません。AL2 AMI で AWS Neuron を使用する場合は、Neuron がサポートしているコンテナを使って、非 AL2 Linux ディストリビューション (Ubuntu 22.04、Amazon Linux 2023 など) でアプリケーションをコンテナ化し、そのコンテナを Neuron ドライバー (`aws-neuronx-dkms`) がインストールされた AL2 ベースの AMI にデプロイする必要があります。

### EKS AL2 AMI の EOS 日 (2025 年 11 月 26 日) 以降に、ベア Amazon Linux 2 ベースインスタンスに切り替える必要がありますか。
<a name="_should_i_switch_to_a_bare_amazon_linux_2_base_instance_after_the_eks_al2_ami_eos_date_november_26_2025"></a>

ベア Amazon Linux 2 ベースインスタンスに切り替えると、公式の EKS AL2 最適化 AMI および AL2 高速 AMI が提供する、特定の最適化、コンテナランタイム設定、カスタマイズが利用できません。そのため、AL2 ベースのソリューションを引き続き使用する必要がある場合は、「[EKS に最適化されたカスタム Amazon Linux AMI の構築](eks-ami-build-scripts.md)」または「[Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami)」にある EKS AMI レシピを使用して、カスタム AMI を構築することをお勧めします。これにより、既存のワークロードとの互換性が確保され、Amazon Linux 2 の EOS 日 (2026 年 6 月 30 日) まで AL2 カーネルの更新が含まれます。

### EKS AL2 AMI の EOS 日 (2025 年 11 月 26 日) 以降に EKS AMI GitHub リポジトリを使用してカスタム AL2 AMI を構築する場合、amzn2-core や amzn2extra-docker などのリポジトリからのパッケージには、どのようなサポートが提供されますか。
<a name="_when_building_a_custom_al2_ami_using_the_eks_ami_github_repository_after_the_eks_al2_ami_eos_date_november_26_2025_what_support_is_available_for_packages_from_repositories_like_amzn2_core_and_amzn2extra_docker"></a>

[Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami) にある EKS AMI レシピは、[amzn2-core](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html) や [amzn2extra-docker](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html) などの標準的な Amazon Linux 2 ソフトウェアから、YUM 経由でパッケージを取得します。EKS AL2 AMI の EOS 日 (2025 年 11 月 26 日) 以降も、これらのソフトウェアは、Amazon Linux 2 の EOS 日 (2026 年 6 月 30 日) まで引き続きサポートされます。この期間中のサポートはカーネル更新に限定されるため、セキュリティと互換性を維持するには、その他のパッケージ更新、セキュリティパッチ、およびカーネル以外の依存関係を手動で管理し、適用する必要があります。

### Amazon EKS で AL2023 を使用している環境において、JDK8 の古いバージョンを使用する Java アプリケーションが Out of Memory (OOM) 例外やポッドの再起動を経験するのはなぜですか。また、どのように解決できますか。
<a name="_why_might_java_applications_using_older_versions_of_jdk8_on_amazon_eks_with_al2023_experience_out_of_memory_oom_exceptions_and_pod_restarts_and_how_can_this_be_resolved"></a>

AL2023 を使用する Amazon EKS ノード上で実行する場合、`jdk8u372` より前の JDK 8 バージョンに依存する Java アプリケーションでは、JVM が `cgroupv2` と互換性がないため、OOM 例外やポッドの再起動が発生する可能性があります。この問題は、Amazon Linux 2023 のデフォルトである `cgroupv2` を使用したコンテナのメモリ制限を、JVM が検出できないことに起因します。その結果、JVM は、ポッドで定義された制限ではなく、ノードの合計メモリに基づいてヒープ割り当てを行います。これは、`cgroupv2` によってメモリ制限データの保存場所が変更されたことで、古い Java バージョンが使用可能なメモリを誤って読み取り、ノードレベルのリソースを前提としてしまうためです。考えられる対応策として、次のようなものがあります。
+  **JDK バージョンのアップグレード**: `jdk8u372` 以降、または `cgroupv2` を完全にサポートする新しい JDK バージョンにアップグレードすることで、この問題を解決できます。`cgroupv2` を完全にサポートする互換性のある Java バージョンのリストについては、「[cgroup v2 について](https://kubernetes.io/docs/concepts/architecture/cgroups/)」を参照してください。
+  **カスタム AMI の構築**: AL2 ベースのソリューションを引き続き使用する必要がある場合は、「[EKS に最適化されたカスタム Amazon Linux AMI の構築](eks-ami-build-scripts.md)」または「[Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami)」を使用して、AL2 ベースのカスタム (2025 年 11 月 26 日まで) を構築できます。例えば、AL2 ベースの v1.33 AMI (2025 年 11 月 26 日まで) を構築できます。Amazon EKS は、EKS AL2 の EOS 日 (2025 年 11 月 26 日) まで AL2 ベースの AMI を提供します。EOS 日 (2025 年 11 月 26 日) 以降は、独自の AMI を構築する必要があります。
+  **cgroupv1 の有効化**: `cgroupv1` を引き続き使用する必要がある場合は、EKS AL2023 AMI で `cgroupv1` を有効にできます。有効にするには、`sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"` を実行し、システム (例えば、Amazon Linux 2023 を実行している EC2 インスタンスまたはノード) を再起動します。これにより、システムのブートパラメータが変更され (例えば、GRUB 設定にカーネルパラメータ「systemd.unified\$1cgroup\$1hierarchy=0」を追加して、systemd にレガシーの `cgroupv1` 階層を使用するように指示します)、`cgroupv1` が有効になります。この grubby コマンドの実行により、カーネルは `cgroupv1` を有効化し、`cgroupv2` を無効化した状態で起動するよう再構成される点に注意してください。これらの cgroup バージョンのうち、ノードでアクティブなリソース管理に使用されるのはいずれか一方のみです。これは、`cgroupv1` API に対する下位互換性を備えた `cgroupv2` を実行することとは異なります。

**警告**  
引き続き `cgroupv1` を使用することはお勧めしません。代わりに、`cgroupv2` に移行することをお勧めします。Kubernetes コミュニティは、`cgroupv1` サポート (AL2 で使用) をメンテナンスモードに移行しました。つまり、今後は新機能や更新は追加されず、重要なセキュリティ修正およびバグ修正のみが行われます。`cgroupv1` サポートの完全な削除は今後のリリースで予定されていますが、この完全削除の具体的な日付はまだ発表されていません。`cgroupv1` で問題が発生した場合、AWS はサポートを提供できないため、`cgroupv2` にアップグレードすることをお勧めします。

## 互換性とバージョン
<a name="_compatibility_and_versions"></a>

### AL2 AMI でサポートされている Kubernetes バージョン
<a name="_supported_kubernetes_versions_for_al2_amis"></a>

Kubernetes バージョン 1.32 は Amazon EKS が Amazon Linux 2 (AL2) AMI をリリースする最後のバージョンです。[サポートされている](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html) 1.32 までの Kubernetes バージョンに対して、EKS は、2025 年 11 月 26 日まで AL2 AMI (AL2\$1ARM\$164、AL2\$1x86\$164) と AL2 高速化 AMI (AL2\$1x86\$164\$1GPU) をリリースします。この日を過ぎると、EKS はすべての Kubernetes バージョンで AL2 最適化 AMI と AL2 高速化 AMI のリリースを停止します。EKS AL2 最適化 AMI と AL2 高速化 AMI の EOS 日は、EKS による Kubernetes バージョンの標準サポートおよび延長サポートのスケジュールとは無関係ですのでご注意ください。

### AL2、AL2023、Bottlerocket AMI でサポートされているドライバーと Linux カーネルバージョンの比較
<a name="_supported_drivers_and_linux_kernel_versions_comparison_for_al2_al2023_and_bottlerocket_amis"></a>


| コンポーネント | EKS AL2 AMI | EKS AL2023 AMI | EKS Bottlerocket AMI | 
| --- | --- | --- | --- | 
|  基本 OS の互換性  |  RHEL7/CentOS 7  |  Fedora/CentOS 9  |  該当なし  | 
|   [CUDA ユーザーモードドライバー](https://docs.nvidia.com/deploy/cuda-compatibility/why-cuda-compatibility.html#why-cuda-compatibility)   |  12.x  |  12.x、13.x  |  12.x、13.x  | 
|  NVIDIA GPU ドライバー  |  R570  |  R580  |  R570、R580  | 
|   AWS Neuron ドライバー  |  2.20 以降  |  2.20 以降  |  2.20 以降  | 
|  Linux Kernel  |  5.10  |  6.1、6.12  |  6.1、6.12  | 

NVIDIA ドライバーと CUDA の互換性の詳細については、[NVIDIA ドキュメント](https://docs.nvidia.com/datacenter/tesla/drivers/index.html#supported-drivers-and-cuda-toolkit-versions)を参照してください。

### AL2 AMI と AWS Neuron の互換性
<a name="shared_aws_neuron_compatibility_with_al2_amis"></a>

[AWS Neuron の 2.20 のリリース](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/release-notes/prev/rn.html#neuron-2-20-0-whatsnew)以降は、EKS AL ベースの AMI で使用される Neuron ランタイム (`aws-neuronx-runtime-lib`) では、Amazon Linux 2 (AL2) がサポートされなくなります。現在、Amazon Linux 2 をサポートしている AWS Neuron パッケージは、Neuron ドライバー (`aws-neuronx-dkms`) のみです。したがって、AL2 ベースの AMI では、Neuron をベースとするアプリケーションをネイティブに実行することはできません。AL2023 AMI で Neuron をセットアップする方法については、「[AWS Neuron Setup](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/general/setup/index.html#setup-guide-index)」のガイドを参照してください。

### Kubernetes と AL2 AMI の互換性
<a name="_kubernetes_compatibility_with_al2_amis"></a>

Kubernetes コミュニティは、`cgroupv1` サポート (AL2 で使用) をメンテナンスモードに移行しました。つまり、今後は新機能は追加されず、重要なセキュリティ修正およびバグ修正のみが行われます。cgroupv2 に依存する Kubernetes の機能 (MemoryQoS や拡張リソース分離など) は、AL2 では使用することができません。さらに、Amazon EKS Kubernetes バージョン 1.32 は、AL2 AMI をサポートする最後のバージョンとなります。最新の Kubernetes バージョンとの互換性を維持するため、当社は AL2023 または Bottlerocket への移行を推奨しています。これらは `cgroupv2` がデフォルトで有効になります。

### Linux バージョンと AL2 AMI の互換性
<a name="_linux_version_compatibility_with_al2_amis"></a>

Amazon Linux 2 (AL2) は、2026 年 6 月 30 日のサポート終了 (EOS) 日まで AWS でサポートされます。ただし、AL2 はリリースから長い時間が経過しているため、新しいアプリケーションや機能に対する、より広範な Linux コミュニティによるサポートは、ますます制限されています。AL2 AMI は [Linux カーネル 5.10](https://docs.aws.amazon.com/linux/al2/ug/kernel.html) をベースにしており、一方の AL2023 は [Linux カーネル 6.1](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2-kernel.html) を使用しています。AL2023 と異なり、AL2 はより広範な Linux コミュニティからのサポートが、制限されています。つまり、AL2 の古いカーネルバージョンと連携するには、アップストリームの多くの Linux パッケージやツールをバックポートする必要があります。最新の Linux 機能やセキュリティ強化機能の中には、カーネルが古いために使用できないものがあり、オープンソースのプロジェクトの多くが、5.10 などの古いカーネルバージョンのサポートを廃止するか制限しています。

### AL2023 に含まれていない非推奨パッケージ
<a name="_deprecated_packages_not_included_in_al2023"></a>

AL2023 に含まれていない、または AL2023 で変更された最も一般的なパッケージには、次のようなものがあります。
+ [Amazon Linux 2 の一部のソースバイナリパッケージ](https://docs.aws.amazon.com/linux/al2023/release-notes/removed-AL2023.6-AL2.html)は、Amazon Linux 2023 で利用できなくなりました。
+ Amazon Linux による、AL2023 のさまざまなバージョンのパッケージ ([amazon-linux-extras システム](https://repost.aws/questions/QUWGU3VFJMRSGf6MDPWn4tLg/how-to-resolve-amazon-linux-extras-in-al2023)など) のサポート方法が変更されています。
+  [Enterprise Linux (EPEL) の追加パッケージ](https://docs.aws.amazon.com/linux/al2023/ug/epel.html)は AL2023 ではサポートされていません。
+  [32-bit アプリケーション](https://docs.aws.amazon.com/linux/al2023/ug/deprecated-al2.html#deprecated-32bit-rpms)は AL2023 ではサポートされていません。

詳細については、「[AL2 と AL2023 の比較](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)」を参照してください。

### AL2、AL2023、Bottlerocket 間の FIPS 検証の比較
<a name="_fips_validation_comparison_across_al2_al2023_and_bottlerocket"></a>

Amazon Linux 2 (AL2)、Amazon Linux 2023 (AL2023)、Bottlerocket は、連邦情報処理標準 (FIPS) 適合性をサポートしています。
+ AL2 は FIPS 140-2 に基づいて認定され、AL2023 は FIPS 140-3 に基づいて認定されています。AL2023 で FIPS モードを有効にするには、Amazon EC2 インスタンスに必要なパッケージをインストールし、「[Enable FIPS Mode on AL2023](https://docs.aws.amazon.com/linux/al2023/ug/fips-mode.html)」に記載された手順に従って設定を行います。詳細については、「[Amazon Linux 2023 に関するよくある質問](https://aws.amazon.com/linux/amazon-linux-2023/faqs)」を参照してください。
+ Bottlerocket は、カーネルとユーザースペースのコンポーネントを、FIPS 140-3 Cryptographic Module Validation Program (暗号モジュール試験及び認証制度) に送信された暗号モジュールの使用に制限する、FIPS 専用のバリアントを提供します。

### EKS AMI ドライバーとバージョンの変更ログ
<a name="_eks_ami_driver_and_versions_changelog"></a>

EKS AMI のコンポーネントとそのバージョンのリストの完全版は、GitHub の「[Amazon EKS AMI Release Notes](https://github.com/awslabs/amazon-eks-ami/releases)」を参照してください。

# 最適化された Amazon Linux AMI を使用してノードを作成する
<a name="eks-optimized-ami"></a>

Amazon Elastic Kubernetes Service (Amazon EKS) は、Kubernetes ワーカーノードの実行に最適化された専用の Amazon マシンイメージ (AMI) を提供します。これらの EKS に最適化された Amazon Linux (AL) AMI は、クラスター内でのシームレスな統合とセキュリティを確保するために、`kubelet`、AWS IAM Authenticator、`containerd` などの重要なコンポーネントで事前設定されています。このガイドでは、使用可能な AMI バージョンの詳細を示すと共に、高速コンピューティングと Arm ベースのアーキテクチャ向けの専用オプションについて説明します。

## 考慮事項
<a name="ami-considerations"></a>
+ Amazon Linux のセキュリティまたはプライバシーに関するイベントを、[Amazon Linux セキュリティセンター](https://alas.aws.amazon.com/)で追跡できます。そのためには目的のバージョンのタブを選択してください。該当する RSS フィードをサブスクライブすることもできます。セキュリティおよびプライバシーイベントには問題の概要、影響を受けるパッケージ、および問題を修正するためにインスタンスを更新する方法などがあります。
+ 高速または Arm AMI をデプロイする前に、[Amazon EKS 最適化高速 Amazon Linux AMI](#gpu-ami) および [Amazon EKS 最適化 Arm Amazon Linux AMI](#arm-ami) の情報を確認してください。
+ Amazon EC2 `P2` インスタンスは、`NVIDIA` ドライバーバージョン 470 以前を必要とするため、Amazon EKS ではサポートされていません。
+ バージョン `1.30` 以降のクラスターで新しく作成されたマネージド型ノードグループは、ノードオペレーティングシステムとして自動的に AL2023 を使用するようデフォルトで設定されます。

## Amazon EKS 最適化高速 Amazon Linux AMI
<a name="gpu-ami"></a>

Amazon EKS 最適化高速 Amazon Linux (AL) AMI は、標準的な EKS 最適化 Amazon Linux AMI 上に構築されています。これは、Amazon EKS ノードのオプションのイメージとして機能し、GPU、[Inferentia](https://aws.amazon.com/machine-learning/inferentia/)、[Trainium](https://aws.amazon.com/machine-learning/trainium/) ベースのワークロードをサポートするよう設定されています。

詳細については、「[GPU インスタンス向けに EKS 最適化高速 AMI を使用する](ml-eks-optimized-ami.md)」を参照してください。

## Amazon EKS 最適化 Arm Amazon Linux AMI
<a name="arm-ami"></a>

Arm インスタンスは、ウェブサーバー、コンテナ化されたマイクロサービス、キャッシュフリート、および分散データストアといったスケールアウト型の Arm ベースアプリケーションにおいて、コストを大幅に削減します。クラスターに Arm ノードを追加する際には、次の考慮事項を確認してください。
+ クラスターが 2020 年 8 月 17 日より前にデプロイされている場合、クラスターの重要なアドオンマニフェストを 1 回だけアップグレードする必要があります。これは、クラスター内で使用中の各ハードウェアアーキテクチャのイメージを、Kubernetes が正しく取得できるようにするためです。クラスターのアドオン更新の詳細については、「[ステップ 1: アップグレードの準備をする](update-cluster.md#update-existing-cluster)」を参照してください。2020 年 8 月 17 日以降にクラスターをデプロイしている場合、ご使用の CoreDNS、`kube-proxy`、および Amazon VPC CNI Plugin for Kubernetes アドオンは、既にマルチアーキテクチャに対応しています。
+ Arm ノードにデプロイされたアプリケーションは、Arm 用にコンパイルする必要があります。
+ 既存のクラスターでデプロイ済みの DaemonSet がある場合、または新しいクラスターで Arm ノードと共にこれをデプロイする場合は、クラスター内のすべてのハードウェアアーキテクチャで DaemonSet が実行可能であることを確認します。
+ 同じクラスタ内で、Arm ノードグループと x86 ノードグループを実行することができます。その場合、Pod をデプロイできるハードウェアアーキテクチャを Kubernetes が認識できるようにするために、マルチアーキテクチャのコンテナイメージを Amazon Elastic Container Registry などのコンテナリポジトリにデプロイした上で、ノードセレクターをマニフェストに追加する作業も考慮に入れてください。詳細については、*Amazon ECR ユーザーガイド*の[マルチアーキテクチャイメージのプッシュ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-multi-architecture-image.html)と、ブログ記事 [Introducing multi-architecture container images for Amazon ECR](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr) を参照してください。

## 詳細情報
<a name="linux-more-information"></a>

Amazon EKS 最適化 Amazon Linux AMI の詳細については、以下のセクションを参照してください。
+ Amazon Linux をマネージド型ノードグループと使用するには、「[マネージドノードグループを使用してノードライフサイクルを簡素化する](managed-node-groups.md)」を参照してください。
+ セルフマネージド型の Amazon Linux ノードの起動には、「[推奨 Amazon Linux AMI ID を取得する](retrieve-ami-id.md)」を参照してください。
+ バージョンについては、「[Amazon Linux AMI のバージョン情報を取得する](eks-linux-ami-versions.md)」を参照してください。
+ Amazon EKS 最適化 Amazon Linux AMI の最新の ID を取得するには、「[推奨 Amazon Linux AMI ID を取得する](retrieve-ami-id.md)」を参照してください。
+ Amazon EKS 最適化 AMI の構築に使用されているオープンソーススクリプトについては、「[EKS に最適化されたカスタム Amazon Linux AMI の構築](eks-ami-build-scripts.md)」を参照してください。

# Amazon Linux 2 から Amazon Linux 2023 にアップグレードする
<a name="al2023"></a>

**警告**  
Amazon EKS は、2025 年 11 月 26 日に、EKS 最適化 Amazon Linux 2 (AL2) AMI の公開を取り止めました。Amazon EKS 用の AL2023 および Bottlerocket ベースの AMI は、バージョン 1.33 以降をはじめサポート対象のすべての Kubernetes で使用できます。

AL2023 は、クラウドアプリケーションに安全かつ安定した高パフォーマンス環境を提供するように設計された、Linux ベースのオペレーティングシステムです。これは Amazon Web Services の次世代 Amazon Linux であり、サポートされているすべての Amazon EKS バージョンで利用できます。

AL2023 には、AL2 に比べていくつかの改善点があります。詳細については、「*Amazon Linux 2023 ユーザーガイド*」の「[AL2 と AL2023 の比較](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)」を参照してください。AL2 からいくつかのパッケージが追加、アップグレード、削除されています。アップグレードする前に、AL2023 でアプリケーションをテストすることを強くお勧めします。AL2023 のパッケージに関するすべての変更の一覧については、「*Amazon Linux 2023 リリースノート*」の「[Amazon Linux 2023 でのパッケージ変更](https://docs.aws.amazon.com/linux/al2023/release-notes/compare-packages.html)」を参照してください。

これらの変更に加えて、以下の点に注意してください。
+ AL2023 では、YAML 設定スキーマを使用する新しいノード初期化プロセス `nodeadm` が導入されています。セルフマネージド型ノードグループまたは起動テンプレートを持つ AMI を使用している場合は、新しいノードグループの作成時に追加のクラスターメタデータを明示的に指定する必要があります。最低限必要なパラメータの[例](https://awslabs.github.io/amazon-eks-ami/nodeadm/)を以下に示します。ここで、`apiServerEndpoint`、`certificateAuthority`、サービスの `cidr` が必要になります。

  ```
  ---
  apiVersion: node.eks.aws/v1alpha1
  kind: NodeConfig
  spec:
    cluster:
      name: my-cluster
      apiServerEndpoint: https://example.com
      certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
      cidr: 10.100.0.0/16
  ```

  AL2 では、これらのパラメータからのメタデータは Amazon EKS `DescribeCluster` API コールから検出されていました。AL2023 ではノードの大規模なスケールアップ中に API コールによってスロットリングが発生するリスクがあるため、この動作が変更されました。この変更は起動テンプレートのないマネージド型ノードグループを使用している場合や、Karpenter を使用している場合には影響しません。`certificateAuthority` とサービス `cidr` の詳細については、「*Amazon EKS API リファレンス*」の「[https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html)」を参照してください。
+ AL2023 の場合、`nodeadm` は、[https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/api/#nodeconfigspec](https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/api/#nodeconfigspec) を使用して各ノードの `kubelet` にパラメータを適用する形式も変更します。AL2 では、これは `--kubelet-extra-args` パラメータを使用して行われました。これは一般的に、ノードにラベルとテイントを追加するために使用されます。以下の例は、ノードへの `maxPods` と `--node-labels` の適用を示しています。

  ```
  ---
  apiVersion: node.eks.aws/v1alpha1
  kind: NodeConfig
  spec:
    cluster:
      name: test-cluster
      apiServerEndpoint: https://example.com
      certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
      cidr: 10.100.0.0/16
    kubelet:
      config:
        maxPods: 110
      flags:
        - --node-labels=karpenter.sh/capacity-type=on-demand,karpenter.sh/nodepool=test
  ```
+ AL2023 には Amazon VPC CNI バージョン `1.16.2` 以降が必要です。
+ AL2023 にはデフォルトで `IMDSv2` が必要です。`IMDSv2` には、セキュリティ体制の改善に役立ついくつかの利点があります。セッション指向の認証方式を使用しており、セッションを開始するためにシンプルな HTTP PUT リクエストでシークレットトークンを作成する必要があります。セッショントークンの有効期間は 1 秒～ 6 時間です。`IMDSv1` から `IMDSv2` への移行方法の詳細については、「[インスタンスメタデータサービスバージョン 2 の使用への移行](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-transition-to-version-2.html)」および「[Get the full benefits of IMDSv2 and disable IMDSv1 across your AWS infrastructure](https://aws.amazon.com/blogs/security/get-the-full-benefits-of-imdsv2-and-disable-imdsv1-across-your-aws-infrastructure)」を参照してください。`IMDSv1` を使用する場合は、インスタンスのメタデータオプションの起動プロパティで設定を手動で上書きすることで使用可能になります。
**注記**  
AL2023 を使用する `IMDSv2` の場合、マネージドノードグループのデフォルトのホップ数は異なる場合があります。  
起動テンプレートを使用しない場合、デフォルトは `1` に設定されます。つまり、コンテナが IMDS を使用してノードの認証情報にアクセスすることはできません。ノードの認証情報へのコンテナアクセスが必要な場合は、[カスタム Amazon EC2 起動テンプレート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html)を使用するとアクセスが可能になります。
起動テンプレートでカスタム AMI を使用する場合、デフォルト `HttpPutResponseHopLimit` は `2` に設定されます。起動テンプレートの `HttpPutResponseHopLimit` を手動で上書きできます。
または、`IMDSv2` の代わりに [Amazon EKS Pod Identity](pod-identities.md) を使用して、認証情報を提供することもできます。
+ AL2023 は、次世代の統合コントロールグループ階層 (`cgroupv2`) を備えています。`cgroupv2` は、コンテナランタイムを実装するために `systemd` によって使用されます。AL2023 には、`cgroupv1` を使用してシステムを実行できるコードが引き続き含まれていますが、この設定は推奨されません。またサポート対象でもありません。この設定は、今後の Amazon Linux のメジャーリリースで完全に削除される予定です。
+  AL2023 をサポートするには、`eksctl` に `eksctl` のバージョン `0.176.0` 以降が必要です。

既存のマネージド型ノードグループの場合は、起動テンプレートの使用方法に応じて、インプレースアップグレードまたは Blue/Green アップグレードを実行できます。
+ マネージド型ノードグループでカスタム AMI を使用している場合は、起動テンプレートの AMI ID を入れ替えることで、インプレースアップグレードを実行できます。このアップグレード戦略を実行する前に、まずアプリケーションとユーザーデータが AL2023 に転送されていることを必ず確認してください。
+ 標準の起動テンプレートまたは AMI ID を指定しないカスタム起動テンプレートでマネージド型ノードグループを使用している場合は、Blue/Green 戦略を使用してアップグレードする必要があります。通常、Blue/Green アップグレードはより複雑で、AMI タイプとして AL2023 を指定する完全に新しいノードグループを作成する必要があります。新しいノードグループの設定は、AL2 ノードグループのすべてのカスタムデータが新しい OS と互換性があることを確認して、慎重に行う必要があります。新しいノードグループがアプリケーションでテストおよび検証されると、Pod を古いノードグループから新しいノードグループに移行できます。移行が完了したら、古いノードグループを削除できます。

Karpenter を利用していて、AL2023 を使用する場合は、`EC2NodeClass` `amiFamily` フィールドを AL2023 に変更する必要があります。デフォルトでは、Karpenter ではドリフトが有効になっています。つまり、`amiFamily` フィールドが変更されると、Karpenter はワーカーノードを使用可能な最新の AMI に自動的に更新します。

## nodeadm に関する追加情報
<a name="_additional_information_about_nodeadm"></a>

EKS 最適化 Amazon Linux 2023 AMI を利用する場合、または公式の amazon-eks-ami GitHub リポジトリで提供されている Packer スクリプトを使用してカスタム EKS Amazon Linux 2023 AMI を構築する場合は、EC2 ユーザーデータ内またはカスタム AMI の一部として nodeadm init を明示的に実行しないようにする必要があります。

ユーザーデータで動的 NodeConfig を生成する場合は、その設定を `/etc/eks/nodeadm.d` のドロップイン yaml または json ファイルに書き込むことができます。これらの設定ファイルは、nodeadm init が起動プロセスの後半で自動的に開始されると、マージされてノードに適用されます。例えば、次のようになります。

```
cat > /etc/eks/nodeadm.d/additional-node-labels.yaml << EOF
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  kubelet:
    flags:
      - --node-labels=foo=bar
EOF
```

EKS 最適化 Amazon Linux 2023 AMI は、個別の systemd サービスを通じて nodeadm init を 2 つのフェーズで自動的に実行します。nodeadm-config はユーザーデータの実行前に実行され、nodeadm-run は実行後に実行されます。nodeadm-config サービスは、ユーザーデータを実行する前に containerd と kubelet のベースライン設定を確立します。nodeadm-run サービスは、選択したシステムデーモンを実行し、ユーザーデータの実行後に最終的な設定を完了します。こうした自動実行以外にユーザーデータまたはカスタム AMI を介して nodeadm init コマンドが実行されると、実行順序に関する仮定が破られ、ENI の設定ミスなどの予期しない結果につながる可能性があります。

# Amazon Linux AMI のバージョン情報を取得する
<a name="eks-linux-ami-versions"></a>

Amazon EKS 最適化 Amazon Linux AMI は、Kubernetes バージョンと AMI のリリース日によって次の形式でバージョニングされています。

```
k8s_major_version.k8s_minor_version.k8s_patch_version-release_date
```

各 AMI リリースには、[kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)、Linux カーネル、[containerd](https://containerd.io/) のさまざまなバージョンが含まれます。また高速 AMI には、さまざまなバージョンの NVIDIA ドライバーも含まれます。このバージョンに関する情報は、GitHub の「[Changelog](https://github.com/awslabs/amazon-eks-ami/blob/main/CHANGELOG.md)」で確認できます。

# 推奨 Amazon Linux AMI ID を取得する
<a name="retrieve-ami-id"></a>

ノードをデプロイする際に、事前構築済みの Amazon EKS 最適化 Amazon マシンイメージ (AMI) の ID を指定できます。希望する設定に合った AMI ID を取得するには、AWS Systems Manager Parameter Store API をクエリします。この API を使用すると、Amazon EKS 最適化 AMI ID を手動で検索する必要がなくなります。詳細については、「[GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)」を参照してください。使用する [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)には、Amazon EKS 最適化 AMI メタデータを取得するための `ssm:GetParameter` IAM アクセス許可が必要です。

サブパラメータ `image_id` を指定する次のコマンドを使用することで、推奨される最新の Amazon EKS 最適化 Amazon Linux AMI のイメージ ID を取得できます。必要に応じてコマンドに次の変更を加え、変更したコマンドを実行してください：
+ `<kubernetes-version>` を [Amazon EKS がサポートする任意のバージョン](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)に置き換えます。
+ *ami-type* は、以下のいずれかのオプションに置き換えます。Amazon EC2 インスタンスタイプの詳細については、「[Amazon EC2 インスタンスタイプ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)」を参照してください。
  + Amazon Linux 2023 (AL2023) `x86` ベースのインスタンスには *amazon-linux-2023/x86\$164/standard* を使用します。
  + [AWS Graviton](https://aws.amazon.com/ec2/graviton/) ベースのインスタンスなどの AL2023 ARM インスタンスには *amazon-linux-2023/arm64/standard* を使用します。
  + 最新の承認済みの AL2023 NVIDIA `x86` ベースのインスタンスには、*amazon-linux-2023/x86\$164/nvidia* を使用します。
  + 最新の承認済みの AL2023 NVIDIA `arm64` ベースのインスタンスには、*amazon-linux-2023/arm64/nvidia* を使用します。
  + 最新の AL2023 [AWS Neuron](https://aws.amazon.com/machine-learning/neuron/) インスタンスには、*amazon-linux-2023/x86\$164/neuron* を使用します。
+ `<region-code>` を、AMI ID を必要とする [Amazon EKS がサポートされている AWS リージョン](https://docs.aws.amazon.com/general/latest/gr/eks.html)で置き換えます。

```
aws ssm get-parameter --name /aws/service/eks/optimized-ami/<kubernetes-version>/<ami-type>/recommended/image_id \
    --region <region-code> --query "Parameter.Value" --output text
```

プレースホルダーの置換が行われた後のコマンドの例を以下に示します。

```
aws ssm get-parameter --name /aws/service/eks/optimized-ami/1.31/amazon-linux-2023/x86_64/standard/recommended/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

出力例は次のとおりです。

```
ami-1234567890abcdef0
```

# EKS に最適化されたカスタム Amazon Linux AMI の構築
<a name="eks-ami-build-scripts"></a>

**警告**  
Amazon EKS は、2025 年 11 月 26 日に、EKS 最適化 Amazon Linux 2 (AL2) AMI の公開を取り止めました。Amazon EKS 用の AL2023 および Bottlerocket ベースの AMI は、バージョン 1.33 以降をはじめサポート対象のすべての Kubernetes で使用できます。

Amazon EKS では、「[Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami)」リポジトリにオープンソースのビルドスクリプトが用意されており、これらを使用して`kubelet`、ランタイム環境、AWS IAM Authenticator for Kubernetes の設定を確認し、AL ベースの AMI を一から構築できます。

このリポジトリには、ブート時に実行される特殊な [AL2 用 bootstrap スクリプト](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)と [AL2023 用 nodeadm ツール](https://awslabs.github.io/amazon-eks-ami/nodeadm/)が保存されています。これらのスクリプトによって、インスタンスの証明書データ、コントロールプレーンエンドポイント、クラスター名などを設定します。ここに置かれているものは、Amazon EKS 最適化 AMI のビルド用として最も信頼できるスクリプトと見なされるため、GitHub リポジトリの状態をフォローすることで、AMI への変更をモニタリングできます。

EKS 最適化 AMI をベースとしてカスタム AMI を構築する場合、コンポーネントの互換性が損なわれる可能性があるため、オペレーティングシステムのアップグレード (`dnf upgrade` など) を実行したり、EKS 最適化 AMI に含まれる Kubernetes または GPU パッケージをアップグレードしたりすることは、推奨もサポートもされていません。EKS 最適化 AMI に含まれるオペレーティングシステムまたはパッケージをアップグレードする場合は、本番環境にデプロイする前に、開発環境またはステージング環境で徹底的にテストすることをお勧めします。

GPU インスタンス用のカスタム AMI を構築する場合は、実行するインスタンスタイプの世代およびファミリーごとに、個別のカスタム AMI を構築することをお勧めします。EKS 最適化高速 AMI は、基盤となるインスタンスタイプの世代およびファミリーに基づいて、ランタイム時にドライバーとパッケージを選択的にインストールします。詳細については、[インストール](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2023/provisioners/install-nvidia-driver.sh)と[ランタイム](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2023/runtime/gpu/nvidia-kmod-load.sh)の EKS AMI スクリプトを参照してください。

## 前提条件
<a name="_prerequisites"></a>
+  [AWS CLI をインストールする](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) 
+  [HashiCorp Packer v1.9.4\$1 をインストールする](https://developer.hashicorp.com/packer/downloads) 
+  [GNU Make をインストールする](https://www.gnu.org/software/make/) 

## クイックスタート
<a name="_quickstart"></a>

このクイックスタートでは、AWS アカウントにカスタム AMI を作成するコマンドを示します。AMI のカスタマイズに使用できる設定の詳細については、「[Amazon Linux 2023](https://awslabs.github.io/amazon-eks-ami/usage/al2023/)」ページのテンプレート変数を参照してください。

### 前提条件
<a name="_prerequisites_2"></a>

必要な [Amazon プラグイン](https://developer.hashicorp.com/packer/integrations/hashicorp/amazon)をインストールします。例えば、次のようになります。

```
packer plugins install github.com/hashicorp/amazon
```

### ステップ 1. 環境をセットアップする
<a name="_step_1_setup_your_environment"></a>

公式の Amazon EKS AMI リポジトリをクローンまたはフォークします。例えば、次のようになります。

```
git clone https://github.com/awslabs/amazon-eks-ami.git
cd amazon-eks-ami
```

Packer がインストールされていることを確認します。

```
packer --version
```

### ステップ 2. カスタム AMI を作成する
<a name="_step_2_create_a_custom_ami"></a>

さまざまなカスタム AMI のコマンド例を以下に示します。

 **基本的な NVIDIA AL2 AMI** 

```
make k8s=1.31 os_distro=al2 \
  enable_accelerator=nvidia \
  nvidia_driver_major_version=560 \
  enable_efa=true
```

 **基本的な NVIDIA AL2023 AMI** 

```
make k8s=1.31 os_distro=al2023 \
  enable_accelerator=nvidia \
  nvidia_driver_major_version=560 \
  enable_efa=true
```

 **STIG 準拠 Neuron AL2023 AMI** 

```
make k8s=1.31 os_distro=al2023 \
  enable_accelerator=neuron \
  enable_fips=true \
  source_ami_id=ami-0abcd1234efgh5678 \
  kms_key_id=alias/aws-stig
```

これらのコマンドを実行すると、Packer によって次の操作が行われます。\$1 一時的な Amazon EC2 インスタンスを起動します。\$1 Kubernetes コンポーネント、ドライバー、設定をインストールします。\$1 AWS アカウントで AMI を作成します。

正常な出力は次の例のようになります。

```
==> Wait completed after 8 minutes 42 seconds

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9

--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9

--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9
```

### ステップ 3. デフォルト値を表示する
<a name="_step_3_view_default_values"></a>

デフォルト値と追加オプションを表示するには、次のコマンドを実行します。

```
make help
```

# 最適化された Bottlerocket AMI を使用してノードを作成する
<a name="eks-optimized-ami-bottlerocket"></a>

 [Bottlerocket](https://aws.amazon.com/bottlerocket/) は、AWS がスポンサーおよびサポートするオープンソースの Linux ディストリビューションです。Bottlerocket は、コンテナワークロードをホストするために専用に構築されています。Bottlerocket を使用すると、コンテナインフラストラクチャの更新を自動化することで、コンテナ化されたデプロイの可用性を向上させ、運用コストを削減できます。Bottlerocket には、コンテナの実行に不可欠なソフトウェアのみが含まれており、リソース使用率の向上、セキュリティ上の脅威の軽減、管理オーバーヘッドの軽減が実現されます。Bottlerocket AMI には、`containerd`、`kubelet`、および AWS IAM Authenticator が含まれます。Bottlerocket は、マネージド型ノードグループとセルフマネージド型ノードに加え、[Karpenter](https://karpenter.sh/) でもサポートされています。

## 利点
<a name="bottlerocket-advantages"></a>

Amazon EKS クラスターと Bottlerocket を使用すると次のようなメリットがあります。
+  **運用コストが低く、管理の複雑さが軽減されたことによるアップタイムの向上** – Bottlerocket は、他の Linux ディストリビューションよりもリソースフットプリントが小さく、ブート時間が短く、セキュリティ脅威に対する脆弱性が低くなります。Bottlerocket のフットプリントが小さいため、ストレージ、コンピューティング、ネットワークリソースの使用量が減り、コストを削減できます。
+  **OS の自動更新によるセキュリティの向上** — Bottlerocket への更新プログラムは単一のユニットとして適用され、必要に応じてロールバックできます。これにより、システムが使用不能な状態にさらす更新プログラムの破損または失敗のリスクをなくします。Bottlerocket を使用すると、セキュリティ更新プログラムが利用可能になり次第、中断を最小限に抑えながら自動的に適用され、障害が発生した場合はロールバックできます。
+  **プレミアムサポート** — Amazon EC2 で AWS が提供する Bottlerocket のビルドは、Amazon EC2、Amazon EKS、Amazon ECR などの AWS サービスも対象とする同じ AWS サポートプランの対象となります。

## 考慮事項
<a name="bottlerocket-considerations"></a>

Bottlerocket を AMI タイプに使用する際、次の事項を考慮してください。
+ Bottlerocket は、`x86_64` と `arm64` プロセッサを搭載した Amazon EC2 インスタンスをサポートします。
+ Bottlerocket は、GPU を搭載した Amazon EC2 インスタンスをサポートします。詳細については、「[GPU インスタンス向けに EKS 最適化高速 AMI を使用する](ml-eks-optimized-ami.md)」を参照してください。
+ Bottlerocket イメージには、SSH サーバーまたはシェルは含まれません。帯域外のアクセス方法を使用して SSH を許可できます。これらの手法は、管理者コンテナを有効にし、ユーザーデータでブートストラップの設定ステップの渡しを可能にします。詳細については、GitHub の「[Bottlerocket OS](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md)」内にある次のセクションを参照してください。
  +  [探査](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#exploration) 
  +  [管理者コンテナ](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#admin-container) 
  +  [Kubernetes 設定](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#kubernetes-settings) 
+ Bottlerocket は以下のさまざまなコンテナタイプを使用します。
  + デフォルトで、「[コントロールコンテナ](https://github.com/bottlerocket-os/bottlerocket-control-container)」は有効になっています。このコンテナは、Amazon EC2 Bottlerocket インスタンス上でのコマンドの実行や、シェルセッションの開始に使用できる [AWS Systems Manager エージェント](https://github.com/aws/amazon-ssm-agent)を実行します。詳細については、*AWS Systems Manager ユーザーガイド*の「[Session Manager のセットアップ](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html)」を参照してください。
  + ノードグループの作成時に SSH キーが与えられる場合、管理者コンテナが有効になります。admin container は、開発とテストのシナリオにのみ使用することをお勧めします。本番環境で使用することはお勧めしません。詳細については、GitHub の [Admin container](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#admin-container) を参照してください。

## 詳細情報
<a name="bottlerocket-more-information"></a>

Amazon EKS 最適化 Bottlerocket AMI の使用に関する詳細については、以下のセクションを参照してください。
+ Bottlerocket の詳細については、[Bottlerocket のドキュメント](https://bottlerocket.dev/en/)を参照してください。
+ バージョン情報のリソースについては、「[Bottlerocket AMI のバージョン情報を取得する](eks-ami-versions-bottlerocket.md)」を参照してください。
+ Bottlerocket をマネージド型ノードグループと使用するには、「[マネージドノードグループを使用してノードライフサイクルを簡素化する](managed-node-groups.md)」を参照してください。
+ セルフマネージド型の Bottlerocket ノードを起動するには、「[セルフマネージド Bottlerocket ノードの作成](launch-node-bottlerocket.md)」を参照してください。
+ Amazon EKS 最適化 Bottlerocket AMI の最新の ID を取得するには、「[推奨 Bottlerocket AMI ID を取得する](retrieve-ami-id-bottlerocket.md)」を参照してください。
+ コンプライアンスサポートの詳細については、「[Bottlerocket を使用してコンプライアンス要件に準拠する](bottlerocket-compliance-support.md)」を参照してください。

# Bottlerocket AMI のバージョン情報を取得する
<a name="eks-ami-versions-bottlerocket"></a>

各 Bottlerocket AMI リリースには、[kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)、Bottlerocket カーネル、[containerd](https://containerd.io/) のさまざまなバージョンが含まれます。また高速 AMI バリアントには、さまざまなバージョンの NVIDIA ドライバーも含まれます。このバージョン情報は、Bottlerocket のドキュメントの「[OS](https://bottlerocket.dev/en/os/)」のトピックで確認できます。このページから、該当する「Version Information」のサブトピックに移動します。

Bottlerocket のドキュメントは、GitHub で利用可能なバージョンよりも遅れることがあります。最新バージョンの変更のリストは、GitHub の「[Releases](https://github.com/bottlerocket-os/bottlerocket/releases)」で確認できます。

# 推奨 Bottlerocket AMI ID を取得する
<a name="retrieve-ami-id-bottlerocket"></a>

ノードをデプロイする際に、事前構築済みの Amazon EKS 最適化 Amazon マシンイメージ (AMI) の ID を指定できます。希望する設定に合った AMI ID を取得するには、AWS Systems Manager Parameter Store API をクエリします。この API を使用すると、Amazon EKS 最適化 AMI ID を手動で検索する必要がなくなります。詳細については、「[GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)」を参照してください。使用する [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)には、Amazon EKS 最適化 AMI メタデータを取得するための `ssm:GetParameter` IAM アクセス許可が必要です。

サブパラメータ `image_id` を使用する次の AWS CLI コマンドを使用することで、推奨される最新の Amazon EKS 最適化 Bottlerocket AMI のイメージ ID を取得できます。必要に応じてコマンドに次の変更を加え、変更したコマンドを実行してください：
+ *kubernetes-version* を、サポートされている [platform-version](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html) に置き換えます。
+ *-flavor* は、以下のいずれかのオプションに置き換えます。
  + GPU のないバリアントの場合は *-flavor* を削除します。
  + GPU 対応バリアントには *-nvidia* を使用します。
  + FIPS 対応バリアントには *-fips* を使用します。
+ *architecture* は、以下のいずれかのオプションに置き換えます。
  + `x86` ベースのインスタンスには *x86\$164* を使用します。
  + ARM インスタンスには *arm64* を使用します。
+ *region-code* を、AMI ID が必要な [Amazon EKS がサポートしている AWS リージョン](https://docs.aws.amazon.com/general/latest/gr/eks.html)に置き換えます。

```
aws ssm get-parameter --name /aws/service/bottlerocket/aws-k8s-kubernetes-version-flavor/architecture/latest/image_id \
    --region region-code --query "Parameter.Value" --output text
```

プレースホルダーの置換が行われた後のコマンドの例を以下に示します。

```
aws ssm get-parameter --name /aws/service/bottlerocket/aws-k8s-1.31/x86_64/latest/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

出力例は次のとおりです。

```
ami-1234567890abcdef0
```

# Bottlerocket を使用してコンプライアンス要件に準拠する
<a name="bottlerocket-compliance-support"></a>

Bottlerocket はさまざまな組織によって定義された推奨事項に準拠しています。
+ [CIS ベンチマーク](https://www.cisecurity.org/benchmark/bottlerocket)は Bottlerocket に定義されています。デフォルト設定では、Bottlerocket イメージには CIS レベル 1 構成プロファイルに必要なほとんどのコントロールが含まれています。CIS レベル 2 構成プロファイルに必要なコントロールを実装できます。詳細については、「AWS ブログ」の「[Amazon EKS に最適化された Bottlerocket AMI を CIS ベンチマークと照合して検証](https://aws.amazon.com/blogs/containers/validating-amazon-eks-optimized-bottlerocket-ami-against-the-cis-benchmark)」を参照してください。
+ 最適化された機能セットおよび最小化したアタックサーフェスは、攻撃対象領域が小さくなるため、Bottlerocket インスタンスが PCI DSS 要件を満たすために必要な構成が少なくて済みます。[Bottlerocket の CIS Benchmark](https://www.cisecurity.org/benchmark/bottlerocket) は、ガイダンスを強化するために優れたリソースであり、PCI DSS 要件 2.2 に基づく安全な構成標準の要件をサポートします。[Fluent Bit](https://opensearch.org/blog/technical-post/2022/07/bottlerocket-k8s-fluent-bit/) を活用して、PCI DSS 要件 10.2 に基づくオペレーティングシステムレベルの監査ログ記録の要件をサポートすることもできます。AWS は、PCI DSS 要件 6.2 (v3.2.1 用) および要件 6.3.3 (v4.0 用) を満たすために役立つ新しい (パッチが適用された) Bottlerocket インスタンスを定期的に公開します。
+ Bottlerocket は、Amazon EC2 および Amazon EKS の両方に規制対象のワークロードで使用が承認された HIPAA 対象の機能です。詳細については、「[コンプライアンスプログラムによる AWS 対象範囲内のサービス](https://aws.amazon.com/compliance/hipaa-eligible-services-reference/)」を参照してください。
+ Bottlerocket AMI はFIPS 140-3 検証済み暗号化モジュールを使用するように事前設定されています。これには Amazon Linux 2023 Kernel Crypto API 暗号化モジュールや AWS-LC 暗号化モジュールなどがあります。詳細については、「[Bottlerocket FIPS AMI を使用してワーカーノードを FIPS 対応にする](bottlerocket-fips-amis.md)」を参照してください。

# Bottlerocket FIPS AMI を使用してワーカーノードを FIPS 対応にする
<a name="bottlerocket-fips-amis"></a>

連邦情報処理規格 (Federal Information Processing Standards/FIPS) 公開情報 140-3 は、機密情報を保護する暗号モジュールのセキュリティ要件を規定する、米国およびカナダ政府の基準です。Bottlerocket からは、FIPS カーネルを備えた AMI が提供されており、これによって、FIPS への準拠が容易になります。

これらの AMI は、FIPS 140-3 検証済み暗号化モジュールを使用するように事前構成されています。これには Amazon Linux 2023 Kernel Crypto API 暗号化モジュールや AWS-LC 暗号化モジュールなどがあります。

Bottlerocket FIPS AMI を使用すると、ワーカーノードは「FIPS 対応」になりますが、自動的に「FIPS に準拠」するわけではありません。詳細については、「[連邦情報処理規格 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)」を参照してください。

## 考慮事項
<a name="_considerations"></a>
+ クラスターで分離サブネットを使用している場合、Amazon ECR FIPS エンドポイントにアクセスできない場合があります。これによって、ノードのブートストラップが失敗する可能性があります。ネットワーク設定で、必要な FIPS エンドポイントへのアクセスが許可されていることを確認してください。詳細については、「*AWS PrivateLink ガイド*」の「[Access a resource through a resource VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/use-resource-endpoint.html)」を参照してください。
+ Amazon ECR FIPS エンドポイントは PrivateLink 経由で使用できないため、クラスターで [PrivateLink](vpc-interface-endpoints.md) を利用するサブネットが使用されている場合、イメージのプルが失敗します。

## Bottlerocket FIPS AMI を使用してマネージド型ノードグループを作成する
<a name="_create_a_managed_node_group_with_a_bottlerocket_fips_ami"></a>

Bottlerocket FIPS AMI には、ワークロードをサポートする 4 つのバリアントがあります。
+  `BOTTLEROCKET_x86_64_FIPS` 
+  `BOTTLEROCKET_ARM_64_FIPS` 
+  `BOTTLEROCKET_x86_64_NVIDIA_FIPS` 
+  `BOTTLEROCKET_ARM_64_NVIDIA_FIPS` 

Bottlerocket FIPS AMI を使用してマネージド型ノードグループを作成するには、作成プロセス中に、該当する AMI タイプを選択します。詳細については、「[クラスターのマネージドノードグループを作成する](create-managed-node-group.md)」を参照してください。

FIPS 対応バリアントの選択の詳細については、「[推奨 Bottlerocket AMI ID を取得する](retrieve-ami-id-bottlerocket.md)」を参照してください。

## サポートされていない AWS リージョンの FIPS エンドポイントを無効にする
<a name="disable_the_fips_endpoint_for_non_supported_shared_aws_regions"></a>

Bottlerocket FIPS AMI は、AWS GovCloud (米国) リージョンを含め、米国では直接サポートされています。AMI が使用可能でも、直接サポートされていない AWS リージョンでは、起動テンプレートでマネージド型ノードグループを作成すると、AMI を引き続き使用できます。

Bottlerocket FIPS AMI は、ブートストラップ中に Amazon ECR FIPS エンドポイントに依存しますが、このエンドポイントは、米国以外では一般には利用できません。Amazon ECR FIPS エンドポイントが利用できない AWS リージョンで FIPS カーネルを目的に AMI を使用するには、次のステップを実行して FIPS エンドポイントを無効にします。

1. 以下を記述した新しい設定ファイルを作成するか、既存の設定ファイルに以下を記述します。

```
[default]
use_fips_endpoint=false
```

1. ファイルの記述を Base64 形式でエンコードします。

1. 起動テンプレートの `UserData` で、エンコードした次の文字列を TOML 形式で追加します。

```
[settings.aws]
config = "<your-base64-encoded-string>"
```

その他の設定については、GitHub にある、Bottlerocket の「[Description of settings](https://github.com/bottlerocket-os/bottlerocket?tab=readme-ov-file#description-of-settings)」を参照してください。

起動テンプレートに記述した `UserData` の例を次に示します。

```
[settings]
motd = "Hello from eksctl!"
[settings.aws]
config = "W2RlZmF1bHRdCnVzZV9maXBzX2VuZHBvaW50PWZhbHNlCg==" # Base64-encoded string.
[settings.kubernetes]
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
cluster-name = "<cluster-name>"
...<other-settings>
```

起動テンプレート作成の詳細については、「[起動テンプレートを使用してマネージドノードをカスタマイズする](launch-templates.md)」を参照してください。

# 最適化された Ubuntu Linux AMI を使用してノードを作成する
<a name="eks-partner-amis"></a>

Canonical は Amazon EKS と提携し、クラスターで使用できるノード AMI を作成しました。

 [Canonical](https://www.canonical.com/) 社は、特定用途向けの Kubernetes ノード OS イメージ用のビルドを提供します。この最小化された Ubuntu イメージは Amazon EKS に最適化されたものであり、AWS が共同開発を行ったカスタム AWS カーネルが含まれます。詳細については、「[Ubuntu on Amazon Elastic Kubernetes Service (EKS)](https://cloud-images.ubuntu.com/aws-eks/)」と「[セルフマネージドの Ubuntu Linux ノードを作成する](launch-node-ubuntu.md)」を参照してください。サポートの詳細については、「AWS プレミアムサポートのよくある質問」の「[サードパーティソフトウェア](https://aws.amazon.com/premiumsupport/faqs/#Third-party_software)」セクションを参照してください。

# 最適化された Windows AMI を使用してノードを作成する
<a name="eks-optimized-windows-ami"></a>

Windows Amazon EKS 最適化 AMI は Windows Server 2019、Windows Server 2022、Windows Server 2025 上に構築されています。Amazon EKS ノードのベースイメージとして機能するように構成されています。デフォルトでは、AMI には次のコンポーネントが含まれています。
+  [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 
+  [kube-proxy](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/) 
+  [AWS IAM Authenticator for Kubernetes](https://github.com/kubernetes-sigs/aws-iam-authenticator) 
+  [csi-proxy](https://github.com/kubernetes-csi/csi-proxy) 
+  [containerd](https://containerd.io/) 

**注記**  
[Microsoft Security Update Guide](https://portal.msrc.microsoft.com/en-us/security-guidance) を使用して、Windows Server のセキュリティイベントやプライバシーイベントを追跡できます。

Amazon EKS は、次のバリアントで Windows コンテナに最適化された AMI を提供しています。
+ Amazon EKS 最適化 Windows Server 2019 Core AMI
+ Amazon EKS 最適化 Windows Server 2019 Full AMI
+ Amazon EKS 最適化 Windows Server 2022 Core AMI
+ Amazon EKS 最適化 Windows Server 2022 Full AMI
+ Amazon EKS 最適化 Windows Server 2025 Core AMI
+ Amazon EKS 最適化 Windows Server 2025 Full AMI

**重要**  
Amazon EKS 最適化 Windows Server 20H2 Core AMI は非推奨です。この AMI の新しいバージョンはリリースされません。
最新のセキュリティ更新プログラムがデフォルトで適用されるように、Amazon EKS は直近 4 か月間の最適化 Windows AMI を維持します。新しい AMI はそれぞれ、初回リリースから 4 か月間使用できます。この期間が過ぎると、古い AMI は非公開になり、アクセス不可になります。セキュリティの脆弱性を回避し、サポート期間が終了した古い AMI にアクセスできなくなることを防ぐために、最新の AMI を使用することをお勧めします。非公開になった AMI へのアクセスを可能にできるかは保証できませんが、AWS サポートにチケットを提出することでアクセスをリクエストできます。

## リリースカレンダー
<a name="windows-ami-release-calendar"></a>

以下の表に、Amazon EKS 用の Windows 各バージョンについて、そのリリース日およびサポート終了日を示します。終了日が空白の場合、そのバージョンのサポートは継続されています。


| Windows のバージョン | Amazon EKS リリース | Amazon EKS のサポート終了 | 
| --- | --- | --- | 
|  Windows Server 2025 Core  |  2026 年 1 月 27 日  |  | 
|  Windows Server 2025 Full  |  2026 年 1 月 27 日  |  | 
|  Windows Server 2022 Core  |  10/17/2022  |  | 
|  Windows Server 2022 Full  |  10/17/2022  |  | 
|  Windows Server 20H2 Core  |  2021 年 8 月 12 日  |  2022 年 8 月 9 日  | 
|  Windows Server 2004 Core  |  8/19/2020  |  12/14/2021  | 
|  Windows Server 2019 Core  |  10/7/2019  |  | 
|  Windows Server 2019 Full  |  10/7/2019  |  | 
|  Windows Server 1909 Core  |  10/7/2019  |  12/8/2020  | 

## ブートストラップスクリプトの設定パラメータ
<a name="bootstrap-script-configuration-parameters"></a>

Windows ノードを作成すると、ノード上にさまざまなパラメータが設定できるスクリプトができます。設定によりますが、このスクリプトはノード上の次のような場所で確認できます。`C:\Program Files\Amazon\EKS\Start-EKSBootstrap.ps1`。カスタムパラメータ値は、ブートストラップスクリプトの引数として指定できます。例えば、起動テンプレートのユーザーデータを更新できます。詳細については、「[アマゾン EC2 ユーザーデータ](launch-templates.md#launch-template-user-data)」を参照してください。

このスクリプトには次のコマンドラインパラメータが含まれます。
+  `-EKSClusterName` － このワーカーノードを参加させるための Amazon EKS クラスター名を指定します。
+  `-KubeletExtraArgs` - `kubelet` の追加引数を指定します (オプション)。
+  `-KubeProxyExtraArgs` - `kube-proxy` の追加引数を指定します (オプション)。
+  `-APIServerEndpoint` — Amazon EKS クラスター API サーバーエンドポイントを指定します (オプション)。`-Base64ClusterCA` と共に使用した場合のみ有効となります。`Get-EKSCluster` の呼び出しをバイパスします。
+  `-Base64ClusterCA` — Base64 でエンコードされたクラスターの CA の内容を指定します (オプション)。`-APIServerEndpoint` と共に使用した場合のみ有効となります。`Get-EKSCluster` の呼び出しをバイパスします。
+  `-DNSClusterIP` — クラスター内の DNS クエリに使用する IP アドレスを上書きします (オプション)。プライマリインターフェイスの IP アドレスに基づく `10.100.0.10` または `172.20.0.10` のデフォルトです。
+  `-ServiceCIDR` — クラスターサービスの宛先となる Kubernetes サービスの IP アドレス範囲をオーバーライドします。プライマリインターフェイスの IP アドレスに基づく `172.20.0.0/16` または `10.100.0.0/16` のデフォルトです。
+  `-ExcludedSnatCIDRs` — 送信元ネットワークアドレス変換 (SNAT) から除外する `IPv4` CIDR のリストです。つまり、VPC アドレスで呼び出し可能なポッドプライベート IP は、アウトバウンドトラフィック用のインスタンス ENI のプライマリ `IPv4` アドレスの IP アドレスに変換されません。デフォルトでは、Amazon EKS Windows ノードの VPC の `IPv4` CIDR が追加されます。このパラメータに CIDR を指定すると、指定した CIDR も除外されます。詳細については、「[Pod のアウトバウンドインターネットアクセスを有効にする](external-snat.md)」を参照してください。

コマンドラインパラメータに加えて、いくつかの環境変数パラメータを指定することもできます。コマンドラインパラメータを指定する場合、そのパラメータはそれぞれの環境変数よりも優先されます。ブートストラップスクリプトはマシンスコープの変数のみを読み取るため、環境変数はマシン (またはシステム) スコープとして定義する必要があります。

このスクリプトでは、次の環境変数が考慮されます。
+  `SERVICE_IPV4_CIDR` — 定義については、`ServiceCIDR` コマンドラインパラメータを参照してください。
+  `EXCLUDED_SNAT_CIDRS` — コンマ区切りの文字列にする必要があります。定義については `ExcludedSnatCIDRs` コマンドラインパラメータを参照してください。

### gMSA 認証サポート
<a name="ad-and-gmsa-support"></a>

Amazon EKS Windows Pod では、さまざまなタイプのグループ管理サービスアカウント (gMSA) 認証が可能です。
+ Amazon EKS は認証用の Active Directory ドメインアイデンティティをサポートしています。ドメイン参加型 gMSA の詳細については、AWS ブログの「[Windows Authentication on Amazon EKS Windowspods](https://aws.amazon.com/blogs/containers/windows-authentication-on-amazon-eks-windows-pods)」を参照してください。
+ Amazon EKS では、非ドメイン参加型 Windows ノードがポータブルなユーザーアイデンティティを使用して gMSA 認証情報を取得できるようにするプラグインが提供されています。ドメインレス gMSA の詳細については、AWS ブログの「[Domainless Windows Authentication for Amazon EKS Windowspods](https://aws.amazon.com/blogs/containers/domainless-windows-authentication-for-amazon-eks-windows-pods)」を参照してください。

## キャッシュされたコンテナイメージ
<a name="windows-cached-container-images"></a>

Amazon EKS Windows 最適化 AMI には、`containerd` のランタイムのためにキャッシュされたコンテナイメージが含まれます。コンテナイメージは、Amazon 管理ビルドコンポーネントを使用してカスタム AMI を構築するときにキャッシュされます。詳細については、「[Amazon 管理ビルドコンポーネントを使用する](eks-custom-ami-windows.md#custom-windows-ami-build-component)」を参照してください。

`containerd` ランタイムのキャッシュされたコンテナイメージは以下のとおりです。
+  `amazonaws.com/eks/pause-windows` 
+  `mcr.microsoft.com/windows/nanoserver` 
+  `mcr.microsoft.com/windows/servercore` 

## 詳細情報
<a name="windows-more-information"></a>

Amazon EKS 最適化 Windows AMI の使用に関する詳細については、以下のセクションを参照してください。
+ Amazon EKS 最適化アクセラレーテッド Windows AMI でのワークロードの実行に関する詳細については、「[GPU アクセラレーションコンテナを実行する (EC2 G シリーズでの Windows)](ml-eks-windows-optimized-ami.md)」を参照してください。
+ Windows をマネージド型ノードグループと使用するには、「[マネージドノードグループを使用してノードライフサイクルを簡素化する](managed-node-groups.md)」を参照してください。
+ セルフマネージド型 Windows ノードを起動するには、「[セルフマネージド Microsoft Windows ノードの作成](launch-windows-workers.md)」を参照してください。
+ バージョンについては、「[Windows AMI バージョンに関する情報を取得する](eks-ami-versions-windows.md)」を参照してください。
+ Amazon EKS 最適化 Windows AMI の最新の ID を取得するには、「[推奨 Microsoft Windows AMI ID を取得する](retrieve-windows-ami-id.md)」を参照してください。
+ Amazon EC2 Image Builder を使用して、カスタムの Amazon EKS 最適化 Windows AMI を作成するには、「[Image Builder を使用してカスタム Windows AMI を構築する](eks-custom-ami-windows.md)」を参照してください。
+ ベストプラクティスについては、*「EKS ベストプラクティスガイド」*の「[Amazon EKS 最適化 Windows AMI の管理](https://aws.github.io/aws-eks-best-practices/windows/docs/ami/)」を参照してください。

# `eksctl` を使用してセルフマネージド Windows Server 2022 ノードを作成する
<a name="self-managed-windows-server-2022"></a>

次の `test-windows-2022.yaml` は、セルフマネージド Windows Server 2022 ノードを作成するためのリファレンスとして使用できます。各*サンプル値*は独自の値に置き換えます。

**注記**  
セルフマネージド Windows Server 2022 ノードを実行するには、`eksctl` バージョン [0.116.0](https://github.com/weaveworks/eksctl/releases/tag/v0.116.0) 以降を使用する必要があります。

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: windows-2022-cluster
  region: region-code
  version: '1.35'

nodeGroups:
  - name: windows-ng
    instanceType: m5.2xlarge
    amiFamily: WindowsServer2022FullContainer
    volumeSize: 100
    minSize: 2
    maxSize: 3
  - name: linux-ng
    amiFamily: AmazonLinux2
    minSize: 2
    maxSize: 3
```

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

```
eksctl create cluster -f test-windows-2022.yaml
```

# Windows AMI バージョンに関する情報を取得する
<a name="eks-ami-versions-windows"></a>

このトピックでは、Amazon EKS 最適化 Windows AMI のバージョンと、それに対応する [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)、[containerd](https://containerd.io/)、および [csi-proxy](https://github.com/kubernetes-csi/csi-proxy) のバージョンを示します。

AMI ID を含む、Amazon EKS 最適化 AMI のメタデータでは、各バリアントをプログラム的に取得することができます。詳細については、「[推奨 Microsoft Windows AMI ID を取得する](retrieve-windows-ami-id.md)」を参照してください。

各 AMI は次の形式により、Kubernetes のバージョンならびに AMI のリリース日によってバージョン付けされています。

```
k8s_major_version.k8s_minor_version-release_date
```

**注記**  
Amazon EKS マネージド型ノードグループは、Windows AMI の 2022 年 11 月以降のリリースをサポートしています。

この特定のドキュメントページへのすべてのソースファイルの変更通知を受け取るには、RSS リーダーを使用して次の URL をサブスクライブできます。

```
https://github.com/awsdocs/amazon-eks-user-guide/commits/mainline/latest/ug/nodes/eks-ami-versions-windows.adoc.atom
```

## Amazon EKS 最適化 Windows Server 2025 Core AMI
<a name="eks-ami-versions-windows-2025-core"></a>

次の表は、Amazon EKS 最適化 Windows Server 2025 Core AMI の現在および以前のバージョンを示しています。

**Example**  


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 

## Amazon EKS 最適化 Windows Server 2025 Full AMI
<a name="eks-ami-versions-windows-2025-full"></a>

次の表は、Amazon EKS 最適化 Windows Server 2025 Full AMI の現在および以前のバージョンを示しています。

**Example**  


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 

## Amazon EKS 最適化 Windows Server 2022 Core AMI
<a name="eks-ami-versions-windows-2022-core"></a>

次の表は、Amazon EKS 最適化 Windows Server 2022 Core AMI の現在および以前のバージョンを示しています。

**Example**  


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  `containerd` を `2.1.6` にアップグレードしました。  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  `containerd` を `1.7.14` にアップグレードしました。  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  `containerd` を `1.7.11` にアップグレードしました。`kubelet` を `1.29.3` にアップグレードしました。  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  `containerd` を `1.6.28` にアップグレードしました。`golang 1.22.1` を使用して CNI と `csi-proxy` が再構築されました。  | 
|   `1.29-2024.03.12`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  一時停止画像が `kubelet` ガベージコレクション処理によって誤って削除されてしまうバグを修正しました。  | 
|   `1.29-2024.01.11`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  Windows Server 2022 Core AMI のスタンドアロン Windows Update [KB5034439](https://support.microsoft.com/en-au/topic/kb5034439-windows-recovery-environment-update-for-azure-stack-hci-version-22h2-and-windows-server-2022-january-9-2024-6f9d26e6-784c-4503-a3c6-0beedda443ca) は除外しました。KB は、Amazon EKS 最適化 Windows AMI に含まれていない、個別の WinRE パーティションのある Windows インストールにのみ適用されます。  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  `containerd` を `1.7.11` にアップグレードしました。  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  `containerd` を `1.6.28` にアップグレードしました。`kubelet` を `1.28.8` にアップグレードしました。  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  `containerd` を `1.6.25` にアップグレードしました。`golang 1.22.1` を使用して CNI と `csi-proxy` が再構築されました。  | 
|   `1.28-2024.03.12`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.11`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  Windows Server 2022 Core AMI のスタンドアロン Windows Update [KB5034439](https://support.microsoft.com/en-au/topic/kb5034439-windows-recovery-environment-update-for-azure-stack-hci-version-22h2-and-windows-server-2022-january-9-2024-6f9d26e6-784c-4503-a3c6-0beedda443ca) は除外しました。KB は、Amazon EKS 最適化 Windows AMI に含まれていない、個別の WinRE パーティションのある Windows インストールにのみ適用されます。  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  `CVE-2023-5528` のパッチが含まれます。  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  `containerd` を `1.6.18` にアップグレードしました。新しい[ブートストラップスクリプト環境変数](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) (`SERVICE_IPV4_CIDR` と `EXCLUDED_SNAT_CIDRS`) を追加しました。  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  `kubelet` の[セキュリティ勧告](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)を修正しました。  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 最適化 Windows Server 2022 Full AMI
<a name="eks-ami-versions-windows-2022-full"></a>

次の表は、Amazon EKS 最適化 Windows Server 2022 Full AMI の現在および以前のバージョンを示しています。

**Example**  


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  `containerd` を `2.1.6` にアップグレードしました。  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  `containrd` が `1.7.27` にアップグレードされました   | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.01`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  `contianerd` を `1.7.20` にアップグレードしました。  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  `containerd` を `1.7.14` にアップグレードしました。  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  `containerd` を `1.7.11` にアップグレードしました。`kubelet` を `1.29.3` にアップグレードしました。  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  `containerd` を `1.6.28` にアップグレードしました。`golang 1.22.1` を使用して CNI と `csi-proxy` が再構築されました。  | 
|   `1.29-2024.03.12`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  一時停止画像が `kubelet` ガベージコレクション処理によって誤って削除されてしまうバグを修正しました。  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  `containerd` を `1.7.11` にアップグレードしました。  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  `containerd` を `1.6.28` にアップグレードしました。`kubelet` を `1.28.8` にアップグレードしました。  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  `containerd` を `1.6.25` にアップグレードしました。`golang 1.22.1` を使用して CNI と `csi-proxy` が再構築されました。  | 
|   `1.28-2024.03.12`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  `CVE-2023-5528` のパッチが含まれます。  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  `containerd` を `1.6.18` にアップグレードしました。新しい[ブートストラップスクリプト環境変数](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) (`SERVICE_IPV4_CIDR` と `EXCLUDED_SNAT_CIDRS`) を追加しました。  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  `kubelet` の[セキュリティ勧告](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)を修正しました。  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 最適化 Windows Server 2019 Core AMI
<a name="eks-ami-versions-windows-2019-core"></a>

次の表は、Amazon EKS 最適化 Windows Server 2019 Core AMI の現在および以前のバージョンを示しています。

**Example**  


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  `containerd` を `2.1.6` にアップグレードしました。  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.4`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.30-2025-02-15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  `containerd` を `1.7.14` にアップグレードしました。  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  `containerd` を `1.7.11` にアップグレードしました。`kubelet` を `1.29.3` にアップグレードしました。  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  `containerd` を `1.6.28` にアップグレードしました。`golang 1.22.1` を使用して CNI と `csi-proxy` が再構築されました。  | 
|   `1.29-2024.03.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  一時停止画像が `kubelet` ガベージコレクション処理によって誤って削除されてしまうバグを修正しました。  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  `containerd` を `1.7.11` にアップグレードしました。  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  `containerd` を `1.6.28` にアップグレードしました。`kubelet` を `1.28.8` にアップグレードしました。  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  `containerd` を `1.6.25` にアップグレードしました。`golang 1.22.1` を使用して CNI と `csi-proxy` が再構築されました。  | 
|   `1.28-2024.03.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  `CVE-2023-5528` のパッチが含まれます。  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  `containerd` を `1.6.18` にアップグレードしました。新しい[ブートストラップスクリプト環境変数](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) (`SERVICE_IPV4_CIDR` と `EXCLUDED_SNAT_CIDRS`) を追加しました。  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  `kubelet` の[セキュリティ勧告](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)を修正しました。  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 最適化 Windows Server 2019 Full AMI
<a name="eks-ami-versions-windows-2019-full"></a>

次の表は、Amazon EKS 最適化 Windows Server 2019 Full AMI の現在および以前のバージョンを示しています。

**Example**  


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  `containerd` を `2.1.6` にアップグレードしました。  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  `containerd` を `1.7.14` にアップグレードしました。  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  `containerd` を `1.7.30` にアップグレードしました。  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  `containerd` を `1.7.11` にアップグレードしました。`kubelet` を `1.29.3` にアップグレードしました。  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  `containerd` を `1.6.28` にアップグレードしました。`golang 1.22.1` を使用して CNI と `csi-proxy` が再構築されました。  | 
|   `1.29-2024.03.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  一時停止画像が `kubelet` ガベージコレクション処理によって誤って削除されてしまうバグを修正しました。  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI のバージョン | kubelet バージョン | containerd バージョン | csi-proxy バージョン | リリースノート | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA プラグインログを Windows イベントに変更  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd` を `1.7.27` にアップグレードしました。  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  `containerd` を `1.7.20` にアップグレードしました。  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042` のパッチが含まれます。  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321` のパッチが含まれます。  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  `containerd` を `1.7.11` にアップグレードしました。  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  `containerd` を `1.6.28` にアップグレードしました。`kubelet` を `1.28.8` にアップグレードしました。  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  `containerd` を `1.6.25` にアップグレードしました。`golang 1.22.1` を使用して CNI と `csi-proxy` が再構築されました。  | 
|   `1.28-2024.03.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  `CVE-2023-5528` のパッチが含まれます。  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  `containerd` を `1.6.18` にアップグレードしました。新しい[ブートストラップスクリプト環境変数](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) (`SERVICE_IPV4_CIDR` と `EXCLUDED_SNAT_CIDRS`) を追加しました。  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  `kubelet` の[セキュリティ勧告](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)を修正しました。  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

# 推奨 Microsoft Windows AMI ID を取得する
<a name="retrieve-windows-ami-id"></a>

ノードをデプロイする際に、事前構築済みの Amazon EKS 最適化 Amazon マシンイメージ (AMI) の ID を指定できます。希望する設定に合った AMI ID を取得するには、AWS Systems Manager Parameter Store API をクエリします。この API を使用すると、Amazon EKS 最適化 AMI ID を手動で検索する必要がなくなります。詳細については、「[GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)」を参照してください。使用する [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)には、Amazon EKS 最適化 AMI メタデータを取得するための `ssm:GetParameter` IAM アクセス許可が必要です。

サブパラメータ `image_id` を使用する次のコマンドで、推奨される最新の Amazon EKS 最適化 Windows AMI のイメージ ID を取得できます。必要に応じてコマンドに次の変更を加え、変更したコマンドを実行してください：
+ *release* は、以下のいずれかのオプションに置き換えます。
  + Windows Server 2025 には *2025* を使用します。
  + Windows Server 2022 には *2022* を使用します。
  + Windows Server 2019 には *2019* を使用します。
+ *installation-option* は、以下のいずれかのオプションに置き換えます。詳細については、「[What is the Server Core installation option in Windows Server](https://learn.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core)」を参照してください。
  + アタックサーフェスを小さくした最小限のインストールには *Core* を使用します。
  + Windows デスクトップエクスペリエンスを含めるには *Full* を使用します。
+ *kubernetes-version* を、サポートされている [platform-version](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html) に置き換えます。
+ *region-code* を、AMI ID が必要な [Amazon EKS がサポートしている AWS リージョン](https://docs.aws.amazon.com/general/latest/gr/eks.html)に置き換えます。

```
aws ssm get-parameter --name /aws/service/ami-windows-latest/Windows_Server-release-English-installation-option-EKS_Optimized-kubernetes-version/image_id \
    --region region-code --query "Parameter.Value" --output text
```

プレースホルダーの置換が行われた後のコマンドの例を以下に示します。

```
aws ssm get-parameter --name /aws/service/ami-windows-latest/Windows_Server-2022-English-Core-EKS_Optimized-k8s-n-2/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

出力例は次のとおりです。

```
ami-1234567890abcdef0
```

# Image Builder を使用してカスタム Windows AMI を構築する
<a name="eks-custom-ami-windows"></a>

EC2 Image Builder を使用し、次のオプションのいずれかを使用して、カスタムの Amazon EKS 最適化 Windows AMI を作成できます。
+  [Amazon EKS 最適化 Windows AMI をベースとして使用する](#custom-windows-ami-as-base) 
+  [Amazon 管理ビルドコンポーネントを使用する](#custom-windows-ami-build-component) 

どちらの方法でも、独自の Image Builder レシピを作成する必要があります。詳細については、「Image Builder ユーザーガイド」の「[イメージレシピの新しいバージョンの作成](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html)」を参照してください。

**重要**  
以下の `eks` の **[Amazon 管理]** コンポーネントには、`CVE-2024-5321` のパッチが含まれます。  
 `1.28.2` 以上
 `1.29.2` 以上
 `1.30.1` 以上
Kubernetes 1.31 以降のすべてのバージョン

## Amazon EKS 最適化 Windows AMI をベースとして使用する
<a name="custom-windows-ami-as-base"></a>

このオプションは、カスタム Windows AMI を構築するのに推奨される方法です。当社が提供する Amazon EKS 最適化 Windows AMI は、Amazon 管理のビルドコンポーネントよりも頻繁に更新されます。

1. 新しい Image Builder レシピを始める

   1. https://console.aws.amazon.com/imagebuilder で、EC2 Image Builder コンソールを開きます。

   1. 左側のナビゲーションペインで、**[イメージレシピ]** を選択します。

   1. **[イメージレシピの作成]** を選択します。

1. **[レシピの詳細]** セクションで、**[名前]** と **[バージョン]** を入力します。

1. **[ベースイメージ]** セクションで Amazon EKS 最適化 Windows AMI の ID を指定します。

   1. **[カスタム AMI ID を入力]** を選択します。

   1. 必要な Windows OS バージョンの AMI ID を取得します。詳細については、「[推奨 Microsoft Windows AMI ID を取得する](retrieve-windows-ami-id.md)」を参照してください。

   1. カスタム **[AMI ID]** を入力します。AMI ID が見つからない場合は、AMI ID の AWS リージョンがコンソールの右上に表示されている AWS リージョンと一致しているか確認してください。

1. (オプション) 最新のセキュリティアップデートを入手するには、`update-windows` コンポーネントを **[ビルドコンポーネント - ]** セクションに追加します。

   1. **[名前でコンポーネントを検索する]** 検索ボックスの右側にあるドロップダウンリストから、**[Amazon 管理]** を選択します。

   1. **[名前でコンポーネントを検索する]** 検索ボックスに `update-windows` と入力します。

   1. ** `update-windows` **の検索結果のチェックボックスを選択します。このコンポーネントは、オペレーティングシステムの最新 Windows パッチを含みます。

1. 必要な設定で残りのイメージレシピの入力を完了します。詳細については、「Image Builder ユーザーガイド」の「[イメージレシピの新しいバージョンの作成 (コンソール)](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html#create-image-recipe-version-console)」を参照してください。

1. **[レシピを作成する]** を選択します。

1. 新しいイメージレシピを新規または既存のイメージパイプラインで使用します。イメージパイプラインが正常に実行されると、カスタム AMI が出力イメージとして一覧表示され、使用できるようになります。詳細については、「[EC2 Image Builder コンソールウィザードを使用してイメージパイプラインを作成する](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html)」を参照してください。

## Amazon 管理ビルドコンポーネントを使用する
<a name="custom-windows-ami-build-component"></a>

Amazon EKS 最適化 Windows AMI をベースとして使用できない場合は、代わりに Amazon 管理ビルドコンポーネントを使用できます。このオプションは、サポートされている最新の Kubernetes バージョンよりも遅れる可能性があります。

1. 新しい Image Builder レシピを始める

   1. https://console.aws.amazon.com/imagebuilder で、EC2 Image Builder コンソールを開きます。

   1. 左側のナビゲーションペインで、**[イメージレシピ]** を選択します。

   1. **[イメージレシピの作成]** を選択します。

1. **[レシピの詳細]** セクションで、**[名前]** と **[バージョン]** を入力します。

1. **[ベースイメージ]** のセクションで、カスタム AMI の作成に使用するオプションを決定します。
   +  **[管理イメージの選択]** — **[イメージオペレーティングシステム (OS)]** で **[Windows]** を選択します。次に、**[イメージのオリジン]** について、以下のいずれかのオプションを選択します。
     +  **[クイックスタート (Amazon 管理)]** – **[イメージ名]** ドロップダウンから、Amazon EKS でサポートされている Windows Server のバージョンを選択します。詳細については、「[最適化された Windows AMI を使用してノードを作成する](eks-optimized-windows-ami.md)」を参照してください。
     +  **[ユーザー所有のイメージ]** – **[イメージ名]** で、独自ライセンスを持つ独自のイメージの ARN を選択します。Amazon EKS コンポーネントをインストール済みのイメージを指定することはできません。
   +  **[カスタム AMI ID を入力]** – [AMI ID] に、独自ライセンスを持つ AMI の ID を入力します。Amazon EKS コンポーネントをインストール済みのイメージを指定することはできません。

1. **[ビルドコンポーネント - Windows]** セクションで、次の操作を行います。

   1. **[名前でコンポーネントを検索する]** 検索ボックスの右側にあるドロップダウンリストから、**[Amazon 管理]** を選択します。

   1. **[名前でコンポーネントを検索する]** 検索ボックスに `eks` と入力します。

   1. たとえ目的のバージョンではない場合でも、** `eks-optimized-ami-windows` **検索結果のチェックボックスを選択します。

   1. **[名前でコンポーネントを検索する]** 検索ボックスに `update-windows` と入力します。

   1. **update-windows** の検索結果のチェックボックスを選択します。このコンポーネントは、オペレーティングシステムの最新 Windows パッチを含みます。

1. **[選択したコンポーネント]** セクションで、次の手順を実行します。

   1. ** [`eks-optimized-ami-windows`] ** の **[バージョニングオプション]** を選択してください。

   1. **[コンポーネントバージョンを指定する]** を選択します。

   1. **[コンポーネントバージョン]** フィールドに *version.x* と入力し、*バージョン*をサポートされている Kubernetes バージョンに置き換えます。バージョン番号の一部に *x* を入力すると、明示的に定義したバージョンの一部と一致する最新のコンポーネントバージョンが使用されます。コンソールの出力に注目してください。目的のバージョンが管理コンポーネントとして利用可能かどうかが示されます。ビルドコンポーネントでは、最新の Kubernetes バージョンを使用できない場合があります。使用できるバージョンの詳細については、「[`eks-optimized-ami-windows` コンポーネントのバージョンに関する情報を取得する](#custom-windows-ami-component-versions)」を参照してください。

1. 必要な設定で残りのイメージレシピの入力を完了します。詳細については、「Image Builder ユーザーガイド」の「[イメージレシピの新しいバージョンの作成 (コンソール)](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html#create-image-recipe-version-console)」を参照してください。

1. **[レシピを作成する]** を選択します。

1. 新しいイメージレシピを新規または既存のイメージパイプラインで使用します。イメージパイプラインが正常に実行されると、カスタム AMI が出力イメージとして一覧表示され、使用できるようになります。詳細については、「[EC2 Image Builder コンソールウィザードを使用してイメージパイプラインを作成する](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html)」を参照してください。

## `eks-optimized-ami-windows` コンポーネントのバージョンに関する情報を取得する
<a name="custom-windows-ami-component-versions"></a>

各コンポーネントにインストールされているものに関する特定の情報を取得できます。例えば、どの `kubelet` バージョンがインストールされているかを確認できます。コンポーネントには、Amazon EKS がサポートする Windows オペレーティングシステムのバージョンで機能テストが実施されます。詳細については、「[リリースカレンダー](eks-optimized-windows-ami.md#windows-ami-release-calendar)」を参照してください。その他の Windows OS バージョンで、サポートされていない、またはサポート終了としてリストにあるものは、このコンポーネントと互換性がない可能性があります。

1. https://console.aws.amazon.com/imagebuilder で、EC2 Image Builder コンソールを開きます。

1. 左にあるナビゲーションペインで、**[コンポーネント]** をクリックします。

1. **[名前でコンポーネントを検索する]** 検索ボックスの右側にあるドロップダウンリストで、**[自己所有]** を **[クイックスタート (Amazon 管理)]** に変更します。

1. [**名前でコンポーネントを検索**] ボックスに `eks` と入力します。

1. (オプション) 最新バージョンを使用している場合は、**[バージョン]** 列を 2 回選択して降順にソートします。

1. 目的のバージョンの **[`eks-optimized-ami-windows`]** リンクを選択します。

結果のページの **[説明]** には、特定の情報が表示されます。

# ノードのヘルス問題を検出し、自動ノード修復を有効にする
<a name="node-health"></a>

ノードのヘルスとは、ワークロードを効果的に実行するための Kubernetes ノードの運用ステータスと機能を指します。正常なノードは、期待されるネットワーク接続を維持し、十分なコンピューティングリソースとストレージリソースを持ち、中断することなくワークロードを正常に実行できます。

EKS クラスター内のノードを正常な状態に維持するために、EKS には*ノードモニタリングエージェント*と*自動ノード修復*の機能があります。これらの機能は、EKS Auto Mode コンピューティングで自動的に有効になります。EKS マネージド型ノードグループと Karpenter で自動ノード修復を使用でき、AWS Fargate を除く任意の EKS コンピューティングタイプで EKS ノードモニタリングエージェントを使用することもできます。EKS ノードモニタリングエージェントと自動ノード修復は、一緒に使用すると最も効果的ですが、EKS クラスターで個別に使用することもできます。

**重要**  
*ノードモニタリングエージェント*と*ノード自動修復*を使用できるのは、Linux のみです。Windows では使用できません。

## ノードモニタリングエージェント
<a name="node-monitoring-agent"></a>

EKS ノードモニタリングエージェントはノードログを読み取り、ヘルスの問題を検出します。ログを解析して障害を検出し、ノードのヘルスステータスに関するステータス情報を表示します。検出された問題のカテゴリごとに、エージェントはワーカーノード専用の `NodeCondition` を適用します。EKS ノードモニタリングエージェントによって検出されたノードのヘルス問題の詳細については、「[EKS ノードモニタリングエージェントのノードのヘルス問題を検出する](node-health-nma.md)」を参照してください。

EKS Auto Mode コンピューティングには、ノードモニタリングエージェントが備わっています。他の EKS コンピューティングタイプでは、ノードモニタリングエージェントを EKS アドオンとして追加することも、Helm などの Kubernetes ツールで管理することもできます。詳細については、「[ノードモニタリングエージェントを設定する](node-health-nma.md#node-monitoring-agent-configure)」を参照してください。

EKS ノードモニタリングエージェントでは、以下のカテゴリのノードのヘルス問題がノード条件として表示されます。`Ready`、`DiskPressure`、`MemoryPressure` は、EKS ノードモニタリングエージェントがない場合でも表示される標準の Kubernetes ノード条件です。


| ノードの状態 | 説明 | 
| --- | --- | 
|  AcceleratedHardwareReady  |  AcceleratedHardwareReady は、ノードの高速ハードウェア (GPU、Neuron) が正しく機能しているかどうかを示します。  | 
|  ContainerRuntimeReady  |  ContainerRuntimeReady は、コンテナランタイム (containerd など) が正しく機能し、コンテナを実行できるかどうかを示します。  | 
|  DiskPressure  |  DiskPressure は、ノードにディスクプレッシャー (ディスク容量が少ない、または I/O が高い) が発生していることを示す標準の Kubernetes 条件です。  | 
|  KernelReady  |  KernelReady は、重大なエラー、パニック、またはリソースの枯渇が発生することなく、カーネルが正しく機能しているかどうかを示します。  | 
|  MemoryPressure  |  MemoryPressure は、ノードにメモリプレッシャー (使用可能なメモリが少ない) が発生していることを示す標準の Kubernetes 条件です。  | 
|  NetworkingReady  |  NetworkingReady は、ノードのネットワークスタック (インターフェイス、ルーティング、接続) が正しく機能しているかどうかを示します。  | 
|  StorageReady  |  StorageReady は、ノードのストレージサブシステム (ディスク、ファイルシステム、I/O) が正しく機能しているかどうかを示します。  | 
|  Ready  |  Ready は、ノードが正常でポッドを受け入れる準備ができていることを示す標準の Kubernetes 条件です。  | 

## 自動ノード修復
<a name="node-auto-repair"></a>

EKS 自動ノード修復は、ノードのヘルスを継続的にモニタリングし、検出された問題に対応し、可能な場合はノードを置き換えるか再起動します。これにより、手動介入を最小限に抑えながらクラスターの信頼性を向上させ、アプリケーションのダウンタイムを短縮できます。

単体では、EKS 自動ノード修復は、kubelet の `Ready` 条件、手動で削除されたノードオブジェクト、クラスターに参加できない EKS マネージド型ノードグループインスタンスに対応します。ノードモニタリングエージェントをインストールした状態で EKS 自動ノード修復を有効にすると、EKS 自動ノード修復は次の追加のノード条件に対応します: `AcceleratedHardwareReady`、`ContainerRuntimeReady`、`KernelReady`、`NetworkingReady`、`StorageReady`。

EKS 自動ノード修復は、標準の Kubernetes `DiskPressure`、`MemoryPressure`、または `PIDPressure` ノード条件には対応しません。これらの条件は、多くの場合、ノードレベルの障害ではなく、アプリケーションの動作、ワークロード設定、またはリソース制限の問題を示しているため、適切なデフォルトの修復アクションを決定することは困難です。これらのシナリオでは、ワークロードは Kubernetes [ノードのプレッシャーエビクション動作](https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction)の影響を受けます。

EKS 自動ノード修復の詳細については、「[EKS クラスター内のノードを自動的に修復する](node-repair.md)」を参照してください。

**Topics**

# EKS ノードモニタリングエージェントのノードのヘルス問題を検出する
<a name="node-health-nma"></a>

このトピックでは、EKS ノードモニタリングエージェントによって検出されたノードのヘルス問題、それらの問題がノード条件またはイベントとしてどのように表示されるか、ノードモニタリングエージェントを設定する方法について説明します。

EKS ノードモニタリングエージェントは、EKS 自動ノード修復の有無にかかわらず使用できます。EKS 自動ノード修復の詳細については、「[EKS クラスター内のノードを自動的に修復する](node-repair.md)」を参照してください。

EKS ノードモニタリングエージェントのソースコードは、GitHub の [aws/eks-node-monitoring-agent](https://github.com/aws/eks-node-monitoring-agent) リポジトリに公開されています。

## ノードのヘルスの問題
<a name="node-health-issues"></a>

次の表は、ノードモニタリングエージェントが検出できるノードのヘルス問題を示しています。次の 2 種類の問題があります。
+ 症状 – インスタンスの置き換えや再起動などの修復アクションを必要とするターミナルの問題。自動修復が有効になっている場合、Amazon EKS はノードの置換または再起動として修復アクションを実行します。詳細については、「[ノードの状態](learn-status-conditions.md#status-node-conditions)」を参照してください。
+ イベント – 一時的な問題または最適ではないノード設定。自動修復アクションは行われません。詳細については、「[ノードイベント](learn-status-conditions.md#status-node-events)」を参照してください。

## AcceleratedHardware ノードのヘルス問題
<a name="node-health-AcceleratedHardware"></a>

次の表に記載されている、緊急度が「条件」である問題について、モニタリング条件は `AcceleratedHardwareReady` です。以下の表のイベントと条件は、NVIDIA および Neuron 関連のノードのヘルス問題に関するものです。


| 名前 | 緊急度 | 説明 | 修復アクション | 
| --- | --- | --- | --- | 
|  DCGMDiagnosticFailure  |  条件  |  DCGM アクティブ診断テストスイートからのテストケースが失敗しました。  |  なし  | 
|  DCGMError  |  条件  |  DCGM ホストプロセスへの接続を失ったか、確立できませんでした。  |  なし  | 
|  DCGMFieldError[Code]  |  イベント  |  DCGM が、フィールド識別子を介して GPU の劣化を検出しました。  |  なし  | 
|  DCGMHealthCode[Code]  |  イベント  |  DCGM ヘルスチェックが、致命的ではない方法で失敗しました。  |  なし  | 
|  DCGMHealthCode[Code]  |  条件  |  DCGM ヘルスチェックが、致命的な方法で失敗しました。  |  なし  | 
|  NeuronDMAError  |  条件  |  DMA エンジンで回復不可能なエラーが発生しました。  |  置換  | 
|  NeuronHBMUncorrectableError  |  条件  |  HBM で修正不可能なエラーが発生し、誤った結果が生成されました。  |  置換  | 
|  NeuronNCUncorrectableError  |  条件  |  Neuron Core の修正不可能なメモリエラーが検出されました。  |  置換  | 
|  NeuronSRAMUncorrectableError  |  条件  |  オンチップ SRAM でパリティエラーが発生し、誤った結果が生成されました。  |  置換  | 
|  NvidiaDeviceCountMismatch  |  イベント  |  NVML で認識される GPU の数が、ファイルシステムの NVIDIA デバイス数と一致していません。  |  なし  | 
|  NvidiaDoubleBitError  |  条件  |  GPU ドライバーによってダブルビットエラーが生成されました。  |  置換  | 
|  NvidiaNCCLError  |  イベント  |  NVIDIA Collective Communications ライブラリ (`libnccl`) でセグメンテーション違反が発生しました。  |  なし  | 
|  NvidiaNVLinkError  |  条件  |  NVLink エラーが GPU ドライバーによって報告されました。  |  置換  | 
|  NvidiaPCIeError  |  イベント  |  送信エラーから回復するために PCIe リプレイがトリガーされました。  |  なし  | 
|  NvidiaPageRetirement  |  イベント  |  GPU ドライバーがメモリページを廃止としてマークしました。これは、1 つのダブルビットエラーが起こった場合、または同じアドレスで 2 つのシングルビットエラーが起こった場合に発生する可能性があります。  |  なし  | 
|  NvidiaPowerError  |  イベント  |  GPU の電力使用率が許容しきい値を超えました。  |  なし  | 
|  NvidiaThermalError  |  イベント  |  GPU の熱ステータスが許容しきい値を超えました。  |  なし  | 
|  NvidiaXID[Code]Error  |  条件  |  重大な GPU エラーが発生しました。  |  置換または再起動  | 
|  NvidiaXID[Code]Warning  |  イベント  |  重要ではない GPU エラーが発生しました。  |  なし  | 

## NVIDIA XID エラーコード
<a name="nvidia-xid-codes"></a>

ノードモニタリングエージェントは、GPU カーネルログから NVIDIA XID エラーを検出します。XID エラーは 2 つのカテゴリに分類されます。
+  **既知の XID コード** – ノード条件 (`AcceleratedHardwareReady=False`) を設定し、有効になっている場合に自動修復をトリガーする重大なエラー。理由コードの形式は `NvidiaXID[Code]Error` です。EKS ノードモニタリングエージェントが検出する既知の XID コードは、修復アクションを必要とする NVIDIA XID コードの完全なリストを表していない場合があります。
+  **不明な XID コード** – Kubernetes イベントとしてのみログに記録されます。これらは自動修復をトリガーしません。理由コードの形式は `NvidiaXID[Code]Warning` です。不明な XID エラーを調査するには、`dmesg | grep -i nvrm` でカーネルログを確認します。

XID エラーの詳細については、「*NVIDIA GPU のデプロイおよび管理ドキュメント*」の「[Xid エラー](https://docs.nvidia.com/deploy/xid-errors/index.html#topic_5_1)」を参照してください。個々の XID メッセージの詳細については、「*NVIDIA GPU Deployment and Management Documentation*」の「[Understanding Xid Messages](https://docs.nvidia.com/deploy/gpu-debug-guidelines/index.html#understanding-xid-messages)」を参照してください。

以下の表に、既知の XID コード、その意味、および有効になっている場合のデフォルトのノード修復アクションを示します。


| XID コード | 説明 | 修復アクション | 
| --- | --- | --- | 
|  13  |  グラフィックエンジン例外 – GPU グラフィックエンジンエラーが発生しました。通常、ソフトウェアの問題やドライバーのバグが原因です。  |  リブート  | 
|  31  |  GPU メモリページの障害 – アプリケーションがマッピングされていない、またはアクセスできない GPU メモリにアクセスしようとしました。  |  リブート  | 
|  48  |  ダブルビット ECC エラー – GPU メモリで修正不可能なダブルビットエラーが発生しました。これはハードウェアの劣化の可能性を示しています。  |  リブート  | 
|  63  |  GPU メモリの再マッピングイベント – 検出されたエラーにより、GPU ドライバーが GPU メモリの一部を再マッピングしました。これは多くの場合、回復可能です。  |  リブート  | 
|  64  |  GPU メモリの再マッピングの失敗 – GPU が欠陥メモリを再マッピングできませんでした。これはハードウェアの問題を示しています。  |  リブート  | 
|  74  |  NVLink エラー – GPU 間の高速 NVLink 相互接続でエラーが発生しました。  |  置換  | 
|  79  |  GPU がバスから切断された – GPU は PCIe 経由でアクセスできなくなりました。これは通常、ハードウェアの障害や電源の問題を示しています。  |  置換  | 
|  94  |  限定的なメモリエラー – メモリエラーが発生しましたが、その影響は限定的で、他のアプリケーションには影響しませんでした。  |  リブート  | 
|  95  |  非限定的なメモリエラー – メモリエラーが発生し、他のアプリケーションやシステムメモリに影響を与えた可能性があります。  |  リブート  | 
|  119  |  GSP RPC タイムアウト – GPU システムプロセッサとの通信がタイムアウトしました。これは、ファームウェアの問題が原因である可能性があります。  |  置換  | 
|  120  |  GSP エラー – GPU システムプロセッサでエラーが発生しました。  |  置換  | 
|  121  |  C2C エラー – チップ間相互接続 (マルチダイ GPU で使用) でエラーが発生しました。  |  置換  | 
|  140  |  ECC 未回復エラー – ECC エラーが検出されず、データが破損した可能性があります。  |  置換  | 

GPU ヘルスに関連する現在のノード条件を表示するには、以下のコマンドを実行します。

```
kubectl get nodes -o custom-columns='NAME:.metadata.name,ACCELERATOR_READY:.status.conditions[?(@.type=="AcceleratedHardwareReady")].status,REASON:.status.conditions[?(@.type=="AcceleratedHardwareReady")].reason'
```

クラスターで XID 関連のイベントを表示するには、以下のいずれかのコマンドを実行します。

```
kubectl get events | grep -i "NvidiaXID"
```

## ContainerRuntime ノードのヘルスの問題
<a name="node-health-ContainerRuntime"></a>

次の表に記載されている、緊急度が「条件」である問題について、モニタリング条件は `ContainerRuntimeReady` です。


| 名前 | 緊急度 | 説明 | 修復アクション | 
| --- | --- | --- | --- | 
|  ContainerRuntimeFailed  |  イベント  |  コンテナランタイムはコンテナの作成に失敗しました。繰り返し発生する場合は、報告された問題に関連している可能性があります。  |  なし  | 
|  DeprecatedContainerdConfiguration  |  イベント  |  廃止されたイメージマニフェストバージョン 2、スキーマ 1 を使用するコンテナイメージが、最近 `containerd` を介してノードにプルされました。  |  なし  | 
|  KubeletFailed  |  イベント  |  kubelet が失敗状態になりました。  |  なし  | 
|  LivenessProbeFailures  |  イベント  |  ライブネスプローブの障害が検出されました。アプリケーションコードの問題や、繰り返し発生する場合はタイムアウト値が不十分である可能性を示しています。  |  なし  | 
|  PodStuckTerminating  |  条件  |  ポッドが終了しているか、または長時間停止していました。これは、ポッドの状態の進行を妨げる CRI エラーが原因で発生する可能性があります。  |  置換  | 
|  ReadinessProbeFailures  |  イベント  |  レディネスプローブの障害が検出されました。アプリケーションコードの問題や、繰り返し発生する場合はタイムアウト値が不十分である可能性を示しています。  |  なし  | 
|  [Name]RepeatedRestart  |  イベント  |  systemd ユニットが頻繁に再起動しています。  |  なし  | 
|  ServiceFailedToStart  |  イベント  |  systemd ユニットの起動に失敗しました。  |  なし  | 

## カーネルノードのヘルスの問題
<a name="node-health-Kernel"></a>

次の表に記載されている、緊急度が「条件」である問題について、モニタリング条件は `KernelReady` です。


| 名前 | 緊急度 | 説明 | 修復アクション | 
| --- | --- | --- | --- | 
|  AppBlocked  |  イベント  |  タスクが長時間スケジュールからブロックされており、通常は入力または出力がブロックされていることが原因で発生します。  |  なし  | 
|  AppCrash  |  イベント  |  ノード上のアプリケーションがクラッシュしました。  |  なし  | 
|  ApproachingKernelPidMax  |  イベント  |  プロセスの数が、現在の `kernel.pid_max` 設定で使用可能な PID の最大数に近づいています。最大数に到達すると、これ以上プロセスを起動することはできません。  |  なし  | 
|  ApproachingMaxOpenFiles  |  イベント  |  開いているファイルの数は、現在のカーネル設定で可能な開いているファイルの最大数に近づいています。最大数に到達すると、新しいファイルを開くことができなくなります。  |  なし  | 
|  ConntrackExceededKernel  |  イベント  |  接続追跡がカーネルの最大数を超え、新しい接続を確立できなかったため、パケットロスが発生する可能性があります。  |  なし  | 
|  ExcessiveZombieProcesses  |  イベント  |  完全に再要求できないプロセスが大量に蓄積されています。これはアプリケーションの問題を示しており、システムプロセスの制限に達する可能性があります。  |  なし  | 
|  ForkFailedOutOfPIDs  |  条件  |  フォークまたは実行の呼び出しが失敗したのは、システムがプロセス ID またはメモリ不足であるためです。これは、ゾンビプロセスまたは物理メモリの枯渇が原因である可能性があります。  |  置換  | 
|  KernelBug  |  イベント  |  CPU またはメモリの使用率が高いノードが原因でイベント処理が遅れることがありますが、カーネルのバグが Linux カーネル自体によって検出および報告されました。  |  なし  | 
|  LargeEnvironment  |  イベント  |  このプロセスの環境変数の数は予想よりも多く、`enableServiceLinks` が true に設定されている多くのサービスが原因で発生する可能性があります。このため、パフォーマンスの問題が発生する可能性があります。  |  なし  | 
|  RapidCron  |  イベント  |  このノードでは、cron ジョブが 5 分間隔よりも速く実行されています。このため、ジョブが大量のリソースを消費すると、パフォーマンスに影響が出る可能性があります。  |  なし  | 
|  SoftLockup  |  イベント  |  CPU が一定時間停止しました。  |  なし  | 

## ネットワークノードのヘルスの問題
<a name="node-health-Networking"></a>

次の表に記載されている、緊急度が「条件」である問題について、モニタリング条件は `NetworkingReady` です。


| 名前 | 緊急度 | 説明 | 修復アクション | 
| --- | --- | --- | --- | 
|  BandwidthInExceeded  |  イベント  |  インバウンド集計帯域幅がインスタンスの最大値を超えたため、パケットはキューに入れられたか、ドロップされました。  |  なし  | 
|  BandwidthOutExceeded  |  イベント  |  アウトバウンド集計帯域幅がインスタンスの最大値を超えたため、パケットはキューに入れられたか、ドロップされました。  |  なし  | 
|  ConntrackExceeded  |  イベント  |  接続追跡がインスタンスの最大数を超え、新しい接続を確立できなかったため、パケットロスが発生する可能性があります。  |  なし  | 
|  EFAErrorMetric  |  イベント  |  EFA ドライバーメトリクスは、パフォーマンスが低下しているインターフェイスがあることを示しています。  |  なし  | 
|  IPAMDInconsistentState  |  イベント  |  ディスク上の IPAMD チェックポイントの状態が、コンテナランタイム内の IP を反映していません。  |  なし  | 
|  IPAMDNoIPs  |  イベント  |  IPAMD が IP アドレスから外れています。  |  なし  | 
|  IPAMDNotReady  |  条件  |  IPAMD が API サーバーに接続できません。  |  置換  | 
|  IPAMDNotRunning  |  条件  |  Amazon VPC CNI プロセスは実行中であることが確認されませんでした。  |  置換  | 
|  IPAMDRepeatedlyRestart  |  イベント  |  IPAMD サービスで複数の再起動が発生しました。  |  なし  | 
|  InterfaceNotRunning  |  条件  |  このインターフェイスは実行されていないか、ネットワークの問題があります。  |  置換  | 
|  InterfaceNotUp  |  条件  |  このインターフェイスは起動していないか、ネットワークの問題があります。  |  置換  | 
|  KubeProxyNotReady  |  イベント  |  Kube-proxy がリソースの監視または一覧表示に失敗しました。  |  なし  | 
|  LinkLocalExceeded  |  イベント  |  ローカルプロキシサービスへのトラフィックの PPS がネットワークインターフェイスの最大値を超えたため、パケットがドロップされました。  |  なし  | 
|  MACAddressPolicyMisconfigured  |  イベント  |  systemd-networkd のリンク設定で、`MACAddressPolicy` の値が正しくありません。  |  なし  | 
|  MissingDefaultRoutes  |  イベント  |  デフォルトのルートルールが見つかりません。  |  なし  | 
|  MissingIPRoutes  |  イベント  |  Pod IP のルートがありません。  |  なし  | 
|  MissingIPRules  |  イベント  |  Pod IP のルールがありません。  |  なし  | 
|  MissingLoopbackInterface  |  条件  |  このインスタンスには、ループバックインターフェイスがないため、ローカル接続によってはサービスの不具合が発生します。  |  置換  | 
|  NetworkSysctl  |  イベント  |  このノードのネットワーク `sysctl` 設定が正しくない可能性があります。  |  なし  | 
|  PPSExceeded  |  イベント  |  双方向 PPS がインスタンスの最大値を超えたため、パケットはキューに入れられたか、ドロップされました。  |  なし  | 
|  PortConflict  |  イベント  |  ポッドが hostPort を使用する場合、ホストの既にバインドされているポートを上書きするように `iptables` ルールを書き込みできるため、API サーバーが `kubelet` にアクセスできなくなる可能性があります。  |  なし  | 
|  UnexpectedRejectRule  |  イベント  |  `iptables` で予期しない `REJECT` または `DROP` ルールが検出されたため、予想されたトラフィックがブロックされる可能性があります。  |  なし  | 

## ストレージノードのヘルスの問題
<a name="node-health-Storage"></a>

次の表に記載されている、緊急度が「条件」である問題について、モニタリング条件は `StorageReady` です。


| 名前 | 緊急度 | 説明 | 修復アクション | 
| --- | --- | --- | --- | 
|  EBSInstanceIOPSExceeded  |  イベント  |  インスタンスの最大 IOPS を超えました。  |  なし  | 
|  EBSInstanceThroughputExceeded  |  イベント  |  インスタンスの最大スループットを超えました。  |  なし  | 
|  EBSVolumeIOPSExceeded  |  イベント  |  特定の EBS ボリュームに対する最大 IOPS を超えました。  |  なし  | 
|  EBSVolumeThroughputExceeded  |  イベント  |  特定の Amazon EBS ボリュームに対する最大スループットを超えました。  |  なし  | 
|  EtcHostsMountFailed  |  イベント  |  `kubelet-container` オペレーション中にユーザーデータを `/var/lib/kubelet/pods` に再マウントしたため、kubelet が生成した `/etc/hosts` のマウントに失敗しました。  |  なし  | 
|  IODelays  |  イベント  |  入力または出力の遅延がプロセスで検出されました。過剰な場合は入力/出力プロビジョニングが不十分である可能性があります。  |  なし  | 
|  KubeletDiskUsageSlow  |  イベント  |  `kubelet` は、ファイルシステムにアクセスしようとしているときにディスクの使用が遅いことを報告しています。これは、ディスクの入出力が不十分である、またはファイルシステムに問題がある可能性を示しています。  |  なし  | 
|  XFSSmallAverageClusterSize  |  イベント  |  XFS 平均クラスターサイズが小さいことは、空き領域が過度に断片化されていることを示しています。このため、inode や空き領域が使用可能であっても、ファイルを作成できない場合があります。  |  なし  | 

## ノードモニタリングエージェントを設定する
<a name="node-monitoring-agent-configure"></a>

EKS ノードモニタリングエージェントは DaemonSet としてデプロイされます。EKS アドオンとしてデプロイする場合、以下の設定値を使用してインストールをカスタマイズできます。デフォルト設定については、EKS ノードモニタリングエージェントの [Helm チャート](https://github.com/aws/eks-node-monitoring-agent/blob/main/charts/eks-node-monitoring-agent/values.yaml)を参照してください。


| 設定オプション | 説明 | 
| --- | --- | 
|   `monitoringAgent.resources.requests.cpu`   |  モニタリングエージェントの CPU リソースリクエスト。  | 
|   `monitoringAgent.resources.requests.memory`   |  モニタリングエージェントのメモリリソースリクエスト。  | 
|   `monitoringAgent.resources.limits.cpu`   |  モニタリングエージェントの CPU リソース制限。  | 
|   `monitoringAgent.resources.limits.memory`   |  モニタリングエージェントのメモリリソース制限。  | 
|   `monitoringAgent.tolerations`   |  テイントが適用されたノードでモニタリングエージェントをスケジュールするための許容範囲。  | 
|   `monitoringAgent.additionalArgs`   |  モニタリングエージェントに渡す追加のコマンドライン引数。  | 

**注記**  
EKS アドオンまたは Helm インストールを使用して、`hostname-override` と `verbosity` を `monitoringAgent.additionalArgs` として設定できます。現在、EKS アドオンまたは Helm インストールでは、追加の引数を使用してノードモニタリングエージェントの `probe-address` (`8002`) または `metrics-address` (`8003`) をカスタマイズすることはできません。

ノードモニタリングエージェントには、NVIDIA GPU をモニタリングするための NVIDIA DCGM (Data Center GPU Manager) サーバーコンポーネント (`nv-hostengine`) が含まれています。このコンポーネントは、エージェントの [Helm チャート](https://github.com/aws/eks-node-monitoring-agent/blob/main/charts/eks-node-monitoring-agent/values.yaml)の `nodeAffinity` で示されるように、NVIDIA GPU インスタンスタイプのノードでのみ実行されます。EKS ノードモニタリングエージェントで既存の NVIDIA DCGM インストールを使用することはできません。この機能が必要な場合は、EKS ロードマップ [GitHub 問題 \$12763](https://github.com/aws/containers-roadmap/issues/2763) に関するフィードバックを提供してください。

EKS ノードモニタリングエージェントを EKS アドオンとしてデプロイする場合、以下の設定値を使用して NVIDIA DCGM のインストールをカスタマイズできます。


| 設定オプション | 説明 | 
| --- | --- | 
|   `dcgmAgent.resources.requests.cpu`   |  DCGM エージェントの CPU リソースリクエスト。  | 
|   `dcgmAgent.resources.requests.memory`   |  DCGM エージェントのメモリリソースリクエスト。  | 
|   `dcgmAgent.resources.limits.cpu`   |  DCGM エージェントの CPU リソース制限。  | 
|   `dcgmAgent.resources.limits.memory`   |  DCGM エージェントのメモリリソース制限。  | 
|   `dcgmAgent.tolerations`   |  テイントが適用されたノードで DCGM エージェントをスケジュールするための許容範囲。  | 

以下の AWS CLI コマンドを使用して、EKS ノードモニタリングエージェントの EKS アドオンのバージョンとスキーマに関する有用な情報を取得できます。

Kubernetes バージョンの最新のエージェントアドオンバージョンを取得します。`1.35` を Kubernetes バージョンに置き換えます。

```
aws eks describe-addon-versions \
  --addon-name eks-node-monitoring-agent \
  --kubernetes-version 1.35 \
  --query='addons[].addonVersions[].addonVersion'
```

EKS アドオンでサポートされているエージェントアドオンスキーマを取得します。`v1.5.1-eksbuild.1` をエージェントバージョンに置き換えます。

```
aws eks describe-addon-configuration \
  --addon-name eks-node-monitoring-agent \
  --addon-version v1.5.1-eksbuild.1
```

# EKS クラスター内のノードを自動的に修復する
<a name="node-repair"></a>

このトピックでは、EKS 自動ノード修復の動作と、要件を満たすように設定する方法について詳しく説明します。EKS 自動ノード修復は EKS Auto Mode でデフォルトで有効になっており、EKS マネージド型ノードグループと Karpenter で使用できます。

デフォルトの EKS 自動ノード修復アクションは、以下の表にまとめられており、EKS Auto Mode、EKS マネージド型ノードグループ、Karpenter の動作に適用されます。EKS Auto Mode または Karpenter を使用する場合、すべての `AcceleratedHardwareReady` 修復アクションは `Replace` であり、EKS マネージド型ノードグループのみが修復アクションとして `Reboot` をサポートします。

EKS ノードモニタリングエージェントによって検出されたノードのヘルス問題とその対応するノード修復アクションの詳細なリストについては、「[EKS ノードモニタリングエージェントのノードのヘルス問題を検出する](node-health-nma.md)」を参照してください。


| ノードの状態 | 説明 | 修復までの時間 | 修復アクション | 
| --- | --- | --- | --- | 
|  AcceleratedHardwareReady  |  AcceleratedHardwareReady は、ノードの高速ハードウェア (GPU、Neuron) が正しく機能しているかどうかを示します。  |  10m  |  置換または再起動  | 
|  ContainerRuntimeReady  |  ContainerRuntimeReady は、コンテナランタイム (containerd など) が正しく機能し、コンテナを実行できるかどうかを示します。  |  30m  |  置換  | 
|  DiskPressure  |  DiskPressure は、ノードにディスクプレッシャー (ディスク容量が少ない、または I/O が高い) が発生していることを示す標準の Kubernetes 条件です。  |  該当なし  |  なし  | 
|  KernelReady  |  KernelReady は、重大なエラー、パニック、またはリソースの枯渇が発生することなく、カーネルが正しく機能しているかどうかを示します。  |  30m  |  置換  | 
|  MemoryPressure  |  MemoryPressure は、ノードにメモリプレッシャー (使用可能なメモリが少ない) が発生していることを示す標準の Kubernetes 条件です。  |  該当なし  |  なし  | 
|  NetworkingReady  |  NetworkingReady は、ノードのネットワークスタック (インターフェイス、ルーティング、接続) が正しく機能しているかどうかを示します。  |  30m  |  置換  | 
|  StorageReady  |  StorageReady は、ノードのストレージサブシステム (ディスク、ファイルシステム、I/O) が正しく機能しているかどうかを示します。  |  30m  |  置換  | 
|  Ready  |  Ready は、ノードが正常でポッドを受け入れる準備ができていることを示す標準の Kubernetes 条件です。  |  30m  |  置換  | 

EKS 自動ノード修復アクションは、以下のシナリオではデフォルトで無効になっています。進行中のノード修復アクションは、各シナリオで続行されます。これらのデフォルト設定を上書きする方法については、「[自動ノード修復を設定する](#configure-node-repair)」を参照してください。

 **EKS マネージド型ノードグループ** 
+ ノードグループに 5 つを超えるノードがあり、そのうち 20% を超えるノードに異常があります。
+ クラスターのゾーンシフトは、Application Recovery Controller (ARC) を介してトリガーされます。

 **EKS Auto Mode と Karpenter** 
+ NodePool 内のノードのうち、20% を超えるノードに異常があります。
+ スタンドアロン NodeClaims の場合、クラスター内のノードの 20% に異常があります。

## 自動ノード修復を設定する
<a name="configure-node-repair"></a>

EKS Auto Mode を使用する場合、自動ノード修復を設定することはできません。自動ノード修復は常に Karpenter と同じデフォルト設定で有効になります。

### Karpenter
<a name="configure-node-repair-karpenter"></a>

Karpenter で自動ノード修復を使用するには、機能ゲート `NodeRepair=true` を有効にします。機能ゲートは、Karpenter デプロイの `--feature-gates` CLI オプションまたは `FEATURE_GATES` 環境変数を使用して有効にできます。詳細については、[Karpenter](https://karpenter.sh/docs/concepts/disruption/#node-auto-repair) のドキュメントを参照してください。

### マネージドノードグループ
<a name="configure-node-repair-mng"></a>

新しい EKS マネージド型ノードグループを作成するとき、または既存の EKS マネージド型ノードグループを更新することで、自動ノード修復を有効にできます。
+  **Amazon EKS コンソール** – マネージド型ノードグループの **[ノード自動修復を有効にする]** チェックボックスを選択します。詳細については、「[クラスターのマネージドノードグループを作成する](create-managed-node-group.md)」を参照してください。
+  **AWS CLI** – `--node-repair-config enabled=true` を [https://docs.aws.amazon.com/cli/latest/reference/eks/create-nodegroup.html](https://docs.aws.amazon.com/cli/latest/reference/eks/create-nodegroup.html) または [https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html](https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html) コマンドに追加します。
+  **eksctl** – `managedNodeGroups.nodeRepairConfig.enabled: true` を設定します。[eksctl GitHub](https://github.com/eksctl-io/eksctl/blob/main/examples/44-node-repair.yaml) の例を参照してください。

EKS マネージド型ノードグループを使用する場合、以下の設定でノード自動修復の動作を制御できます。

ノード自動修復がいつアクションを停止するかを制御するには、ノードグループ内の異常のあるノードの数に基づいてしきい値を設定します。絶対数またはパーセンテージのいずれかを設定します。両方を設定することはできません。


| 設定 | 説明 | 
| --- | --- | 
|   `maxUnhealthyNodeThresholdCount`   |  ノード自動修復が停止する異常ノードの絶対数。これを使用して、修復の範囲を制限します。  | 
|   `maxUnhealthyNodeThresholdPercentage`   |  ノード自動修復が停止する異常ノードの割合 (0～100)。  | 

同時に修復するノードの数を制御するには、修復並列処理を設定できます。異常のあるノードしきい値と同様に、絶対数またはパーセンテージのいずれかを設定します。両方を設定することはできません。


| 設定 | 説明 | 
| --- | --- | 
|   `maxParallelNodesRepairedCount`   |  同時に修復するノードの最大数。  | 
|   `maxParallelNodesRepairedPercentage`   |  同時に修復する異常ノードの最大パーセンテージ (0～100)。  | 

`nodeRepairConfigOverrides` では、特定の条件に合わせて修復動作をカスタマイズできます。これは、さまざまな問題タイプに対して異なる修復アクションまたは待機時間が必要な場合に使用します。

上書きにはそれぞれ、以下のすべてのフィールドが必要です。


| フィールド | 説明 | 
| --- | --- | 
|   `nodeMonitoringCondition`   |  ノードモニタリングエージェントによって報告されたノードの状態タイプ。例えば、`AcceleratedHardwareReady`、`NetworkingReady`、`StorageReady`、`KernelReady` などです。  | 
|   `nodeUnhealthyReason`   |  異常状態の特定の理由コード。例: `NvidiaXID31Error`、`IPAMDNotRunning`。  | 
|   `minRepairWaitTimeMins`   |  ノードが修復対象となるまでに、その状態が継続している必要がある最小時間 (分単位)。これは、一時的な問題のためにノードを修復しないようにする場合に使用します。  | 
|   `repairAction`   |  条件が満たされたときに実行するアクション。有効な値: `Replace` (ノードを終了して置き換える)、`Reboot` (ノードを再起動する)、または `NoAction` (修復アクションなし)。  | 

以下の AWS CLI の例では、カスタム修復設定を使用してノードグループを作成します。

```
aws eks create-nodegroup \
  --cluster-name my-cluster \
  --nodegroup-name my-nodegroup \
  --node-role arn:aws:iam::111122223333:role/NodeRole \
  --subnets subnet-0123456789abcdef0 \
  --node-repair-config '{
    "enabled": true,
    "maxUnhealthyNodeThresholdPercentage": 10,
    "maxParallelNodesRepairedCount": 3,
    "nodeRepairConfigOverrides": [
      {
        "nodeMonitoringCondition": "AcceleratedHardwareReady",
        "nodeUnhealthyReason": "NvidiaXID64Error",
        "minRepairWaitTimeMins": 5,
        "repairAction": "Replace"
      },
      {
        "nodeMonitoringCondition": "AcceleratedHardwareReady",
        "nodeUnhealthyReason": "NvidiaXID31Error",
        "minRepairWaitTimeMins": 15,
        "repairAction": "NoAction"
      }
    ]
  }'
```

この設定では、以下のことが行われます。
+ ノード自動修復を有効にする
+ 10% を超えるノードに異常がある場合に修復アクションを停止する
+ 一度に最大 3 つのノードを修復する
+ XID 64 エラー (GPU メモリの再マッピングの失敗) を上書きして、5 分後にノードを置き換える。デフォルトでは 10 分後に再起動します。
+ XID 31 エラー (GPU メモリページの障害) を上書きして、アクションを実行しない。デフォルトでは 10 分後に再起動します。

# ノードのヘルスステータスを表示する
<a name="learn-status-conditions"></a>

このトピックでは、Amazon EKS クラスターのノードのヘルスステータスをモニタリングするために使用可能なツールと方法について説明します。この情報には、ノードレベルの問題の特定と診断に役立つノードの状態、イベント、検出ケースが取り上げられます。ここで説明するコマンドとパターンを使用して、ノードのヘルスリソースを検査し、ステータス条件を解明し、ノードイベントを分析して運用上のトラブルシューティングを行います。

すべてのノードに対して Kubernetes コマンドを使用して、ノードのヘルス情報を取得できます。また、Amazon EKS Auto Mode または Amazon EKS マネージドアドオンを介してノードモニタリングエージェントを使用すると、トラブルシューティングに役立つさまざまなノードシグナルが得られます。ノードモニタリングエージェントによって検出されたヘルス問題の説明は、オブザーバビリティダッシュボードでも確認できます。詳細については、「[EKS ノードモニタリングエージェントのノードのヘルス問題を検出する](node-health-nma.md)」を参照してください。

## ノードの状態
<a name="status-node-conditions"></a>

ノードの状態は、インスタンスの置き換えや再起動などの修復アクションを必要とするターミナルの問題を表します。

 **すべてのノードの状態を取得するには:** 

```
kubectl get nodes -o 'custom-columns=NAME:.metadata.name,CONDITIONS:.status.conditions[*].type,STATUS:.status.conditions[*].status'
```

 **特定のノードの詳細な状態を取得するには** 

```
kubectl describe node node-name
```

 **正常なノードの状態の出力の例:** 

```
  - lastHeartbeatTime: "2024-11-21T19:07:40Z"
    lastTransitionTime: "2024-11-08T03:57:40Z"
    message: Monitoring for the Networking system is active
    reason: NetworkingIsReady
    status: "True"
    type: NetworkingReady
```

 **ネットワーク形成の問題がある異常なノードの状態の例:** 

```
  - lastHeartbeatTime: "2024-11-21T19:12:29Z"
    lastTransitionTime: "2024-11-08T17:04:17Z"
    message: IPAM-D has failed to connect to API Server which could be an issue with
      IPTable rules or any other network configuration.
    reason: IPAMDNotReady
    status: "False"
    type: NetworkingReady
```

## ノードイベント
<a name="status-node-events"></a>

ノードイベントは、一時的な問題または最適ではない設定を示します。

 **ノードモニタリングエージェントによって報告されたすべてのイベントを取得するには** 

ノードモニタリングエージェントが使用可能になったら、次のコマンドを実行できます。

```
kubectl get events --field-selector=reportingComponent=eks-node-monitoring-agent
```

サンプル出力:

```
LAST SEEN   TYPE      REASON       OBJECT                                              MESSAGE
4s          Warning   SoftLockup   node/ip-192-168-71-251.us-west-2.compute.internal   CPU stuck for 23s
```

 **すべてのノードのイベントを取得するには** 

```
kubectl get events --field-selector involvedObject.kind=Node
```

 **特定のノードのイベントを取得するには** 

```
kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=node-name
```

 **イベントをリアルタイムで監視するには** 

```
kubectl get events -w --field-selector involvedObject.kind=Node
```

 **イベント出力の例:** 

```
LAST SEEN   TYPE     REASON           OBJECT         MESSAGE
2m          Warning  MemoryPressure   Node/node-1    Node experiencing memory pressure
5m          Normal   NodeReady        Node/node-1    Node became ready
```

## 一般的なトラブルシューティングのコマンド
<a name="status-node-troubleshooting"></a>

```
# Get comprehensive node status
kubectl get node node-name -o yaml

# Watch node status changes
kubectl get nodes -w

# Get node metrics
kubectl top node
```

# kubectl と S3 を使用してマネージドノードのノードログを取得する
<a name="auto-get-logs"></a>

ノードモニタリングエージェントを備えた Amazon EKS マネージドノードのノードログを取得する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>

以下があることを確認します。
+ ノードモニタリングエージェントを備えた既存の Amazon EKS クラスター。詳細については、「[ノードのヘルス問題を検出し、自動ノード修復を有効にする](node-health.md)」を参照してください。
+ クラスターと通信するようにインストールおよび設定された `kubectl` コマンドラインツール。
+ S3 バケットとオブジェクトを作成するのに十分なアクセス許可が付与された状態でインストールおよびログインした AWS CLI。
+ インストール済みの Python 3 最新バージョン
+ インストール済みの AWS SDK for Python 3、Boto 3。

## ステップ 1: S3 バケットの宛先を作成する (任意)
<a name="_step_1_create_s3_bucket_destination_optional"></a>

ログを格納する S3 バケットがまだない場合は、作成します。次の AWS CLI コマンドを使用します。バケットのデフォルトは `private` アクセスコントロールリストです。*bucket-name* はユーザーが選択した一意のバケット名に置き換えます。

```
aws s3api create-bucket --bucket <bucket-name>
```

## ステップ 2: HTTP Put の事前署名された S3 URL を作成する
<a name="_step_2_create_pre_signed_s3_url_for_http_put"></a>

Amazon EKS は、指定した URL に対して HTTP PUT オペレーションを実行してノードログを返します。このチュートリアルでは、事前署名された S3 HTTP PUT URL を生成します。

ログは gzip tarball として `.tar.gz` 拡張子で返されます。

**注記**  
AWS API または SDK を使用して、EKS がログファイルをアップロードするための事前署名された S3 アップロード URL を作成する必要があります。AWS CLI を使用して事前署名された S3 アップロード URL を作成することはできません。

1. ログを格納するバケット内の場所を決定します。例えば、キーとして *2024-11-12/logs1.tar.gz* を使用できます。

1. *presign-upload.py* ファイルに次の Python コードを保存します。*<bucket-name>* と *<key>* を置き換えます。キーは `.tar.gz` で終わる必要があります。

   ```
   import boto3; print(boto3.client('s3').generate_presigned_url(
      ClientMethod='put_object',
      Params={'Bucket': '<bucket-name>', 'Key': '<key>'},
      ExpiresIn=1000
   ))
   ```

1. 次を使用してスクリプトを実行します

   ```
   python presign-upload.py
   ```

1. URL 出力をメモします。この値は、次のステップで *http-put-destination* として使用します。

詳細については、AWS Boto3 SDK for Python ドキュメントの「[Generate a presigned URL to upload a file](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-url-to-upload-a-file)」を参照してください。

## ステップ 3: NodeDiagnostic リソースを作成する
<a name="_step_3_create_nodediagnostic_resource"></a>

ログを収集するノードの名前を特定します。

リソースの名前としてノードの名前を使用する `NodeDiagnostic` マニフェストを作成し、HTTP PUT URL の宛先を指定します。

```
apiVersion: eks.amazonaws.com/v1alpha1
kind: NodeDiagnostic
metadata:
    name: <node-name>
spec:
    logCapture:
        destination: http-put-destination
```

マニフェストをクラスターに適用します。

```
kubectl apply -f nodediagnostic.yaml
```

`NodeDiagnostic` リソースを記述することで、コレクションのステータスを確認できます。
+ ステータスが `Success` または `SuccessWithErrors` の場合は、タスクが完了し、ログが指定された宛先にアップロードされたことを示します (`SuccessWithErrors` は、一部のログが欠落している可能性があることを示します)。
+ ステータスが Failure の場合は、アップロード URL が正しい形式であり、有効期限が切れていないことを確認してください。

```
kubectl describe nodediagnostics.eks.amazonaws.com/<node-name>
```

## ステップ 4: S3 からログをダウンロードする
<a name="_step_4_download_logs_from_s3"></a>

ログをダウンロードする前に約 1 分待ちます。そして、S3 CLI を使用してログをダウンロードします。

```
# Once NodeDiagnostic shows Success status, download the logs
aws s3 cp s3://<bucket-name>/key ./<path-to-node-logs>.tar.gz
```

## ステップ 5: NodeDiagnostic リソースをクリーンアップする
<a name="_step_5_clean_up_nodediagnostic_resource"></a>
+  `NodeDiagnostic` リソースは自動的には削除されません。ログアーティファクトを取得したら、自分でクリーンアップする必要があります。

```
# Delete the NodeDiagnostic resource
kubectl delete nodediagnostics.eks.amazonaws.com/<node-name>
```

## NodeDiagnostic `node` 宛先
<a name="_nodediagnostic_node_destination"></a>

ノードモニタリングエージェントのバージョン `v1.6.0` 以降では、ログ収集の宛先を `node` に設定するオプションがあります。この宛先を使用すると、ログは後で収集できるようにノード上に一時的に保持されます。この機能のほか、ノードモニタリングエージェントの GitHub リポジトリ内にインタラクションとログ収集を容易にする `kubectl` プラグインもあり、インストールして利用できます。詳細については、[`kubectl ekslogs` プラグイン](https://github.com/aws/eks-node-monitoring-agent/blob/main/tools/kubectl-ekslogs/README.md)のドキュメントを参照してください。

## 使用例
<a name="_example_usage"></a>

```
# Collect NodeDiagnostic logs from a single node
kubectl ekslogs <node-name>

# Collect NodeDiagnostic logs from multiple nodes
kubectl ekslogs <node-name-1> <node-name-2> <node-name-3>

# Collect NodeDiagnostic logs from all nodes with a specific label
kubectl ekslogs -l <key>=<value>
```

# Amazon EKS Hybrid Nodes の概要
<a name="hybrid-nodes-overview"></a>

*Amazon EKS Hybrid Nodes* では、オンプレミスおよびエッジインフラストラクチャを Amazon EKS クラスターのノードとして使用できます。AWS は、Amazon EKS クラスターの AWS ホスト型 Kubernetes コントロールプレーンを管理し、オンプレミス環境またはエッジ環境で実行されるハイブリッドノードを管理します。これにより、Kubernetes 管理が環境全体で統合され、Kubernetes コントロールプレーン管理がオンプレミスおよびエッジアプリケーションの AWS にオフロードされます。

Amazon EKS Hybrid Nodes は、オンプレミスのハードウェアまたは仮想マシンと連携し、アプリケーションを実行する必要がある場所に Amazon EKS の効率、スケーラビリティ、可用性をもたらします。Amazon EKS Hybrid Nodes では、Amazon EKS アドオン、Amazon EKS Pod Identity、クラスターアクセスエントリ、クラスターインサイト、Kubernetes バージョンの延長サポートといったさまざまな Amazon EKS 機能を使用できます。Amazon EKS Hybrid Nodes は AWS Systems Manager、AWS IAM Roles Anywhere、Amazon Managed Service for Prometheus、Amazon CloudWatch などの AWS サービスとネイティブに統合し、一元化したモニタリング、ログ記録、ID 管理を実現します。

Amazon EKS Hybrid Nodes では、前払いの義務や最低料金はなく、ハイブリッドノードの vCPU リソースが Amazon EKS クラスターにアタッチされると、1 時間ごとに課金されます。料金の詳細については、「[Amazon EKS の料金表](https://aws.amazon.com/eks/pricing/)」を参照してください。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/tFn9IdlddBw?rel=0/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/tFn9IdlddBw?rel=0)


## 機能
<a name="hybrid-nodes-features"></a>

EKS Hybrid Nodes には、次の高度な機能があります。
+  **マネージド型 Kubernetes のコントロールプレーン**: AWS がホストする、EKS クラスターの Kubernetes コントロールプレーンは AWS が管理し、オンプレミス環境またはエッジ環境で実行されるハイブリッドノードはユーザーが管理します。これにより、Kubernetes 管理が環境全体で統合され、Kubernetes コントロールプレーン管理がオンプレミスおよびエッジアプリケーションの AWS にオフロードされます。Kubernetes コントロールプレーンを AWS に移動させることで、ユーザーはアプリケーションのオンプレミス容量を節約し、ワークロードのスケーリングは Kubernetes コントロールプレーンに任せることができます。
+  **一貫性のある EKS エクスペリエンス**: ほとんどの EKS 機能は EKS Hybrid Nodes でサポートされており、EKS アドオン、EKS Pod Identity、クラスターアクセスエントリ、クラスターインサイト、Kubernetes バージョンの拡張サポートその他の、オンプレミス環境とクラウド環境を横断する、一貫性のある EKS エクスペリエンスを実現しています。EKS Hybrid Nodes でサポートされている EKS アドオンの詳細については、「[ハイブリッドノードのアドオンを構成する](hybrid-nodes-add-ons.md)」を参照してください。
+  **オブザーバビリティと ID 管理を一元化**: EKS Hybrid Nodes は、AWS Systems Manager、AWS IAM Roles Anywhere、Amazon Managed Service for Prometheus、Amazon CloudWatch などの AWS サービスとネイティブに統合されており、モニタリング、ログ記録、ID 管理を一元的に行えます。
+  **Burst-to-cloud またはオンプレミス容量の追加**: EKS クラスターを 1 つ使うことで、AWS リージョン、AWS Local Zones、AWS Outposts のいずれかでハイブリッドノードおよびノードを実行し、EKS クラスターに Burst-to-cloud する、またはオンプレミス容量を追加することができます。詳細については、「[Considerations for mixed mode clusters](hybrid-nodes-webhooks.md#hybrid-nodes-considerations-mixed-mode)」を参照してください。
+  **柔軟なインフラストラクチャ**: EKS Hybrid Nodes は *Bring Your Own Infrastructure* のアプローチに従い、ユーザーがハイブリッドノードに使用しているインフラストラクチャに依存しません。ハイブリッドノードを物理マシンまたは仮想マシン、および x86 と ARM のアーキテクチャで実行できるため、ハイブリッドノードで実行されているオンプレミスワークロードを、さまざまなインフラストラクチャタイプに移行することができます。
+  **柔軟なネットワーキング**: EKS Hybrid Nodes を使用すると、EKS コントロールプレーンとハイブリッドノード間の通信は、クラスターの作成時にユーザーが渡す VPC とサブネットを介してルーティングされます。これは、コントロールプレーンからノードへのネットワーキング向けに[既存のメカニズム](https://docs.aws.amazon.com/eks/latest/best-practices/subnets.html)の上に構築されます。これにより、ユーザーが希望する、オンプレミスネットワークを AWS の VPC に接続する方法に、柔軟に対応できます。AWS Site-to-Site VPN、AWS Direct Connect、あるいはユーザー独自の VPN ソリューションなど、[文書化されたオプション](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)を複数利用でき、ユースケースに最適な方法を選択できます。

## 制限
<a name="hybrid-node-limits"></a>
+ クラスターごとにリモートノードネットワークには最大 15 CIDR がサポートされ、リモートポッドネットワークには最大 15 CIDR がサポートされています。

## 考慮事項
<a name="hybrid-nodes-general"></a>
+ EKS Hybrid Nodes は、新規の EKS クラスターでも既存の EKS クラスターでも使用できます。
+ EKS Hybrid Nodes は、AWS GovCloud (米国) リージョンと AWS 中国リージョンを除くすべての AWS リージョンで使用できます。
+ EKS Hybrid Nodes には、オンプレミス環境と AWS の間に信頼性の高い接続が必要です。EKS Hybrid Nodes は、切断された環境、中断しているまたは一時的に停止している環境、制限 (DDIL) されている環境には適していません。DDIL 環境で実行している場合は、[Amazon EKS Anywhere](https://aws.amazon.com/eks/eks-anywhere/) を検討してください。ネットワーク切断シナリオでハイブリッドノードの動作に関する詳細については、「[EKS Hybrid Nodes のベストプラクティス](https://docs.aws.amazon.com/eks/latest/best-practices/hybrid-nodes-network-disconnections.html)」を参照してください。
+ EKS Hybrid Nodes をクラウドインフラストラクチャ (AWS リージョン、AWS Local Zones、AWS Outposts) やその他のクラウドで実行することは、サポートされていません。Amazon EC2 インスタンスでハイブリッドノードを実行すると、ハイブリッドノード料金が課金されます。
+ ハイブリッドノードの請求は、ノードが EKS クラスターに追加されたとに開始し、ノードがクラスターから削除されたときに停止します。ハイブリッドノードを使用しないときは、必ず EKS クラスターからこれを削除してください。

## 追加リソース
<a name="hybrid-nodes-resources"></a>
+  [https://www.eksworkshop.com/docs/networking/eks-hybrid-nodes/](https://www.eksworkshop.com/docs/networking/eks-hybrid-nodes/): EKS Hybrid Nodes をデモ環境にデプロイするためのステップバイステップ手順。
+  [https://www.youtube.com/watch?v=ZxC7SkemxvU](https://www.youtube.com/watch?v=ZxC7SkemxvU): EKS Hybrid Nodes の顧客環境でのローンチを紹介し、顧客が独自の環境で EKS Hybrid Nodes どのように使用しているかを示す AWS re:Invent セッション。
+  [https://repost.aws/articles/ARL44xuau6TG2t-JoJ3mJ5Mw/unpacking-the-cluster-networking-for-amazon-eks-hybrid-nodes](https://repost.aws/articles/ARL44xuau6TG2t-JoJ3mJ5Mw/unpacking-the-cluster-networking-for-amazon-eks-hybrid-nodes): EKS Hybrid Nodes のネットワークを設定するためのさまざまな方法について説明する記事。
+  [https://aws.amazon.com/blogs/containers/run-genai-inference-across-environments-with-amazon-eks-hybrid-nodes/](https://aws.amazon.com/blogs/containers/run-genai-inference-across-environments-with-amazon-eks-hybrid-nodes/): EKS Hybrid Nodes を使用した複数環境間で生成 AI 推論を実行する方法について示すブログ投稿。

# ハイブリッドノードの前提条件のセットアップ
<a name="hybrid-nodes-prereqs"></a>

Amazon EKS Hybrid Nodes を使用するには、オンプレミス環境と AWS 間のプライベート接続、サポートされているオペレーティングシステムを持つベアメタルサーバーまたは仮想マシン、AWS IAM Roles Anywhere または AWS Systems Manager (SSM) ハイブリッドアクティベーションを設定する必要があります。ハイブリッドノードのライフサイクル全体を通じてこれらの前提条件を管理するのはお客様の責任となります。
+ オンプレミス環境と AWS 間のハイブリッドネットワーク接続　 
+ 物理マシンまたは仮想マシンの形式のインフラストラクチャ
+ ハイブリッドノードと互換性のあるオペレーティングシステム
+ オンプレミスの IAM 認証情報プロバイダーが設定されました

![\[ハイブリッドノードのネットワーク接続。\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-prereq-diagram.png)


## ハイブリッドネットワーク接続
<a name="hybrid-nodes-prereqs-connect"></a>

Amazon EKS コントロールプレーンとハイブリッドノード間の通信は、クラスターの作成時に渡される VPC とサブネットを介してルーティングされます。これは、コントロールプレーンからノードへのネットワーク形成のために Amazon EKS の[既存のメカニズム](https://aws.github.io/aws-eks-best-practices/networking/subnets/)上に構築されます。オンプレミス環境と VPC の接続には、AWS Site-to-Site VPN、AWS Direct Connect、独自の VPN 接続など、[文書化されたオプション](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)がいくつか利用可能です。ハイブリッドネットワーク接続にこれらのソリューションを使用する方法の詳細については、「[AWS Site-to-Site VPN ユーザーガイド](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)」および「[AWS Direct Connect ユーザーガイド](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)」を参照してください。

最適なエクスペリエンスを実現するには、ハイブリッドノードから AWS リージョンへの接続には、100 Mbps 以上の通信速度と 200 ミリ秒以下のラウンドトリップレイテンシーを持つ、信頼性の高いネットワーク接続が推奨されます。これはほとんどのユースケースに対応する一般的なガイダンスですが、厳格な要件ではありません。帯域幅とレイテンシーの要件は、アプリケーションのイメージサイズ、アプリケーションの伸縮性、モニタリングとログ記録の設定、他の AWS サービスに保存されているデータへのアクセスに関するアプリケーションの依存関係など、ハイブリッドノードの数とワークロードの特性によって異なります。本番環境にデプロイする前に、独自のアプリケーションと環境でテストして、ネットワーク設定がワークロードの要件を満たしているか確認することをお勧めします。

## オンプレミスのネットワーク設定
<a name="hybrid-nodes-prereqs-onprem"></a>

Amazon EKS コントロールプレーンからオンプレミス環境へのインバウンドネットワークアクセスを有効にして、Amazon EKS コントロールプレーンが、ハイブリッドノードで実行されている `kubelet` と通信できるようにし、オプションでハイブリッドノードで実行されているウェブフックと通信できるようにする必要があります。さらに、Amazon EKS コントロールプレーンと通信するには、ハイブリッドノードとハイブリッドノードで実行されているコンポーネントのアウトバウンドネットワークアクセスを有効にする必要があります。この通信は、AWS Direct Connect、AWS Site-to-Site VPN、または独自の VPN 接続に対して完全にプライベートなままになるように設定できます。

オンプレミスノードおよびポッドネットワークに使用する Classless Inter-Domain Routing (CIDR) 範囲では、IPv4 RFC1918 アドレスまたは CGNAT アドレスの範囲を使用する必要があります。オンプレミスルーターは、オンプレミスノードとオプションでポッドへのルートで設定する必要があります。ファイアウォールおよびオンプレミス環境で有効にする必要があるポートおよびプロトコルの完全なリストなど、オンプレミスのネットワーク要件の詳細については、「[オンプレミスネットワーク設定](hybrid-nodes-networking.md#hybrid-nodes-networking-on-prem)」を参照してください。

## EKS クラスター設定
<a name="hybrid-nodes-prereqs-cluster"></a>

レイテンシーを最小限に抑えるには、オンプレミス環境またはエッジ環境に最も近い AWS リージョンで Amazon EKS クラスターを作成することが推奨されます。Amazon EKS クラスターの作成時に、2 つの API フィールド、`RemoteNodeNetwork` および `RemotePodNetwork` を介してオンプレミスのノードとポッドの CIDR を渡します。オンプレミスのノードとポッドの CIDR を特定するために、オンプレミスのネットワークチームに相談する必要がある場合があります。ノード CIDR はオンプレミスネットワークから割り当てられ、ポッド CIDR は、CNI のオーバーレイネットワークを使用している場合に使用する Container Network Interface (CNI) から割り当てられます。Cilium および Calico はデフォルトでオーバーレイネットワークを使用します。

`RemoteNodeNetwork` および `RemotePodNetwork` フィールドを介して設定するオンプレミスノードおよびポッド CIDR は、VPC 経由でハイブリッドノードで実行されている `kubelet` およびポッドにトラフィックをルーティングするように Amazon EKS コントロールプレーンを設定するために使用されます。クラスター作成時に渡す VPC CIDR、または Amazon EKS クラスターのサービス IPv4 構成と互いに重複することはできません。また、オンプレミスのルーターがトラフィックをルーティングできるように、ポッド CIDR を各 EKS クラスターに対して一意にする必要があります。

Amazon EKS Kubernetes API サーバーエンドポイントには、パブリックエンドポイントまたはプライベートエンドポイントのいずれかのアクセスを使用することが推奨されます。「Public and Private (パブリックとプライベート)」を選択した場合、Amazon EKS Kubernetes API サーバーエンドポイントは、常に VPC の外部で稼働しているハイブリッドノードのパブリック IP に解決されるため、ハイブリッドノードがクラスターに参加できなくなる可能性があります。パブリックエンドポイントアクセスを使用すると、Kubernetes API サーバーエンドポイントはパブリック IP に解決され、ハイブリッドノードから Amazon EKS コントロールプレーンへの通信はインターネット経由でルーティングされます。プライベートエンドポイントアクセスを選択すると、Kubernetes API サーバーエンドポイントはプライベート IP に解決され、ハイブリッドノードから Amazon EKS コントロールプレーンへの通信は、プライベート接続リンク (ほとんどの場合 AWS Direct Connect または AWS Site-to-Site VPN) を介してルーティングされます。

## VPC の構成
<a name="hybrid-nodes-prereqs-vpc"></a>

Amazon EKS クラスター作成時に渡す VPC のルーティングテーブルに、オンプレミスノード用のルートを設定し、オプションで仮想プライベートゲートウェイ (VGW) またはトランジットゲートウェイ (TGW) をターゲットとするポッドネットワークを設定する必要があります。次に例を示します。`REMOTE_NODE_CIDR` と `REMOTE_POD_CIDR` をオンプレミスのネットワークの値に置き換えます。


| ルーティング先 | ターゲット | 説明 | 
| --- | --- | --- | 
|  10.226.0.0/16  |  ローカル  |  VPC 内の VPC ルートへのローカルトラフィック  | 
|  REMOTE\$1NODE\$1CIDR  |  tgw-abcdef123456  |  オンプレミスノード CIDR、トラフィックを TGW にルーティングする  | 
|  REMODE\$1POD\$1CIDR  |  tgw-abcdef123456  |  オンプレミスポッド CIDR、トラフィックを TGW にルーティングする  | 

## セキュリティグループの構成
<a name="hybrid-nodes-prereqs-sg"></a>

クラスターを作成すると、Amazon EKS により `eks-cluster-sg-<cluster-name>-<uniqueID>` という名前のセキュリティグループが作成されます。このクラスターセキュリティグループのインバウンドルールは変更できませんが、アウトバウンドルールは制限できます。クラスターに追加のセキュリティグループを追加して、kubelet と、オプションでハイブリッドノードで実行されているウェブフックが Amazon EKS コントロールプレーンに接続できるようにする必要があります。この追加のセキュリティグループに必要なインバウンドルールを以下に示します。`REMOTE_NODE_CIDR` と `REMOTE_POD_CIDR` をオンプレミスのネットワークの値に置き換えます。


| 名前 | セキュリティグループのルール ID | IP バージョン | タイプ | プロトコル | ポート範囲 | ソース | 
| --- | --- | --- | --- | --- | --- | --- | 
|  オンプレミスノードのインバウンド  |  sgr-abcdef123456  |  IPv4  |  HTTPS  |  TCP  |  443  |  REMOTE\$1NODE\$1CIDR  | 
|  オンプレミスポッドのインバウンド  |  sgr-abcdef654321  |  IPv4  |  HTTPS  |  TCP  |  443  |  REMOTE\$1POD\$1CIDR  | 

## インフラストラクチャ
<a name="hybrid-nodes-prereqs-infra"></a>

ハイブリッドノードとして使用するには、ベアメタルサーバーまたは仮想マシンが必要です。ハイブリッドノードは基盤となるインフラストラクチャに依存せず、x86 および ARM アーキテクチャに対応しています。Amazon EKS Hybrid Nodes は「独自のインフラストラクチャを導入する」アプローチに従います。ここでは、ハイブリッドノードに使用するベアメタルサーバーまたは仮想マシンのプロビジョニングと管理はお客様の責任となります。厳格な最小リソースの要件はありませんが、ハイブリッドノードには少なくとも 1 vCPU および 1GiB RAM のホストを使用することが推奨されます。

## オペレーティングシステム
<a name="hybrid-nodes-prereqs-os"></a>

Bottlerocket、Amazon Linux 2023 (AL2023)、Ubuntu、RHEL は、ハイブリッドノードのノードオペレーティングシステムとして使用されるために継続的に検証されます。Bottlerocket は、VMware vSphere 環境でのみ AWS でサポートされています。AL2023 は、Amazon EC2 の外部で実行される場合、AWS サポートプランの対象外です。AL2023 はオンプレミスの仮想化環境でのみ使用できます。詳細については、「[Amazon Linux 2023 ユーザーガイド](https://docs.aws.amazon.com/linux/al2023/ug/outside-ec2.html)」を参照してください。AWS は Ubuntu および RHEL オペレーティングシステムとのハイブリッドノード統合をサポートしていますが、オペレーティングシステム自体はサポートしていません。

オペレーティングシステムのプロビジョニングと管理はお客様の責任となります。ハイブリッドノードを初めてテストする場合、プロビジョニング済みのホストで Amazon EKS Hybrid Nodes CLI (`nodeadm`) を実行するのが最も簡単です。本稼働のデプロイでは、ホスト起動時にホストを Amazon EKS クラスターに自動的に参加させる systemd サービスとして実行されるように設定された `nodeadm` を、オペレーティングシステムのゴールデンイメージに含めることが推奨されます。

## オンプレミスの IAM 認証情報プロバイダー
<a name="hybrid-nodes-prereqs-iam"></a>

Amazon EKS Hybrid Nodes は、AWS SSM ハイブリッドアクティベーションまたは AWS IAM Roles Anywhere によってプロビジョニングされた一時的な IAM 認証情報を使用して、Amazon EKS クラスターで認証します。Amazon EKS Hybrid Nodes CLI (`nodeadm`) を用いて、AWS SSM ハイブリッドアクティベーションまたは AWS IAM Roles Anywhere を使用する必要があります。認証局 (CA) およびオンプレミス環境の証明書を持つ既存の公開鍵基盤 (PKI) がない場合、AWS SSM ハイブリッドアクティベーションを使用することをお勧めします。既存の PKI と証明書がオンプレミスにある場合は、AWS IAM Roles Anywhere を使用します。

Amazon EC2 で実行されているノードの [Amazon EKS ノードの IAM ロール](create-node-role.md) と同様に、ハイブリッドノードを Amazon EKS クラスターに結合するために必要なアクセス許可を持つハイブリッドノード IAM ロールを作成します。AWS IAM Roles Anywhere を使用している場合は、AWS IAM Roles Anywhere が Hybrid Nodes IAM Role を引き受けることを許可する信頼ポリシーを設定し、ハイブリッドノード IAM ロールを引き受け可能なロールとして AWS IAM Roles Anywhere プロファイルを設定します。AWS SSM を使用している場合は、AWS SSM がハイブリッドノード IAM ロールを引き受け、ハイブリッドノード IAM ロールを使用してハイブリッドアクティベーションを作成できるようにする信頼ポリシーを設定します。必要なアクセス許可を持つハイブリッドノード IAM ロールを作成する方法については、「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。

# ハイブリッドノード用のネットワークを準備する
<a name="hybrid-nodes-networking"></a>

このトピックでは、Amazon EKS クラスターを作成してハイブリッドノードをアタッチする前に設定する必要があるネットワーク設定の概要を説明します。このガイドでは、[AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/SetUpVPNConnections.html)、[AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)、または独自の VPN ソリューションを使用したハイブリッドネットワーク接続の前提条件の要件を満たしていることを前提としています。

![\[ハイブリッドノードのネットワーク接続。\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-prereq-diagram.png)


## オンプレミスネットワーク設定
<a name="hybrid-nodes-networking-on-prem"></a>

### 最小ネットワーク要件
<a name="hybrid-nodes-networking-min-reqs"></a>

最適なエクスペリエンスを実現するには、ハイブリッドノードから AWS リージョンへの接続には、100 Mbps 以上の通信速度と 200 ミリ秒以下のラウンドトリップレイテンシーを持つ、信頼性の高いネットワーク接続が推奨されます。これはほとんどのユースケースに対応する一般的なガイダンスですが、厳格な要件ではありません。帯域幅とレイテンシーの要件は、アプリケーションのイメージサイズ、アプリケーションの伸縮性、モニタリングとログ記録の設定、他の AWS サービスに保存されているデータへのアクセスに関するアプリケーションの依存関係など、ハイブリッドノードの数とワークロードの特性によって異なります。本番環境にデプロイする前に、独自のアプリケーションと環境でテストして、ネットワーク設定がワークロードの要件を満たしているか確認することをお勧めします。

### オンプレミスノードとポッド CIDR
<a name="hybrid-nodes-networking-on-prem-cidrs"></a>

ハイブリッドノードに使用するノードとポッドの CIDR と、それらで実行されているワークロードを特定します。CNI にオーバーレイネットワークを使用している場合、ノード CIDR はオンプレミスネットワークから割り当てられ、ポッド CIDR は Container Network Interface (CNI) から割り当てられます。`RemoteNodeNetwork` および `RemotePodNetwork` フィールドで EKS クラスターを作成する際、オンプレミスノード CIDR およびポッド CIDR を入力として渡します。オンプレミスノード CIDR は、オンプレミスネットワークでルーティング可能である必要があります。オンプレミスポッド CIDR のルーティング可能性の詳細については、次のセクションを参照してください。

オンプレミスノードとポッド CIDR ブロックは、以下の要件を満たしている必要があります。

1. `IPv4` RFC-1918 のいずれかの範囲内にある (`10.0.0.0/8`、`172.16.0.0/12`、または `192.168.0.0/16`) か、RFC 6598 で定義される CGNAT 範囲内にある (`100.64.0.0/10`) こと。

1. EKS クラスターの VPC CIDR や Kubernetes サービスの `IPv4` CIDR と相互に重複しないこと。

### オンプレミスポッドのネットワークルーティング
<a name="hybrid-nodes-networking-on-prem-pod-routing"></a>

EKS Hybrid Node を使用する際、クラウド環境とオンプレミス環境間で完全なクラスター通信および機能を有効にするため、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にすることが一般的に推奨されています。

 **ルーティング可能なポッドネットワーク** 

オンプレミスネットワークでポッドネットワークをルーティング可能にできる場合、以下のガイダンスに従ってください。

1. オンプレミスポッド CIDR で EKS クラスターの `RemotePodNetwork` フィールドを設定し、オンプレミスポッド CIDR で VPC ルートテーブルを設定し、オンプレミスポッド CIDR で EKS クラスターセキュリティグループを設定します。

1. オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にするために使用できる手法がいくつかあります。具体的には、ボーダーゲートウェイプロトコル (BGP)、静的ルート、その他のカスタムルーティングソリューションなどです。BGP はカスタムまたは手動でルート設定する必要がある代替ソリューションよりもスケーラブルで管理しやすいため、推奨されるソリューションです。AWS は、ポッド CIDR をアドバタイズするための Cilium と Calico の BGP 機能をサポートしています。詳細については、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」および「[ルーティング可能なリモートポッド CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)」を参照してください。

1. EKS コントロールプレーンはウェブフックに割り当てられたポッド IP アドレスと通信できるため、ウェブフックはハイブリッドノードで実行できます。

1. クラウドノードで実行されているワークロードは、同じ EKS クラスター内のハイブリッドノードで実行されているワークロードと直接通信することができます。

1. 他の AWS サービス (AWS Application Load Balancer や Amazon Managed Service for Prometheus など) はハイブリッドノードで実行されているワークロードと通信し、ネットワークトラフィックのバランスを取ってポッドメトリクスをスクレイピングすることができます。

 **ルーティング不可能なポッドネットワーク** 

オンプレミスネットワークでポッドネットワークをルーティング*できない*場合、以下のガイダンスに従ってください。

1. ウェブフックは EKS コントロールプレーンからウェブフックに割り当てられたポッド IP アドレスへの接続が必要なため、ウェブフックはハイブリッドノードで実行することはできません。この場合、ハイブリッドノードと同じ EKS クラスター内のクラウドノードでウェブフックを実行することが推奨されます。詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」を参照してください。

1. クラウドノードで実行されているワークロードは、クラウドノードに VPC CNI を使用する際、またはハイブリッドノードに Cilium または Calico を使用する際、ハイブリッドノードで実行されているワークロードと直接通信することはできません。

1. サービストラフィック分散を使用し、トラフィックを発信元のゾーン内に留めます。サービストラフィック分散の詳細については、「[サービストラフィック分散の設定](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution)」を参照してください。

1. ポッドトラフィックがオンプレミスホストから出る際、出力マスカレードまたはネットワークアドレス変換 (NAT) を使用するように CNI を設定します。Cilium ではデフォルトで有効になっています。Calico では `natOutgoing` を `true` に設定する必要があります。

1. AWS Application Load Balancer や Amazon Managed Service for Prometheus などの他の AWS サービスは、ハイブリッドノードで実行されているワークロードと通信できません。

### ハイブリッドノードのインストールとアップグレードに必要なアクセス
<a name="hybrid-nodes-networking-access-reqs"></a>

ホストにハイブリッドノードの依存関係をインストールするインストールプロセス中は、以下のドメインにアクセスできる必要があります。このプロセスは、オペレーティングシステムイメージを構築するときに 1 回実行することも、ランタイム時に各ホストで実行することもできます。これには、初期インストールと、ハイブリッドノードの Kubernetes バージョンをアップグレードするときが含まれます。

パッケージの中には、OS のデフォルトパッケージマネージャーを使用してインストールされるものがあります。AL2023 および RHEL の場合、`yum` コマンドを使用して `containerd`、`ca-certificates`、`iptables`、`amazon-ssm-agent` をインストールします。Ubuntu の場合、`apt` を使用して `containerd`、`ca-certificates`、`iptables` をインストールし、`snap` を使用して `amazon-ssm-agent` をインストールします。


| コンポーネント | [URL] | プロトコル | ポート | 
| --- | --- | --- | --- | 
|  EKS ノードアーティファクト (S3)  |  https://hybrid-assets.eks.amazonaws.com  |  HTTPS  |  443  | 
|   [VPC サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |  https://eks.*region*.amazonaws.com  |  HTTPS  |  443  | 
|   [ECR サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/ecr.html)   |  https://api.ecr.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  EKS ECR エンドポイント  |  リージョンのエンドポイントについては、「[Amazon EKS アドオンの Amazon コンテナイメージレジストリを表示する](add-ons-images.md)」を参照してください。  |  HTTPS  |  443  | 
|  SSM バイナリエンドポイント 1   |  https://amazon-ssm-*region*.s3.*region*.amazonaws.com  |  HTTPS  |  443  | 
|   [SSM サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/ssm.html) 1   |  https://ssm.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  IAM Anywhere バイナリエンドポイント 2   |  https://rolesanywhere.amazonaws.com  |  HTTPS  |  443  | 
|   [IAM Anywhere サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/rolesanywhere.html) 2   |  https://rolesanywhere.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  オペレーティングシステムパッケージマネージャーのエンドポイント  |  パッケージリポジトリのエンドポイントは OS に固有であり、地理的リージョンによって異なる場合があります。  |  HTTPS  |  443  | 

**注記**  
 1 AWS SSM エンドポイントへのアクセスは、オンプレミスの IAM 認証情報プロバイダーに AWS SSM ハイブリッドアクティベーションを使用している場合のみ必要です。  
 2 AWS IAM エンドポイントへのアクセスは、オンプレミスの IAM 認証情報プロバイダーに AWS IAM Roles Anywhere を使用している場合のみ必要です。

### 継続的なクラスター運用に必要なアクセス
<a name="hybrid-nodes-networking-access-reqs-ongoing"></a>

クラスターの継続的な運用には、オンプレミスのファイアウォールに以下のネットワークアクセスが必要です。

**重要**  
CNI の選択に応じて、CNI ポートに追加のネットワークアクセスルールを設定する必要があります。詳細については、「[Cilium のドキュメント](https://docs.cilium.io/en/stable/operations/system_requirements/#firewall-rules)」および「[Calico のドキュメント](https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements#network-requirements)」を参照してください。


| タイプ | プロトコル | 方向 | ポート | 送信元 | 目的地 | 使用方法 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  HTTPS  |  TCP  |  アウトバウンド  |  443  |  リモートノード CIDR  |  EKS クラスター IP 1   |  Kubelet から Kubernetes API サーバーへ  | 
|  HTTPS  |  TCP  |  アウトバウンド  |  443  |  リモートポッド CIDR  |  EKS クラスター IP 1   |  Pod から Kubernetes API サーバーへ  | 
|  HTTPS  |  TCP  |  アウトバウンド  |  443  |  リモートノード CIDR  |   [SSM サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/ssm.html)   |  SSM ハイブリッドアクティベーション認証情報の更新と 5 分ごとの SSM ハートビート  | 
|  HTTPS  |  TCP  |  アウトバウンド  |  443  |  リモートノード CIDR  |   [IAM Anywhere サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/rolesanywhere.html)   |  IAM Roles Anywhere 認証情報の更新  | 
|  HTTPS  |  TCP  |  アウトバウンド  |  443  |  リモートポッド CIDR  |   [STS リージョナルエンドポイント](https://docs.aws.amazon.com/general/latest/gr/sts.html)   |  Pod から STS エンドポイントへ、IRSA のみ必要  | 
|  HTTPS  |  TCP  |  アウトバウンド  |  443  |  リモートノード CIDR  |   [Amazon EKS Auth サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |  Amazon EKS Pod Identity のみに必要な Amazon EKS 認証エンドポイントへのノード  | 
|  HTTPS  |  TCP  |  インバウンド  |  10250  |  EKS クラスター IP 1   |  リモートノード CIDR  |  Kubernetes API サーバーから kubelet へ  | 
|  HTTPS  |  TCP  |  インバウンド  |  ウェブフックポート  |  EKS クラスター IP 1   |  リモートポッド CIDR  |  Kubernetes API サーバーからウェブフックへ  | 
|  HTTPS  |  TCP、UDP  |  インバウンド、アウトバウンド  |  53  |  リモートポッド CIDR  |  リモートポッド CIDR  |  Pod から CoreDNS へ。クラウドで CoreDNS のレプリカを少なくとも 1 つ実行する場合は、CoreDNS が実行されている VPC への DNS トラフィックを許可する必要があります。  | 
|  ユーザー定義  |  ユーザー定義  |  インバウンド、アウトバウンド  |  アプリポート  |  リモートポッド CIDR  |  リモートポッド CIDR  |  Pod から Pod へ  | 

**注記**  
 1 EKS クラスターの IP。Amazon EKS Elastic Network Interface については、次のセクションを参照してください。

### Amazon EKS ネットワークインターフェイス
<a name="hybrid-nodes-networking-eks-network-interfaces"></a>

Amazon EKS は、クラスターの作成時に渡す VPC 内のサブネットにネットワークインターフェイスをアタッチして、EKS コントロールプレーンと VPC 間の通信を有効にします。Amazon EKS が作成するネットワークインターフェイスは、クラスターの作成後に、Amazon EC2 コンソールまたは AWS CLI で確認できます。Kubernetes バージョンのアップグレードなど、EKS クラスターに変更が適用されると、元のネットワークインターフェイスが削除され、新しいネットワークインターフェイスが作成されます。クラスターの作成時に渡すサブネットに制約付きサブネットサイズを使用することで、Amazon EKS ネットワークインターフェイスの IP 範囲を制限できます。これにより、この既知の制約付き IP セットへのインバウンド/アウトバウンド接続を許可するようにオンプレミスファイアウォールを設定することが容易になります。ネットワークインターフェイスが作成されるサブネットを制御するためには、クラスター作成時に指定するサブネットの数を制限するか、クラスター作成後にサブネットを更新することができます。

Amazon EKS によってプロビジョニングされるネットワークインターフェイスには、`Amazon EKS your-cluster-name ` の形式の説明が付けられています。Amazon EKS がプロビジョニングするネットワークインターフェイスの IP アドレスを見つけるために使用できる AWS CLI コマンドについては、以下の例を参照してください。`VPC_ID` を、クラスターの作成時に渡す VPC の ID に置き換えます。

```
aws ec2 describe-network-interfaces \
--query 'NetworkInterfaces[?(VpcId == VPC_ID && contains(Description,Amazon EKS))].PrivateIpAddress'
```

## AWS VPC とサブネットの設定
<a name="hybrid-nodes-networking-vpc"></a>

ハイブリッドノードを持つクラスターには、Amazon EKS の既存の [VPC とサブネットの要件](network-reqs.md)が適用されます。さらに、VPC CIDR はオンプレミスノードおよびポッド CIDR と重複することはできません。オンプレミスノードの VPC ルートテーブルにルートを設定し、オプションでポッド CIDR を設定する必要があります。これらのルートは、ハイブリッドネットワーク接続に使用しているゲートウェイにトラフィックをルーティングするように設定する必要があります。通常、これは仮想プライベートゲートウェイ (VGW) またはトランジットゲートウェイ (TGW) です。TGW または VGW を使用して VPC をオンプレミス環境に接続する場合は、VPC の TGW または VGW アタッチメントを作成する必要があります。VPC は、DNS ホスト名と DNS 解決がサポートされている必要があります。

AWS CLI を使用する手順は以下のとおりです。これらのリソースは AWS マネジメントコンソール で、または AWS CloudFormation、AWS CDK、Terraform などの他のインターフェイスでも作成することができます。

### ステップ 1: VPC を作成する
<a name="_step_1_create_vpc"></a>

1. 次のコマンドを実行して VPC を作成します。VPC\$1CIDR を、RFC 1918 (プライベート)、CGNAT (RFC 6598)、または非 RFC 1918/非 CGNAT (パブリック) のいずれかの IPv4 CIDR 範囲に置き換えます (例えば、10.0.0.0/16 など)。注: EKS の要件である DNS 解決は、VPC に対しデフォルトで有効になっています。

   ```
   aws ec2 create-vpc --cidr-block VPC_CIDR
   ```

1. VPC の DNS ホスト名を有効にします。DNS 解決は、VPC に対しデフォルトで有効になっています。`VPC_ID` を、前のステップで作成した VPC の ID に置き換えます。

   ```
   aws ec2 modify-vpc-attribute --vpc-id VPC_ID --enable-dns-hostnames
   ```

### ステップ 2: サブネットを作成する
<a name="_step_2_create_subnets"></a>

少なくとも 2 つのサブネットを作成します。Amazon EKS は、これらのサブネットをクラスターのネットワークインターフェイスに使用します。詳細については、「[サブネットの要件と考慮事項](network-reqs.md#network-requirements-subnets)」を参照してください。

1. AWS リージョンのアベイラビリティーゾーンは、以下のコマンドで確認できます。`us-west-2` を実際のリージョンに置き換えます。

   ```
   aws ec2 describe-availability-zones \
        --query 'AvailabilityZones[?(RegionName == us-west-2)].ZoneName'
   ```

1. サブネットを作成します。`VPC_ID` を VPC の ID に置き換えます。`SUBNET_CIDR` を、サブネットの CIDR ブロック (10.0.1.0/24 など) に置き換えます。`AZ` を、サブネットが作成されるアベイラビリティーゾーン (us-west-2a など) に置き換えます。作成するサブネットは、少なくとも 2 つの異なるアベイラビリティーゾーンに存在している必要があります。

   ```
   aws ec2 create-subnet \
       --vpc-id VPC_ID \
       --cidr-block SUBNET_CIDR \
       --availability-zone AZ
   ```

### (オプション) ステップ 3: Amazon VPC Transit Gateway (TGW) または AWS Direct Connect 仮想プライベートゲートウェイ (VGW) を使用して VPC をアタッチする
<a name="optional_step_3_attach_vpc_with_amazon_vpc_transit_gateway_tgw_or_shared_aws_direct_connect_virtual_private_gateway_vgw"></a>

TGW または VGW を使用している場合は、VPC を TGW または VGW にアタッチします。詳細については、「[Amazon VPC attachments in Amazon VPC Transit Gateways](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html)」または「[AWS Direct Connect virtual private gateway associations](https://docs.aws.amazon.com/vpn/latest/s2svpn/how_it_works.html#VPNGateway)」を参照してください。

 **Transit Gateway** 

以下のコマンドを実行して、トランジットゲートウェイをアタッチします。`VPC_ID` を VPC の ID に置き換えます。`SUBNET_ID1` と `SUBNET_ID2` を、前のステップで作成したサブネットの ID に置き換えます。`TGW_ID` を TGW の ID に置き換えます。

```
aws ec2 create-transit-gateway-vpc-attachment \
    --vpc-id VPC_ID \
    --subnet-ids SUBNET_ID1 SUBNET_ID2 \
    --transit-gateway-id TGW_ID
```

 **仮想プライベートゲートウェイ** 

以下のコマンドを実行して、トランジットゲートウェイをアタッチします。`VPN_ID` をVGW の ID に置き換えます。`VPC_ID` を VPC の ID に置き換えます。

```
aws ec2 attach-vpn-gateway \
    --vpn-gateway-id VPN_ID \
    --vpc-id VPC_ID
```

### (オプション) ステップ 4: ルートテーブルを作成する
<a name="_optional_step_4_create_route_table"></a>

VPC のメインルートテーブルを変更するか、カスタムルートテーブルを作成できます。以下の手順では、オンプレミスノードとポッド CIDR へのルートを含むカスタムルートテーブルを作成します。詳細については、「[サブネットルートテーブル](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-route-tables.html)」を参照してください。`VPC_ID` を VPC の ID に置き換えます。

```
aws ec2 create-route-table --vpc-id VPC_ID
```

### ステップ 5: オンプレミスノードとポッドのルートを作成する
<a name="_step_5_create_routes_for_on_premises_nodes_and_pods"></a>

オンプレミスの各リモートノードのルートテーブルにルートを作成します。VPC のメインルートテーブルを変更するか、前のステップで作成したカスタムルートテーブルを使用できます。

以下の例は、オンプレミスノードとポッド CIDR のルートを作成する方法を示します。この例では、トランジットゲートウェイ (TGW) を使用して VPC をオンプレミス環境に接続します。複数のオンプレミスノードとポッド CIDR がある場合は、CIDR ごとにステップを繰り返します。
+ インターネットゲートウェイまたは仮想プライベートゲートウェイ (VGW) を使用している場合は、`--transit-gateway-id` を `--gateway-id` に置き換えます。
+ `RT_ID` を、前のステップで作成したルートテーブルの ID に置き換えます。
+ `REMOTE_NODE_CIDR` を、ハイブリッドノードに使用する CIDR 範囲に置き換えます。
+ `REMOTE_POD_CIDR` を、ハイブリッドノードで稼働しているポッドに使用する CIDR 範囲に置き換えます。ポッド CIDR 範囲は、オンプレミスのオーバーレイネットワークを最も一般的に使用するコンテナネットワークインターフェイス (CNI) 設定に対応しています。詳細については、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」を参照してください。
+ `TGW_ID` を TGW の ID に置き換えます。

 **リモートノードネットワーク** 

```
aws ec2 create-route \
    --route-table-id RT_ID \
    --destination-cidr-block REMOTE_NODE_CIDR \
    --transit-gateway-id TGW_ID
```

 **リモートポッドネットワーク** 

```
aws ec2 create-route \
    --route-table-id RT_ID \
    --destination-cidr-block REMOTE_POD_CIDR \
    --transit-gateway-id TGW_ID
```

### (オプション) ステップ 6: サブネットをルートテーブルに関連付ける
<a name="_optional_step_6_associate_subnets_with_route_table"></a>

前のステップでカスタムルートテーブルを作成した場合は、前のステップで作成した各サブネットをカスタムルートテーブルに関連付けます。VPC メインルートテーブルを変更する場合、サブネットは VPC のメインルートテーブルに自動的に関連付けられるため、このステップをスキップできます。

前のステップで作成したサブネットごとに、以下のコマンドを実行します。`RT_ID` を、前のステップで作成したルートテーブルに置き換えます。`SUBNET_ID` をサブネットの ID に置き換えます。

```
aws ec2 associate-route-table --route-table-id RT_ID --subnet-id SUBNET_ID
```

## クラスターセキュリティグループの設定
<a name="hybrid-nodes-networking-cluster-sg"></a>

クラスターの継続的な運用には、EKS クラスターセキュリティグループの以下のアクセスが必要です。Amazon EKS は、リモートノードとポッドネットワークが設定されたクラスターを作成または更新するときに、ハイブリッドノードに必要な**インバウンド**セキュリティグループルールを自動的に作成します。セキュリティグループがデフォルトですべての**アウトバウンド**トラフィックを許可するため、Amazon EKS はハイブリッドノードのクラスターセキュリティグループの**アウトバウンド**ルールを自動的には変更しません。クラスターセキュリティグループをカスタマイズする場合は、以下の表に示したルールにトラフィックを制限できます。


| タイプ | プロトコル | 方向 | ポート | 送信元 | 目的地 | 使用方法 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  HTTPS  |  TCP  |  インバウンド  |  443  |  リモートノード CIDR  |  該当なし  |  Kubelet から Kubernetes API サーバーへ  | 
|  HTTPS  |  TCP  |  インバウンド  |  443  |  リモートポッド CIDR  |  該当なし  |  CNI がポッドトラフィックに NAT を使用していない場合で、ポッドが K8s API サーバーへのアクセスを必要とする場合。  | 
|  HTTPS  |  TCP  |  アウトバウンド  |  10250  |  該当なし  |  リモートノード CIDR  |  Kubernetes API サーバーから Kubelet へ  | 
|  HTTPS  |  TCP  |  アウトバウンド  |  ウェブフックポート  |  該当なし  |  リモートポッド CIDR  |  Kubernetes API サーバーからウェブフックへ (ハイブリッドノードでウェブフックを実行している場合)  | 

**重要**  
 **セキュリティグループルールの制限**: Amazon EC2 セキュリティグループに保持できるインバウンドルールはデフォルトで最大 60 個です。クラスターセキュリティグループがこの制限に近づいた場合、セキュリティグループのインバウンドルールが適用されないことがあります。この場合、欠落しているインバウンドルールを手動で追加しなければならないことがあります。  
 **CIDR クリーンアップの責任**: EKS クラスターからリモートノードまたはポッドネットワークを削除した場合、EKS は対応するセキュリティグループルールを自動的に削除しません。セキュリティグループルールから未使用のリモートノードまたはポッドネットワークを手動で削除する責任はお客様にあります。

Amazon EKS が作成するクラスターセキュリティグループの詳細については「[クラスターの Amazon EKS セキュリティグループ要件を表示する](sec-group-reqs.md)」を参照してください。

### (オプション) セキュリティグループの手動設定
<a name="_optional_manual_security_group_configuration"></a>

追加のセキュリティグループを作成したり、自動的に作成されたルールを変更したりする必要がある場合は、次のコマンドを参照として使用できます。デフォルトでは、以下のコマンドは、すべてのアウトバウンドアクセスを許可するセキュリティグループを作成します。アウトバウンドアクセスを上記のルールのみに制限することができます。アウトバウンドルールの制限を検討している場合、変更したルールを本番稼働用のクラスターに適用する前に、すべてのアプリケーションとポッドの接続を徹底的にテストすることをお勧めします。
+ 最初のコマンドで、`SG_NAME` をセキュリティグループの名前に置き換えます
+ 最初のコマンドで、`VPC_ID` を前のステップで作成した VPC の ID に置き換えます
+ 2 番目のコマンドで、`SG_ID` を最初のコマンドで作成したセキュリティグループの ID に置き換えます
+ 2 番目のコマンドで、`REMOTE_NODE_CIDR` と `REMOTE_POD_CIDR` をハイブリッドノードとオンプレミスネットワークの値にそれぞれ置き換えます。

```
aws ec2 create-security-group \
    --group-name SG_NAME \
    --description "security group for hybrid nodes" \
    --vpc-id VPC_ID
```

```
aws ec2 authorize-security-group-ingress \
    --group-id SG_ID \
    --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "IpRanges": [{"CidrIp": "REMOTE_NODE_CIDR"}, {"CidrIp": "REMOTE_POD_CIDR"}]}]'
```

# ハイブリッドノード用のオペレーティングシステムを準備する
<a name="hybrid-nodes-os"></a>

Bottlerocket、Amazon Linux 2023 (AL2023)、Ubuntu、RHEL は、ハイブリッドノードのノードオペレーティングシステムとして使用されるために継続的に検証されます。Bottlerocket は、VMware vSphere 環境でのみ AWS でサポートされています。AL2023 は、Amazon EC2 の外部で実行される場合、AWS サポートプランの対象外です。AL2023 はオンプレミスの仮想化環境でのみ使用できます。詳細については、「[Amazon Linux 2023 ユーザーガイド](https://docs.aws.amazon.com/linux/al2023/ug/outside-ec2.html)」を参照してください。AWS は Ubuntu および RHEL オペレーティングシステムとのハイブリッドノード統合をサポートしていますが、オペレーティングシステム自体はサポートしていません。

オペレーティングシステムのプロビジョニングと管理はお客様の責任となります。ハイブリッドノードを初めてテストする場合、プロビジョニング済みのホストで Amazon EKS Hybrid Nodes CLI (`nodeadm`) を実行するのが最も簡単です。本稼働デプロイでは、ホスト起動時にホストを Amazon EKS クラスターに自動的に結合する systemd サービスとして実行するように設定された `nodeadm` を、オペレーティングシステムイメージに含めることが推奨されます。Bottlerocket を vSphere のノードオペレーティングシステムとして使用している場合は `nodeadm` を使用する必要はありません。Bottlerocket にはハイブリッドノードに必要な依存関係が既に含まれ、ホストのスタートアップ時に設定するクラスターに自動的に接続されるからです。

## バージョン互換性
<a name="_version_compatibility"></a>

以下の表は、ハイブリッドノードのノードオペレーティングシステムとしての使用に互換性があり、検証済みとなっているオペレーティングシステムのバージョンを示しています。オペレーティングシステムのこの表に記載されていないバリアントやバージョンを使用している場合、そのオペレーティングシステムのバリアントまたはバージョンとのハイブリッドノードの互換性は、AWS サポートの対象外となります。ハイブリッドノードは基盤となるインフラストラクチャに依存せず、x86 および ARM アーキテクチャに対応しています。


| オペレーティングシステム | バージョン | 
| --- | --- | 
|  Amazon Linux  |  Amazon Linux 2023 (AL2023)  | 
|  Bottlerocket  |  v1.37.0 以降、Kubernetes v1.28 以降を実行している VMware のバリアント  | 
|  Ubuntu  |  Ubuntu 20.04、Ubuntu 22.04、Ubuntu 24.04  | 
|  Red Hat Enterprise Linux  |  RHEL 8、RHEL 9  | 

## オペレーティングシステムに関する考慮事項
<a name="_operating_system_considerations"></a>

### General
<a name="_general"></a>
+ Amazon EKS Hybrid Nodes CLI (`nodeadm`) を使用すると、ハイブリッドノードのコンポーネントおよび依存関係のインストールと設定を簡素化できます。`nodeadm install` プロセスは、オペレーティングシステムイメージのビルドパイプライン中、または各オンプレミスホストの実行時に実行できます。`nodeadm` がインストールするコンポーネントの詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。
+ オンプレミス環境でプロキシを使用してインターネットにアクセスしている場合、インストールおよびアップグレードのプロセスでパッケージマネージャーがプロキシを使用するよう設定するために、追加のオペレーティングシステム設定が必要です。手順については「[ハイブリッドノードのプロキシを設定する](hybrid-nodes-proxy.md)」を参照してください。

### Bottlerocket
<a name="_bottlerocket"></a>
+ Bottlerocket ノードを接続するときのステップとツールは他のオペレーティングシステムのステップとは異なるため、「[ハイブリッドノードを接続する](hybrid-nodes-join.md)」の手順ではなく「[Bottlerocket を実行しているハイブリッドノードの接続](hybrid-nodes-bottlerocket.md)」に記載しています。
+ Bottlerocket のステップでは、ハイブリッドノード CLI のツールである `nodeadm` は使用しません。
+ EKS Hybrid Nodes でサポートされているのは、Bottlerocket のバージョンが v1.37.0 以降である VMware のバリアントのみです。Bottlerocket の VMware のバリアントは、Kubernetes のバージョン v1.28 以降で使用できます。[その他の Bottlerocket のバリアント](https://bottlerocket.dev/en/os/1.36.x/concepts/variants)は、ハイブリッドノードのオペレーティングシステムとしてサポートされていません。注: Bottlerocket の VMware のバリアントを使用できるのは、x86\$164 のアーキテクチャのみです。

### Containerd
<a name="_containerd"></a>
+ Containerd は標準の Kubernetes コンテナランタイムであり、ハイブリッドノードのみならず、あらゆるコンピューティングタイプの Amazon EKS ノードの依存関係の 1 つです。Amazon EKS Hybrid Nodes CLI (`nodeadm`) は、`nodeadm install` プロセス中に containerd のインストールを試みます。`--containerd-source` コマンドラインオプションを使用して、`nodeadm install` の実行時に containerd のインストールを設定できます。有効なオプションは、`none`、`distro`、`docker` です。RHEL を使用している場合、`distro` は有効なオプションではなく、Docker のリポジトリから containerd ビルドをインストールするよう `nodeadm` を設定するか、containerd を手動でインストールできます。AL2023 または Ubuntu を使用する場合、`nodeadm` はオペレーティングシステムのディストリビューションから containerd をインストールするのがデフォルトになります。nodeadm で containerd をインストールしない場合は、`--containerd-source none` オプションを使用します。

### Ubuntu
<a name="_ubuntu"></a>
+ Ubuntu 24.04 を使用している場合、ポッドを適切に終了させるための修正を適用するために、containerd のバージョンを更新するか、AppArmor の設定を変更する必要がある場合があります。「[Ubuntu \$12065423](https://bugs.launchpad.net/ubuntu/+source/containerd-app/\+bug/2065423)」を参照してください。AppArmor プロファイルに変更を適用するには、再起動が必要です。Ubuntu 24.04 の最新バージョンには、修正が含まれた更新版の containerd バージョン (containerd バージョン 1.7.19 以降) がパッケージマネージャーに含まれています。

### ARM
<a name="_arm"></a>
+ ARM ハードウェアを使用している場合、EKS kube-proxy アドオンのバージョン 1.31 以降を実行するためには、Cryptography Extension (ARMv8.2\$1crypto) を搭載した ARMv8.2 準拠のプロセッサが必要です。Cortex-A72 ベースのプロセッサのほか、Raspberry Pi 5 より前のすべての Raspberry Pi システムもこの要件を満たしていません。回避策として、2026 年 7 月に延長サポートが終了するまで、EKS kube-proxy アドオンのバージョン 1.30 をこれまで通り使用できます。「[Kubernetes release calendar](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)」を参照するか、アップストリームからカスタム kube-proxy イメージを使用してください。
+ kube-proxy ログに以下のエラーメッセージが記録されていれば、この非互換性が生じていることになります。

```
Fatal glibc error: This version of Amazon Linux requires a newer ARM64 processor compliant with at least ARM architecture 8.2-a with Cryptographic extensions. On EC2 this is Graviton 2 or later.
```

## オペレーティングシステムイメージの構築
<a name="_building_operating_system_images"></a>

Amazon EKS は、`nodeadm` を含み、ホスト起動時に実行するように設定されたオペレーティングシステムイメージを作成するために使用できる [Packer テンプレートの例](https://github.com/aws/eks-hybrid/tree/main/example/packer)を提供しています。このプロセスは、各ホストでハイブリッドノードの依存関係を個別にプルすることを避け、ハイブリッドノードのブートストラッププロセスを自動化するために推奨されています。Packer テンプレートの例は、Ubuntu 22.04、Ubuntu 24.04、RHEL 8、または RHEL 9 ISO イメージで使用でき、イメージの出力は OVA、Qcow2、または raw の形式で行えます。

### 前提条件
<a name="_prerequisites"></a>

Packer テンプレートの例を使用する前に、Packer を実行しているマシンに以下がインストールされている必要があります。
+ Packer バージョン 1.11.0 以降。Packer のインストール手順については、「Packer documentation」の「[nstall Packer](https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli)」を参照してください。
+ OVA を構築する場合、VMware vSphere プラグイン 1.4.0 以降
+ `Qcow2` または raw イメージを構築する場合、QEMU プラグインバージョン 1.x

### 環境変数の設定
<a name="_set_environment_variables"></a>

Packer ビルドを実行する前に、Packer を実行しているマシンで次の環境変数を設定します。

 **General** 

いずれのオペレーティングシステムおよび出力形式においても、イメージを構築する際には、以下の環境変数を設定する必要があります。


| 環境変数 | タイプ | 説明 | 
| --- | --- | --- | 
|  PKR\$1SSH\$1PASSWORD  |  String  |  Packer は、プロビジョニング時に作成されたマシンに SSH 接続する際は、`ssh_username` および `ssh_password` 変数を使用します。これは、各 OS のキックスタートファイルまたは user-data ファイル内に初期ユーザーを作成する際に使用されるパスワードと一致する必要があります。デフォルトは、OS に応じて「builder」または「ubuntu」に設定されます。パスワードを設定する際は、必ず対応する `ks.cfg` または `user-data` ファイル内のパスワードも一致するように変更してください。  | 
|  ISO\$1URL  |  String  |  使用する ISO の URL。サーバーからダウンロードするウェブリンクでも、ローカルファイルへの絶対パスでもかまいません  | 
|  ISO\$1CHECKSUM  |  String  |  指定された ISO に関連するチェックサム。  | 
|  CREDENTIAL\$1PROVIDER  |  String  |  ハイブリッドノードの認証情報プロバイダー。有効な値は `ssm` (SSM ハイブリッドアクティベーション用、デフォルト) と `iam` (IAM Roles Anywhere 用) です  | 
|  K8S\$1VERSION  |  String  |  ハイブリッドノードの Kubernetes バージョン (`1.31` など)。サポートされている Kubernetes のバージョンについては、「[Amazon EKS supported versions](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)」を参照してください。  | 
|  NODEADM\$1ARCH  |  String  |  `nodeadm install` 用アーキテクチャ。`amd` または `arm` を選択します。  | 

 ** (RHEL**) 

RHEL を使用している場合は、以下の環境変数を設定する必要があります。


| 環境変数 | タイプ | 説明 | 
| --- | --- | --- | 
|  RH\$1USERNAME  |  String  |  RHEL サブスクリプションマネージャーのユーザー名  | 
|  RH\$1PASSWORD  |  String  |  RHEL サブスクリプションマネージャーのパスワード  | 
|  RHEL\$1VERSION  |  String  |  使用する RHEL の ISO のバージョン。有効な値は `8` または `9` です。  | 

 **Ubuntu** - 

Ubuntu 固有の環境変数は必要ありません。

 **vSphere** 

VMware vSphere OVA を構築する場合は、以下の環境変数を設定する必要があります。


| 環境変数 | タイプ | 説明 | 
| --- | --- | --- | 
|  VSPHERE\$1SERVER  |  String  |  vSphere のサーバーアドレス  | 
|  VSPHERE\$1USER  |  String  |  vSphere のユーザー名  | 
|  VSPHERE\$1PASSWORD  |  String  |  vSphere のパスワード  | 
|  VSPHERE\$1DATACENTER  |  String  |  vSphere のデータセンター名  | 
|  VSPHERE\$1CLUSTER  |  String  |  vSphere のクラスター名  | 
|  VSPHERE\$1DATASTORE  |  String  |  vSphere のデータストア名  | 
|  VSPHERE\$1NETWORK  |  String  |  vSphere のネットワーク名  | 
|  VSPHERE\$1OUTPUT\$1FOLDER  |  String  |  テンプレート用の vSphere の出力フォルダ  | 

 **QEMU** 


| 環境変数 | タイプ | 説明 | 
| --- | --- | --- | 
|  PACKER\$1OUTPUT\$1FORMAT  |  String  |  QEMU ビルダーの出力形式。有効な値は、`qcow2` および `raw` です。  | 

 **テンプレートを検証する** 

環境変数を設定した後は、ビルドを実行する前に以下のコマンドでテンプレートを検証します。テンプレートに異なる名前を使用している場合は、`template.pkr.hcl` を置き換えてください。

```
packer validate template.pkr.hcl
```

### イメージを構築する
<a name="_build_images"></a>

以下のコマンドを使用してイメージを構築し、`-only` フラグを使用してイメージのターゲットとオペレーティングシステムを指定します。テンプレートに異なる名前を使用している場合は、`template.pkr.hcl` を置き換えてください。

 **vSphere OVA** 

**注記**  
vSphere で RHEL を使用している場合は、キックスタートファイルを OEMDRV イメージに変換し、起動元の ISO として渡す必要があります。詳細については、EKS ハイブリッドノードの GitHub リポジトリにある「[Packer Readme](https://github.com/aws/eks-hybrid/tree/main/example/packer#utilizing-rhel-with-vsphere)」を参照してください。

 **Ubuntu 22.04 OVA** 

```
packer build -only=general-build.vsphere-iso.ubuntu22 template.pkr.hcl
```

 **Ubuntu 24.04 OVA** 

```
packer build -only=general-build.vsphere-iso.ubuntu24 template.pkr.hcl
```

 **RHEL 8 OVA** 

```
packer build -only=general-build.vsphere-iso.rhel8 template.pkr.hcl
```

 **RHEL 9 OVA** 

```
packer build -only=general-build.vsphere-iso.rhel9 template.pkr.hcl
```

 **QEMU** 

**注記**  
ビルダーのホストと一致しない特定のホストの CPU 用にイメージを構築する場合は、ホストの CPU に対応する名前を「[QEMU](https://www.qemu.org/docs/master/system/qemu-cpu-models.html)」のドキュメントで確認し、以下のコマンドを実行する際にホストの CPU 名を指定した `-cpu` フラグを使用します。

 **Ubuntu 22.04 Qcow2/Raw** 

```
packer build -only=general-build.qemu.ubuntu22 template.pkr.hcl
```

 **Ubuntu 24.04 Qcow2/Raw** 

```
packer build -only=general-build.qemu.ubuntu24 template.pkr.hcl
```

 **RHEL 8 Qcow2/Raw** 

```
packer build -only=general-build.qemu.rhel8 template.pkr.hcl
```

 **RHEL 9 Qcow2/Raw** 

```
packer build -only=general-build.qemu.rhel9 template.pkr.hcl
```

### nodeadm 設定を user-data を通して渡す
<a name="_pass_nodeadm_configuration_through_user_data"></a>

cloud-init を介して `nodeadm` の設定を user-data で渡すことで、ホストの起動時にハイブリッドノードを設定し、自動的に EKS クラスターに接続することができます。以下は、ハイブリッドノードのインフラストラクチャとして VMware vSphere を使用する場合の実装例です。

1. GitHub の [govc readme](https://github.com/vmware/govmomi/blob/main/govc/README.md) の手順に従って `govc` CLI をインストールします。

1. 前のセクションで Packer ビルドを実行してテンプレートをプロビジョニングした後は、以下を使用してテンプレートをクローンし、複数の異なるノードを作成することができます。ハイブリッドノードに使用する新規 VM を作成するたびに、テンプレートをクローンする必要があります。以下のコマンド内の変数は、お使いの環境に応じた値に置き換えます。以下のコマンドの `VM_NAME` は、`metadata.yaml` ファイルを介して VM の名前を注入する際に `NODE_NAME` として使用されます。

   ```
   govc vm.clone -vm "/PATH/TO/TEMPLATE" -ds="YOUR_DATASTORE" \
       -on=false -template=false -folder=/FOLDER/TO/SAVE/VM "VM_NAME"
   ```

1. 各新規 VM のテンプレートをクローンした後は、VM の `metadata.yaml` と `userdata.yaml` を作成します。VM は同じ `userdata.yaml` と `metadata.yaml` を共有でき、以下のステップで VM ごとにこれらを入力していきます。`nodeadm` の設定は、`userdata.yaml` の `write_files` セクションで作成および定義されます。以下の例では、ハイブリッドノードのオンプレミス認証情報プロバイダーとして AWS SSM ハイブリッドアクティベーションを使用しています。`nodeadm` 設定の詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

    **userdata.yaml:** 

   ```
   #cloud-config
   users:
     - name: # username for login. Use 'builder' for RHEL or 'ubuntu' for Ubuntu.
       passwd: # password to login. Default is 'builder' for RHEL.
       groups: [adm, cdrom, dip, plugdev, lxd, sudo]
       lock-passwd: false
       sudo: ALL=(ALL) NOPASSWD:ALL
       shell: /bin/bash
   
   write_files:
     - path: /usr/local/bin/nodeConfig.yaml
       permissions: '0644'
       content: |
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
             cluster:
                 name: # Cluster Name
                 region: # AWS region
             hybrid:
                 ssm:
                     activationCode: # Your ssm activation code
                     activationId: # Your ssm activation id
   
   runcmd:
     - /usr/local/bin/nodeadm init -c file:///usr/local/bin/nodeConfig.yaml >> /var/log/nodeadm-init.log 2>&1
   ```

    **metadata.yaml:** 

   お使いの環境に応じた `metadata.yaml` を作成します。`"$NODE_NAME"` 変数の形式は、後続のステップで値が入力されるため、ファイル内にそのまま保持してください。

   ```
   instance-id: "$NODE_NAME"
   local-hostname: "$NODE_NAME"
   network:
     version: 2
     ethernets:
       nics:
         match:
           name: ens*
         dhcp4: yes
   ```

1. 以下のコマンドを使用して、`userdata.yaml` および `metadata.yaml` ファイルを `gzip+base64` 文字列として追加します。以下のコマンドは、作成する VM ごとに実行する必要があります。`VM_NAME` は、更新する VM の名前に置き換えてください。

   ```
   export NODE_NAME="VM_NAME"
   export USER_DATA=$(gzip -c9 <userdata.yaml | base64)
   
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.userdata="${USER_DATA}"
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.userdata.encoding=gzip+base64
   
   envsubst '$NODE_NAME' < metadata.yaml > metadata.yaml.tmp
   export METADATA=$(gzip -c9 <metadata.yaml.tmp | base64)
   
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.metadata="${METADATA}"
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.metadata.encoding=gzip+base64
   ```

1. 新しい VM の電源をオンにします。これにより、設定した EKS クラスターに自動的に接続されます。

   ```
   govc vm.power -on "${NODE_NAME}"
   ```

# ハイブリッドノードの認証情報を準備する
<a name="hybrid-nodes-creds"></a>

Amazon EKS Hybrid Nodes は、AWS SSM ハイブリッドアクティベーションまたは AWS IAM Roles Anywhere によってプロビジョニングされた一時的な IAM 認証情報を使用して、Amazon EKS クラスターで認証します。Amazon EKS Hybrid Nodes CLI (`nodeadm`) を用いて、AWS SSM ハイブリッドアクティベーションまたは AWS IAM Roles Anywhere を使用する必要があります。AWS SSM ハイブリッドアクティベーションと AWS IAM Roles Anywhere の両方を使用しないでください。認証局 (CA) およびオンプレミス環境の証明書を持つ既存の公開鍵基盤 (PKI) がない場合、AWS SSM ハイブリッドアクティベーションを使用することをお勧めします。既存の PKI と証明書がオンプレミスにある場合は、AWS IAM Roles Anywhere を使用します。

## ハイブリッドノードの IAM ロール
<a name="hybrid-nodes-role"></a>

ハイブリッドノードを Amazon EKS クラスターに接続する前に、SSM ハイブリッドアクティベーションで使用する AWS IAM ロールまたはハイブリッドノードの認証情報用の AWS IAM Roles Anywhere を作成する必要があります。クラスターの作成後、Amazon EKS アクセスエントリまたは `aws-auth` ConfigMap エントリでこのロールを使用して、IAM ロールを Kubernetes ロールベースのアクセスコントロール (RBAC) にマッピングします。ハイブリッドノードの IAM ロールと Kubernetes RBAC の関連付けの詳細については、「[ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md)」を参照してください。

ハイブリッドノードの IAM ロールには、以下のアクセス許可が必要です。
+ ハイブリッドノードを接続するクラスターに関する情報を収集するための `eks:DescribeCluster` アクションを、`nodeadm` が使用するためのアクセス許可。`eks:DescribeCluster` アクションを有効にしない場合は、`nodeadm init` コマンドに渡すノード設定で、Kubernetes API エンドポイント、クラスター CA バンドル、およびサービス IPv4 CIDR を渡す必要があります。
+ ハイブリッドノードを接続するクラスターのアクセスエントリを一覧表示するための `eks:ListAccessEntries` アクションを、`nodeadm` が使用するためのアクセス許可。`eks:ListAccessEntries` アクションを有効にしない場合は、`nodeadm init` コマンドの実行時に `--skip cluster-access-validation` フラグを渡す必要があります。
+ kubelet が「[AmazonEC2ContainerRegistryPullOnly](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ContainerRegistryPullOnly.html)」 ポリシーで定義されているように、 Amazon Elastic Container Registry (Amazon ECR) のコンテナイメージを使用するためのアクセス許可。
+ AWS SSM を使用している場合、[https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSSMManagedInstanceCore.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSSMManagedInstanceCore.html) ポリシーで定義されている AWS SSM ハイブリッドアクティベーションを使用するための `nodeadm init` のアクセス許可。
+ AWS SSM を使用している場合、`nodeadm uninstall` がインスタンスを登録解除するために `ssm:DeregisterManagedInstance` アクションと `ssm:DescribeInstanceInformation` アクションを使用するためのアクセス許可。
+ (オプション) Amazon EKS Pod Identity エージェントが `eks-auth:AssumeRoleForPodIdentity` アクションを使用してポッドの認証情報を取得するためのアクセス許可。

## AWS SSM ハイブリッドアクティベーションのセットアップ
<a name="hybrid-nodes-ssm"></a>

AWS SSM ハイブリッドアクティベーションを設定する前に、ハイブリッドノードの IAM ロールを作成して設定する必要があります。詳細については、「[ハイブリッドノードの IAM ロールを作成する](#hybrid-nodes-create-role)」を参照してください。「AWS Systems Manager ユーザーガイド」の「[Systems Manager にハイブリッドノードを登録するためのハイブリッドアクティベーションの作成](https://docs.aws.amazon.com/systems-manager/latest/userguide/hybrid-activation-managed-nodes.html)」の指示に従って、ハイブリッドノード用の AWS SSM ハイブリッドアクティベーションを作成します。受け取ったアクティベーションコードと ID は、ホストを Amazon EKS クラスターのハイブリッドノードとして登録する際に、`nodeadm` で使用されます。ハイブリッドノード用の Amazon EKS クラスターを作成し準備した後は、このステップに戻ることができます。

**重要**  
アクティベーションの作成方法に応じて、Systems Manager はすぐにアクティベーションコードと ID をコンソールまたはコマンドウィンドウに返します。この情報をコピーして、安全な場所に保管します。コンソールから離れたり、コマンドウィンドウを閉じたりすると、この情報は失われる可能性があります。紛失した場合は、新しいアクティベーションを作成する必要があります。

デフォルトでは、AWS SSM ハイブリッドアクティベーションは 24 時間アクティブになります。または、ハイブリッドアクティベーションを作成する際に、`2024-08-01T00:00:00` のようなタイムスタンプ形式で `--expiration-date` を指定することもできます。認証情報プロバイダーとして AWS SSM を使用する場合、ハイブリッドノードのノード名は設定できず、AWS SSM によって自動生成されます。AWS SSM マネージドインスタンスは、Fleet Manager の AWS Systems Manager コンソールで表示および管理できます。追加コストなしで、アカウントにつき AWS リージョンごとに最大 1,000 のスタンダード[ハイブリッドアクティベーションノード](https://docs.aws.amazon.com/systems-manager/latest/userguide/activations.html)を登録できます。ただし、1,000 を超えるハイブリッドノードを登録するには、アドバンストインスタンス層のアクティブ化が必要です。これには、[Amazon EKS Hybrid Nodes の料金](https://aws.amazon.com/eks/pricing/)に含まれていない、アドバンストインスタンス層の利用料金が発生します。詳細については、「[AWS Systems Manager の料金](https://aws.amazon.com/systems-manager/pricing/)」を参照してください。

ハイブリッドノードの IAM ロールを使用して AWS SSM ハイブリッドアクティベーションを作成する方法については、以下の例を参照してください。ハイブリッドノードの認証情報に AWS SSM ハイブリッドアクティベーションを使用する場合、ハイブリッドノードの名前は `mi-012345678abcdefgh` 形式になり、AWS SSM によってプロビジョニングされた一時的な認証情報は 1 時間有効です。AWS SSM を認証情報プロバイダーとして使用する場合、ノード名または認証情報の期間を変更することはできません。一時的な認証情報は AWS SSM によって自動的にローテーションされ、ローテーションはノードやアプリケーションのステータスには影響しません。

ハイブリッドノードの IAM ロールの AWS SSM の `ssm:DeregisterManagedInstance` アクセス許可の範囲を、お使いの AWS SSM ハイブリッドアクティベーションに関連付けられたインスタンスしか登録解除できないよう制限するために、EKS クラスターごとに 1 つの AWS SSM ハイブリッドアクティベーションを使用することをお勧めします。このページの例では、EKS クラスター ARN を含むタグが使用され、AWS SSM ハイブリッドアクティベーションを EKS クラスターにマッピングするために使用できます。または、任意のタグと方法を使用して、アクセス許可の境界と要件に基づいて AWS SSM アクセス許可の範囲を絞り込むこともできます。以下のコマンドの `REGISTRATION_LIMIT` オプションは、AWS SSM ハイブリッドアクティベーションを使用できるマシンの数を制限するために使用される整数です (`10` など)。

```
aws ssm create-activation \
     --region AWS_REGION \
     --default-instance-name eks-hybrid-nodes \
     --description "Activation for EKS hybrid nodes" \
     --iam-role AmazonEKSHybridNodesRole \
     --tags Key=EKSClusterARN,Value=arn:aws:eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME \
     --registration-limit REGISTRATION_LIMIT
```

AWS SSM ハイブリッドアクティベーションで使用可能な構成設定の詳細については、「[ハイブリッドアクティベーションを作成して Systems Manager にノードを登録する](https://docs.aws.amazon.com/systems-manager/latest/userguide/hybrid-activation-managed-nodes.html)」の手順を確認してください。

## AWS IAM Roles Anywhere の設定
<a name="hybrid-nodes-iam-roles-anywhere"></a>

「IAM Roles Anywhere ユーザーガイド」の「[IAM Roles Anywhere の開始方法](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html)」の手順に従って、ハイブリッドノードの IAM ロールの一時的な IAM 認証情報に使用するトラストアンカーとプロファイルを設定します。プロファイルを作成する際は、ロールを追加せずにプロファイルを作成できます。プロファイルを作成してから、ハイブリッドノードの IAM ロールを作成するステップに戻り、作成したプロファイルにロールを追加することもできます。または、このページの後半にある AWS CloudFormation ステップを使用して、ハイブリッドノードの IAM Roles Anywhere セットアップを完了することもできます。

ハイブリッドノードの IAM ロールをプロファイルに追加するときは、AWS IAM Roles Anywhere コンソールの **[プロファイルの編集]** ページの下部にある **[カスタムロール]** セッション名パネルで **[カスタムロールセッション名を受け入れる]** を選択します。これは `CreateProfile` API の [acceptRoleSessionName](https://docs.aws.amazon.com/rolesanywhere/latest/APIReference/API_CreateProfile.html#rolesanywhere-CreateProfile-request-acceptRoleSessionName) フィールドに対応します。これにより、ブートストラッププロセス中に `nodeadm` に渡す設定内で、ハイブリッドノードのカスタムノード名を指定できます。`nodeadm init` プロセス中にカスタムノード名を渡す必要があります。プロファイルの作成後、カスタムロールセッション名を受け入れるようにプロファイルを更新できます。

AWS IAM Roles Anywhere では、AWS IAM Roles Anywhere プロファイルの [durationSeconds](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/authentication-create-session#credentials-object) フィールドを通して認証情報の有効期間を設定できます。デフォルトの期間は 1 時間で、最大は 12 時間です。ハイブリッドノードの IAM ロールでの `MaxSessionDuration` 設定は、AWS IAM Roles Anywhere プロファイルの `durationSeconds` 設定よりも大きくする必要があります。`MaxSessionDuration` の詳細については、「[UpdateRole API documentation](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_UpdateRole.html)」を参照してください。

認証機関 (CA) から生成するマシンごとの証明書とキーは、ファイル名を証明書は `server.pem`、キーは `server.key` として、各ハイブリッドノードの `/etc/iam/pki` ディレクトリに配置する必要があります。

## ハイブリッドノードの IAM ロールを作成する
<a name="hybrid-nodes-create-role"></a>

このセクションのステップを実行するには、AWS コンソールまたは AWS CLI を使用する IAM プリンシパルに以下のアクセス許可が必要です。
+  `iam:CreatePolicy` 
+  `iam:CreateRole` 
+  `iam:AttachRolePolicy` 
+ AWS IAM Roles Anywhere を使用している場合
  +  `rolesanywhere:CreateTrustAnchor` 
  +  `rolesanywhere:CreateProfile` 
  +  `iam:PassRole` 

### AWS CloudFormation
<a name="hybrid-nodes-creds-cloudformation"></a>

まだである場合は、AWS CLI をインストールして設定します。「[AWS CLI の最新バージョンのインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」を参照してください。

 **AWS SSM ハイブリッドアクティベーションのステップ** 

CloudFormation スタックは、上記のアクセス許可を持つハイブリッドノードの IAM ロールを作成します。CloudFormation テンプレートは、AWS SSM ハイブリッドアクティベーションを作成しません。

1. ハイブリッドノード用の AWS SSM CloudFormation テンプレートをダウンロードします。

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-ssm-cfn.yaml'
   ```

1. 以下のオプションを使用して `cfn-ssm-parameters.json` を作成します。

   1. `ROLE_NAME` をハイブリッドノードの IAM ロールの名前に置き換えます。デフォルトでは、名前を指定しない場合、CloudFormation テンプレートは作成するロールの名前として `AmazonEKSHybridNodesRole` を使用します。

   1. `TAG_KEY` を、AWS SSM ハイブリッドアクティベーションの作成時に使用した AWS SSM リソースのタグキーに置き換えます。タグキーとタグ値の組み合わせは、`ssm:DeregisterManagedInstance` の条件で使用されます。これにより、ハイブリッドノードの IAM ロールは、ユーザーの AWS SSM ハイブリッドアクティベーションに関連付けられている AWS SSM マネージドインスタンスの登録解除のみ許可されるようになります。CloudFormation テンプレートでは、`TAG_KEY` はデフォルトで `EKSClusterARN` になります。

   1. `TAG_VALUE` を、AWS SSM ハイブリッドアクティベーションの作成時に使用した SSM AWS リソースタグ値に置き換えます。タグキーとタグ値の組み合わせは、`ssm:DeregisterManagedInstance` の条件で使用されます。これにより、ハイブリッドノードの IAM ロールは、ユーザーの AWS SSM ハイブリッドアクティベーションに関連付けられている AWS SSM マネージドインスタンスの登録解除のみ許可されるようになります。`EKSClusterARN` のデフォルトの `TAG_KEY` を使用している場合は、EKS クラスター ARN を `TAG_VALUE` として渡します。EKS クラスター ARN の形式は ` arn:aws:eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME` になります。

      ```
      {
        "Parameters": {
          "RoleName": "ROLE_NAME",
          "SSMDeregisterConditionTagKey": "TAG_KEY",
          "SSMDeregisterConditionTagValue": "TAG_VALUE"
        }
      }
      ```

1. CloudFormation スタックをデプロイします。`STACK_NAME` は、その CloudFormation スタックに付けた任意の名前に置き換えてください。

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --template-file hybrid-ssm-cfn.yaml \
       --parameter-overrides file://cfn-ssm-parameters.json \
       --capabilities CAPABILITY_NAMED_IAM
   ```

 **AWS IAM Roles Anywhere のステップ** 

CloudFormation スタックは、設定した認証機関 (CA) を使用して AWS IAM Roles Anywhere のトラストアンカーを作成し、AWS IAM Roles Anywhere プロファイルを作成し、前述のアクセス許可を使用して、ハイブリッドノードの IAM ロールを作成します。

1. 認証機関 (CA) のセットアップ

   1. AWS Private CA リソースを使用するには、[AWS Private Certificate Authority コンソール](https://console.aws.amazon.com/acm-pca/home)を開きます。[「AWS Private CA ユーザーガイド](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)」の指示に従ってください。

   1. 外部 CA を使用するには、CA が提供する手順に従ってください。証明書本文は後のステップで提出します。

   1. パブリック CA から発行された証明書をトラストアンカーとして使用することはできません。

1. ハイブリッドノード用の AWS IAM Roles Anywhere CloudFormation テンプレートをダウンロードします

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-ira-cfn.yaml'
   ```

1. 以下のオプションを使用して `cfn-iamra-parameters.json` を作成します。

   1. `ROLE_NAME` をハイブリッドノードの IAM ロールの名前に置き換えます。デフォルトでは、名前を指定しない場合、CloudFormation テンプレートは作成するロールの名前として `AmazonEKSHybridNodesRole` を使用します。

   1. `CERT_ATTRIBUTE` を、ホストを一意に識別するマシンごとの証明書属性に置き換えます。使用する証明書属性は、ハイブリッドノードをクラスターに接続するときに `nodeadm` 設定に使用する nodeName と一致する必要があります。詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。デフォルトでは、CloudFormation テンプレートは `${aws:PrincipalTag/x509Subject/CN}` を `CERT_ATTRIBUTE` として使用します。これは、マシンごとの証明書の CN フィールドに対応します。または、`$(aws:PrincipalTag/x509SAN/Name/CN}` を `CERT_ATTRIBUTE` として渡すこともできます。

   1. `CA_CERT_BODY` を、CA の証明書本文から改行を取り除いたものに置き換えます。`CA_CERT_BODY` は、プライバシー強化メール (PEM) 形式である必要がありす。PEM 形式の CA 証明書がある場合は、CA 証明書本文を `cfn-iamra-parameters.json` ファイルに配置する前に、改行と BEGIN CERTIFICATE 行と END CERTIFICATE 行を削除します。

      ```
      {
        "Parameters": {
          "RoleName": "ROLE_NAME",
          "CertAttributeTrustPolicy": "CERT_ATTRIBUTE",
          "CABundleCert": "CA_CERT_BODY"
        }
      }
      ```

1. CloudFormation テンプレートをデプロイする。`STACK_NAME` は、その CloudFormation スタックに付けた任意の名前に置き換えてください。

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --template-file hybrid-ira-cfn.yaml \
       --parameter-overrides file://cfn-iamra-parameters.json
       --capabilities CAPABILITY_NAMED_IAM
   ```

### AWS CLI
<a name="hybrid-nodes-creds-awscli"></a>

まだである場合は、AWS CLI をインストールして設定します。「[AWS CLI の最新バージョンのインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」を参照してください。

 **EKS DescribeCluster ポリシーを作成する** 

1. 次の内容で、`eks-describe-cluster-policy.json` という名前のファイルを作成します。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "eks:DescribeCluster"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

1. 次のコマンドを使用してポリシーを作成します。

   ```
   aws iam create-policy \
       --policy-name EKSDescribeClusterPolicy \
       --policy-document file://eks-describe-cluster-policy.json
   ```

 **AWS SSM ハイブリッドアクティベーションのステップ** 

1. 次の内容で、`eks-hybrid-ssm-policy.json` という名前のファイルを作成します。このポリシーは、`ssm:DescribeInstanceInformation` と `ssm:DeregisterManagedInstance` の 2 つのアクションのアクセス許可を付与します。このポリシーは、`ssm:DeregisterManagedInstance` へのアクセス許可の範囲を、信頼ポリシーで指定したリソースタグに基づき、AWS SSM ハイブリッドアクティベーションに関連付けられた AWS SSM マネージドインスタンスに制限します。

   1. `AWS_REGION` を、AWS SSM ハイブリッドアクティベーションの AWS リージョンに置き換えます。

   1. `AWS_ACCOUNT_ID` を AWS アカウント ID に置き換えます。

   1. `TAG_KEY` を、AWS SSM ハイブリッドアクティベーションの作成時に使用した AWS SSM リソースのタグキーに置き換えます。タグキーとタグ値の組み合わせは、`ssm:DeregisterManagedInstance` の条件で使用されます。これにより、ハイブリッドノードの IAM ロールは、ユーザーの AWS SSM ハイブリッドアクティベーションに関連付けられている AWS SSM マネージドインスタンスの登録解除のみ許可されるようになります。CloudFormation テンプレートでは、`TAG_KEY` はデフォルトで `EKSClusterARN` になります。

   1. `TAG_VALUE` を、AWS SSM ハイブリッドアクティベーションの作成時に使用した SSM AWS リソースタグ値に置き換えます。タグキーとタグ値の組み合わせは、`ssm:DeregisterManagedInstance` の条件で使用されます。これにより、ハイブリッドノードの IAM ロールは、ユーザーの AWS SSM ハイブリッドアクティベーションに関連付けられている AWS SSM マネージドインスタンスの登録解除のみ許可されるようになります。`EKSClusterARN` のデフォルトの `TAG_KEY` を使用している場合は、EKS クラスター ARN を `TAG_VALUE` として渡します。EKS クラスター ARN の形式は ` arn:aws:eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME` になります。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "ssm:DescribeInstanceInformation",
                  "Resource": "*"
              },
              {
                  "Effect": "Allow",
                  "Action": "ssm:DeregisterManagedInstance",
                  "Resource": "arn:aws:ssm:us-east-1:123456789012:managed-instance/*",
                  "Condition": {
                      "StringEquals": {
                          "ssm:resourceTag/TAG_KEY": "TAG_VALUE"
                      }
                  }
              }
          ]
      }
      ```

1. 次のコマンドを使用してポリシーを作成します。

   ```
   aws iam create-policy \
       --policy-name EKSHybridSSMPolicy \
       --policy-document file://eks-hybrid-ssm-policy.json
   ```

1. `eks-hybrid-ssm-trust.json` という名前のファイルを作成します。`AWS_REGION` を AWS SSM ハイブリッドアクティベーションの AWS リージョンに、`AWS_ACCOUNT_ID` をお使いの AWS アカウント ID に置き換えます。

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Sid":"",
            "Effect":"Allow",
            "Principal":{
               "Service":"ssm.amazonaws.com"
            },
            "Action":"sts:AssumeRole",
            "Condition":{
               "StringEquals":{
                  "aws:SourceAccount":"123456789012"
               },
               "ArnEquals":{
                  "aws:SourceArn":"arn:aws:ssm:us-east-1:123456789012:*"
               }
            }
         }
      ]
   }
   ```

1. 次のコマンドを使用してロールを作成します。

   ```
   aws iam create-role \
       --role-name AmazonEKSHybridNodesRole \
       --assume-role-policy-document file://eks-hybrid-ssm-trust.json
   ```

1. 前のステップで作成した `EKSDescribeClusterPolicy` と `EKSHybridSSMPolicy` をアタッチします。`AWS_ACCOUNT_ID` を AWS アカウント ID に置き換えます。

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/EKSDescribeClusterPolicy
   ```

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/EKSHybridSSMPolicy
   ```

1. `AmazonEC2ContainerRegistryPullOnly` と `AmazonSSMManagedInstanceCore` AWS マネージドポリシーをアタッチします。

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
   ```

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
   ```

 **AWS IAM Roles Anywhere のステップ** 

AWS IAM Roles Anywhere を使用するには、ハイブリッドノードの IAM ロールを作成する前に、AWS IAM Roles Anywhere のトラストアンカーを設定する必要があります。手順については「[AWS IAM Roles Anywhere の設定](#hybrid-nodes-iam-roles-anywhere)」を参照してください。

1. `eks-hybrid-iamra-trust.json` という名前のファイルを作成します。`TRUST_ANCHOR ARN` を、[AWS IAM Roles Anywhere の設定](#hybrid-nodes-iam-roles-anywhere) のステップで作成したトラストアンカーの ARN に置き換えます。この信頼ポリシーの条件は、AWS IAM Roles Anywhere がハイブリッドノードの IAM ロールを引き受けて一時的な IAM 認証情報を交換する機能を、ロールセッション名がハイブリッドノードにインストールされている x509 証明書の CN と一致する場合のみに制限します。別の方法として、他の証明書属性を使用してノードを一意に識別することもできます。信頼ポリシーで使用する証明書属性は、`nodeadm` 設定で設定した `nodeName` に対応している必要があります。詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "rolesanywhere.amazonaws.com"
               },
               "Action": [
                   "sts:TagSession",
                   "sts:SetSourceIdentity"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                   },
                   "ArnEquals": {
                       "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "rolesanywhere.amazonaws.com"
               },
               "Action": "sts:AssumeRole",
               "Condition": {
                   "StringEquals": {
                       "sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}",
                       "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                   },
                   "ArnEquals": {
                       "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                   }
               }
           }
       ]
   }
   ```

1. 次のコマンドを使用してロールを作成します。

   ```
   aws iam create-role \
       --role-name AmazonEKSHybridNodesRole \
       --assume-role-policy-document file://eks-hybrid-iamra-trust.json
   ```

1. 前のステップで作成した `EKSDescribeClusterPolicy` をアタッチします。`AWS_ACCOUNT_ID` を AWS アカウント ID に置き換えます。

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/EKSDescribeClusterPolicy
   ```

1. `AmazonEC2ContainerRegistryPullOnly` AWS マネージドポリシーをアタッチします。

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
   ```

### AWS マネジメントコンソール
<a name="hybrid-nodes-creds-console"></a>

 **EKS DescribeCluster ポリシーを作成する** 

1. [Amazon IAM コンソール](https://console.aws.amazon.com/iam/home)を開きます。

1. 左のナビゲーションペインの [**ポリシー**] を選択します。

1. **[ポリシー]** ページで、**[ポリシーの作成]** を選択します。

1. [アクセス許可を指定] ページの [サービスの選択] パネルで、[EKS] を選択します。

   1. **DescribeCluster** でアクションをフィルタリングし、**DescribeCluster** の Read アクションを選択します。

   1. [**次へ**] を選択します。

1. **[確認と作成]** ページで以下を行います。

   1. ポリシーの**ポリシー名**を、たとえば `EKSDescribeClusterPolicy` のように入力します。

   1. [**Create policy**] (ポリシーの作成) を選択します。

 **AWS SSM ハイブリッドアクティベーションのステップ** 

1. [Amazon IAM コンソール](https://console.aws.amazon.com/iam/home)を開きます。

1. 左のナビゲーションペインの [**ポリシー**] を選択します。

1. **[ポリシー]** ページで、**[ポリシーの作成]** を選択します。

1. **[アクセス許可を指定]** ページの **[ポリシーエディタ]** の右上のナビゲーションで、**[JSON]** を選択します。以下のスニペットを貼り付けます。`AWS_REGION` を AWS SSM ハイブリッドアクティベーションの AWS リージョンに置き換え、`AWS_ACCOUNT_ID` をお使いの AWS アカウント ID に置き換えます。`TAG_KEY` と `TAG_VALUE` を、AWS SSM ハイブリッドアクティベーションの作成時に使用した AWS SSM リソースのタグキーに置き換えます。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "ssm:DescribeInstanceInformation",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": "ssm:DeregisterManagedInstance",
               "Resource": "arn:aws:ssm:us-east-1:123456789012:managed-instance/*",
               "Condition": {
                   "StringEquals": {
                       "ssm:resourceTag/TAG_KEY": "TAG_VALUE"
                   }
               }
           }
       ]
   }
   ```

   1. [**次へ**] を選択します。

1. **[確認と作成]** ページで以下を行います。

   1. ポリシーの**ポリシー**名を、たとえば `EKSHybridSSMPolicy` のように入力します。

   1. **[ポリシーの作成]** を選択します。

1. 左のナビゲーションペインで、**[ロール]** を選択してください。

1. **[ロール]** ページで、**[ロールの作成]** を選択してください。

1. **[信頼されたエンティティを選択]** ページで、以下の操作を実行してください：

   1. **[信頼されたエンティティのタイプ]** セクションで **[カスタム信頼ポリシー]** を選択します。以下をカスタム信頼ポリシーエディタに貼り付けます。`AWS_REGION` を AWS SSM ハイブリッドアクティベーションの AWS リージョンに、`AWS_ACCOUNT_ID` をお使いの AWS アカウント ID に置き換えます。

      ```
      {
         "Version":"2012-10-17",		 	 	 
         "Statement":[
            {
               "Sid":"",
               "Effect":"Allow",
               "Principal":{
                  "Service":"ssm.amazonaws.com"
               },
               "Action":"sts:AssumeRole",
               "Condition":{
                  "StringEquals":{
                     "aws:SourceAccount":"123456789012"
                  },
                  "ArnEquals":{
                     "aws:SourceArn":"arn:aws:ssm:us-east-1:123456789012:*"
                  }
               }
            }
         ]
      }
      ```

   1. [次へ] を選択します。

1. **[アクセス許可を追加]** ページで、カスタムポリシーをアタッチするか、以下の操作を行います。

   1. **[フィルターポリシー]** ボックスに、`EKSDescribeClusterPolicy` または上記で作成したポリシーの名前を入力します。検索結果でポリシー名の左にあるチェックボックスを選択します。

   1. **[フィルターポリシー]** ボックスに、`EKSHybridSSMPolicy` または上記で作成したポリシーの名前を入力します。検索結果でポリシー名の左にあるチェックボックスを選択します。

   1. **[フィルタポリシー]** ボックスに `AmazonEC2ContainerRegistryPullOnly` と入力します。検索結果の `AmazonEC2ContainerRegistryPullOnly` の左にあるチェックボックスを選択します。

   1. **[フィルタポリシー]** ボックスに `AmazonSSMManagedInstanceCore` と入力します。検索結果の `AmazonSSMManagedInstanceCore` の左にあるチェックボックスを選択します。

   1. [**次へ**] を選択します。

1. **[名前を付けて、レビューし、作成する]** ページで、以下の操作を実行します。

   1. **[ロール名]** に、`AmazonEKSHybridNodesRole` などのロールの一意の名前を入力します。

   1. **[Description]** (説明) では、現在のテキストを「`Amazon EKS - Hybrid Nodes role`」などの説明文に置き換えます。

   1. [**ロールの作成**] を選択してください。

 **AWS IAM Roles Anywhere のステップ** 

AWS IAM Roles Anywhere を使用するには、ハイブリッドノードの IAM ロールを作成する前に、AWS IAM Roles Anywhere のトラストアンカーを設定する必要があります。手順については「[AWS IAM Roles Anywhere の設定](#hybrid-nodes-iam-roles-anywhere)」を参照してください。

1. [Amazon IAM コンソール](https://console.aws.amazon.com/iam/home)を開きます。

1. 左のナビゲーションペインで、**[ロール]** を選択してください。

1. **[ロール]** ページで、**[ロールの作成]** を選択してください。

1. **[信頼されたエンティティを選択]** ページで、以下の操作を実行してください：

   1. **[信頼されたエンティティのタイプ]** セクションで **[カスタム信頼ポリシー]** を選択します。以下をカスタム信頼ポリシーエディタに貼り付けます。`TRUST_ANCHOR ARN` を、[AWS IAM Roles Anywhere の設定](#hybrid-nodes-iam-roles-anywhere) のステップで作成したトラストアンカーの ARN に置き換えます。この信頼ポリシーの条件は、AWS IAM Roles Anywhere がハイブリッドノードの IAM ロールを引き受けて一時的な IAM 認証情報を交換する機能を、ロールセッション名がハイブリッドノードにインストールされている x509 証明書の CN と一致する場合のみに制限します。別の方法として、他の証明書属性を使用してノードを一意に識別することもできます。信頼ポリシーで使用する証明書属性は、nodeadm 設定で設定した nodeName に対応している必要があります。詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "rolesanywhere.amazonaws.com"
                  },
                  "Action": [
                      "sts:TagSession",
                      "sts:SetSourceIdentity"
                  ],
                  "Condition": {
                      "StringEquals": {
                          "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                      },
                      "ArnEquals": {
                          "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                      }
                  }
              },
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "rolesanywhere.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}",
                          "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                      },
                      "ArnEquals": {
                          "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                      }
                  }
              }
          ]
      }
      ```

   1. [次へ] を選択します。

1. **[アクセス許可を追加]** ページで、カスタムポリシーをアタッチするか、以下の操作を行います。

   1. **[フィルターポリシー]** ボックスに、`EKSDescribeClusterPolicy` または上記で作成したポリシーの名前を入力します。検索結果でポリシー名の左にあるチェックボックスを選択します。

   1. **[フィルタポリシー]** ボックスに `AmazonEC2ContainerRegistryPullOnly` と入力します。検索結果の `AmazonEC2ContainerRegistryPullOnly` の左にあるチェックボックスを選択します。

   1. [**次へ**] を選択します。

1. **[名前を付けて、レビューし、作成する]** ページで、以下の操作を実行します。

   1. **[ロール名]** に、`AmazonEKSHybridNodesRole` などのロールの一意の名前を入力します。

   1. **[Description]** (説明) では、現在のテキストを「`Amazon EKS - Hybrid Nodes role`」などの説明文に置き換えます。

   1. [**ロールの作成**] を選択してください。

# ハイブリッドノードを使用して Amazon EKS クラスターを作成する
<a name="hybrid-nodes-cluster-create"></a>

このトピックでは、使用可能なオプションの概要と、ハイブリッドノード対応の Amazon EKS クラスターの作成時に考慮すべき点を説明します。EKS Hybrid Nodes には、クラウドノードを使用する Amazon EKS クラスターと同じ [Kubernetes バージョンのサポート](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)があります (標準サポートや拡張サポートなど)。

EKS Hybrid Nodes を使用する予定がない場合は、「[Amazon EKS クラスターを作成します。](create-cluster.md)」にある Amazon EKS でのクラスター作成に関する基本ドキュメントを参照してください。

## 前提条件
<a name="hybrid-nodes-cluster-create-prep"></a>
+ [ハイブリッドノードの前提条件のセットアップ](hybrid-nodes-prereqs.md) が完了していること。ハイブリッドノード対応クラスターを作成する前に、オンプレミスノードとオプションでポッド CIDR を特定し、EKS の要件とハイブリッドノードの要件に従って VPC とサブネットを作成し、オンプレミスおよびオプションでポッド CIDR のインバウンドルールを持つセキュリティグループを指定する必要があります。前提条件の詳細については、[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md) を参照してください。
+ AWS コマンドラインインターフェイス (AWS CLI) の最新バージョンがデバイスにインストールおよび設定されていること。現在のバージョンを確認するには「`aws --version`」を参照してください。yum、apt-get、macOS 用の Homebrew などのパッケージマネージャーは、多くの場合 AWS CLI の最新バージョンより数バージョン古くなっています。最新バージョンをインストールするには、「AWS コマンドラインインターフェイスユーザーガイド」の「[AWS CLI の最新バージョンのインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」および「[AWS CLI の設定の構成](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)」を参照してください。
+ IAM ロールを作成してポリシーをアタッチし、EKS クラスターを作成および記述するアクセス許可を持つ [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)があること

## 考慮事項
<a name="hybrid-nodes-cluster-create-consider"></a>
+ クラスターは、クラスター認証モードに `API` または `API_AND_CONFIG_MAP` を使用する必要があります。
+ クラスターは IPv4 アドレスファミリーを使用する必要があります。
+ クラスターは、パブリッククラスターエンドポイント接続またはプライベートクラスターエンドポイント接続を使用する必要があります。ハイブリッドノードが VPC 外で実行される場合、Amazon EKS Kubernetes API サーバーエンドポイントがパブリック IP に解決されるため、クラスターは「パブリックおよびプライベート」のクラスターエンドポイント接続を使用できません。
+ OIDC 認証は、ハイブリッドノードが有効な EKS クラスターでサポートされています。
+ 既存のクラスターのハイブリッドノード設定を追加、変更、削除できます。詳細については、「[既存の Amazon EKS クラスターでハイブリッドノードを有効にするか、設定を変更する](hybrid-nodes-cluster-update.md)」を参照してください。

## ステップ 1: クラスター IAM ロールを作成する
<a name="hybrid-nodes-cluster-create-iam"></a>

既にクラスター IAM ロールがある場合や、`eksctl` または AWS CloudFormation を使用してクラスターを作成する場合は、このステップはスキップできます。デフォルトでは、`eksctl` および AWS CloudFormation テンプレートによってクラスター IAM ロールが作成されます。

1. IAM 信頼ポリシー用の JSON ファイルを作成するには次のコマンドを実行してください。

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "eks.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. Amazon EKS クラスターの IAM ロールを作成します。必要であれば、前のステップでファイルを書き込んだコンピュータ上のパスを eks-cluster-role-trust-policy.json の前につけます。このコマンドは前のステップで作成した信頼ポリシーをロールに関連付けます。IAM ロールを作成するにはロールを作成する [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)に `iam:CreateRole` アクション (許可) を割り当てる必要があります。

   ```
   aws iam create-role \
       --role-name myAmazonEKSClusterRole \
       --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
   ```

1. Amazon EKS 管理のポリシーを割り当てるか、独自のカスタムポリシーを作成できます。カスタムポリシーで使用する必要がある最小限の許可については、「[Amazon EKS ノードの IAM ロール](create-node-role.md)」を参照してください。このロールに、Amazon EKS 管理の IAM ポリシー (`AmazonEKSClusterPolicy`) をアタッチします。IAM ポリシーを [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)にアタッチするには、ポリシーのアタッチを行っているプリンシパルに、次のいずれかの IAM アクション (許可) を割り当てる必要があります: `iam:AttachUserPolicy` または `iam:AttachRolePolicy`。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy \
       --role-name myAmazonEKSClusterRole
   ```

## ステップ 2: ハイブリッドノード対応クラスターを作成する
<a name="hybrid-nodes-cluster-create-cluster"></a>

以下を使用してクラスターを作成できます：
+  [eksctl](#hybrid-nodes-cluster-create-eksctl) 
+  [AWS CloudFormation](#hybrid-nodes-cluster-create-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-create-cli) 
+  [AWS マネジメントコンソール](#hybrid-nodes-cluster-create-console) 

### ハイブリッドノード対応クラスターの作成 - eksctl
<a name="hybrid-nodes-cluster-create-eksctl"></a>

`eksctl` コマンドラインツールの最新バージョンをインストールする必要があります。`eksctl` をインストールまたはアップグレードするには`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。

1. `cluster-config.yaml` を作成して、ハイブリッドノード対応の Amazon EKS IPv4 クラスターを定義します。`cluster-config.yaml` で以下の置換を実行します。設定の完全なリストについては、「[eksctl documentation](https://eksctl.io/getting-started/)」を参照してください。

   1. `CLUSTER_NAME` をクラスターの名前に置き換えます。この名前には英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前はクラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。

   1. `AWS_REGION` を、クラスターを作成する AWS リージョンに置き換えます。

   1. `K8S_VERSION` を [Amazon EKS がサポートする任意のバージョン](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)に置き換えます。

   1. [ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md) のステップで設定した認証情報プロバイダーに基づいて、`CREDS_PROVIDER` を `ssm` または `ira` に置き換えます。

   1. 認証情報プロバイダーが `ira` に設定されている場合 (AWS IAM Roles Anywhere を認証情報プロバイダーとして使用)、`CA_BUNDLE_CERT` を置き換えます。CA\$1BUNDLE\$1CERT は認証機関 (CA) 証明書本文であり、CA の選択によって異なります。証明書はプライバシー強化メール (PEM) 形式である必要があります。

   1. `GATEWAY_ID` を、VPC にアタッチする仮想プライベートゲートウェイまたはトランジットゲートウェイの ID に置き換えます。

   1. `REMOTE_NODE_CIDRS` を、ハイブリッドノードのオンプレミスノード CIDR に置き換えます。

   1. `REMOTE_POD_CIDRS` をハイブリッドノードで実行されているワークロードのオンプレミスポッド CIDR に置き換えるか、ハイブリッドノードでウェブフックを実行していない場合は設定から行を削除します。CNI がネットワークアドレス変換 (NAT) を使用しない場合や、ポッドトラフィックがオンプレミスホストから出るときにポッド IP アドレスをマスクする場合は、`REMOTE_POD_CIDRS` を設定する必要があります。ハイブリッドノードでウェブフックを実行している場合は、`REMOTE_POD_CIDRS` を設定する必要があります。詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」を参照してください。

   1. オンプレミスノードとポッド CIDR ブロックは、以下の要件を満たしている必要があります。

      1. IPv4 RFC-1918 のいずれかの範囲内にある (`10.0.0.0/8`、`172.16.0.0/12`、または `192.168.0.0/16`) か、RFC 6598 で定義される CGNAT 範囲内にある (`100.64.0.0/10`) こと。

      1. 相互に、クラスターの `VPC CIDR`、または Kubernetes サービスの IPv4 CIDR と重複しないこと

         ```
         apiVersion: eksctl.io/v1alpha5
         kind: ClusterConfig
         
         metadata:
           name: CLUSTER_NAME
           region: AWS_REGION
           version: "K8S_VERSION"
         
         remoteNetworkConfig:
           iam:
             provider: CREDS_PROVIDER # default SSM, can also be set to IRA
             # caBundleCert: CA_BUNDLE_CERT
           vpcGatewayID: GATEWAY_ID
           remoteNodeNetworks:
           - cidrs: ["REMOTE_NODE_CIDRS"]
           remotePodNetworks:
           - cidrs: ["REMOTE_POD_CIDRS"]
         ```

1. 次のコマンドを実行してください：

   ```
   eksctl create cluster -f cluster-config.yaml
   ```

   クラスターのプロビジョニングには数分かかります。クラスターの作成中は数行の出力が表示されます。出力の最後の行は次のサンプル行のようになります。

   ```
   [✓]  EKS cluster "CLUSTER_NAME" in "REGION" region is ready
   ```

1. 「[ステップ 3: kubeconfig を更新する](#hybrid-nodes-cluster-create-kubeconfig)」に進みます。

### ハイブリッドノード対応クラスターの作成 - AWS CloudFormation
<a name="hybrid-nodes-cluster-create-cfn"></a>

CloudFormation スタックは、指定した `RemotePodNetwork` と `RemoteNodeNetwork` を使用して、EKS クラスター IAM ロールと EKS クラスターを作成します。CloudFormation テンプレートで公開されていない EKS クラスターの設定をカスタマイズする必要がある場合は、CloudFormation テンプレートを変更します。

1. CloudFormation テンプレートをダウンロードします。

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-eks-cfn.yaml'
   ```

1. `cfn-eks-parameters.json` を作成し、各値の設定を指定します。

   1.  `CLUSTER_NAME`: 作成する EKS クラスターの名前。

   1.  `CLUSTER_ROLE_NAME`: 作成する EKS クラスター IAM ロールの名前。テンプレートのデフォルトは「EKSClusterRole」です。

   1.  `SUBNET1_ID`: 前提条件のステップで作成した最初のサブネットの ID

   1.  `SUBNET2_ID`: 前提条件のステップで作成した 2 番目のサブネットの ID

   1.  `SG_ID`: 前提条件のステップで作成したセキュリティグループの ID

   1.  `REMOTE_NODE_CIDRS`: ハイブリッドノードのオンプレミスノード CIDR

   1.  `REMOTE_POD_CIDRS`: ハイブリッドノードで実行されているワークロードのオンプレミスポッド CIDR CNI がネットワークアドレス変換 (NAT) を使用しない場合や、ポッドトラフィックがオンプレミスホストから出るときにポッド IP アドレスをマスクする場合は、`REMOTE_POD_CIDRS` を設定する必要があります。ハイブリッドノードでウェブフックを実行している場合は、`REMOTE_POD_CIDRS` を設定する必要があります。詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」を参照してください。

   1. オンプレミスノードとポッド CIDR ブロックは、以下の要件を満たしている必要があります。

      1. IPv4 RFC-1918 のいずれかの範囲内にある (`10.0.0.0/8`、`172.16.0.0/12`、または `192.168.0.0/16`) か、RFC 6598 で定義される CGNAT 範囲内にある (`100.64.0.0/10`) こと。

      1. 相互に、クラスターの `VPC CIDR`、または Kubernetes サービスの IPv4 CIDR と重複しないこと。

   1.  `CLUSTER_AUTH`: クラスターのクラスター認証モード。有効な値は、`API` および `API_AND_CONFIG_MAP` です。テンプレートのデフォルトは `API_AND_CONFIG_MAP` です。

   1.  `CLUSTER_ENDPOINT`: クラスターのクラスターエンドポイント接続。有効な値は「Public」および「Private」です。テンプレートのデフォルトは Private です。つまり、Kubernetes API エンドポイントには VPC 内からしか接続できません。

   1.  `K8S_VERSION`: クラスターに使用する Kubernetes のバージョン。「[サポートされている Amazon EKS バージョン](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)」を参照してください。

      ```
      {
        "Parameters": {
          "ClusterName": "CLUSTER_NAME",
          "ClusterRoleName": "CLUSTER_ROLE_NAME",
          "SubnetId1": "SUBNET1_ID",
          "SubnetId2": "SUBNET2_ID",
          "SecurityGroupId" "SG_ID",
          "RemoteNodeCIDR": "REMOTE_NODE_CIDRS",
          "RemotePodCIDR": "REMOTE_POD_CIDRS",
          "ClusterAuthMode": "CLUSTER_AUTH",
          "ClusterEndpointConnectivity": "CLUSTER_ENDPOINT",
          "K8sVersion": "K8S_VERSION"
        }
       }
      ```

1. CloudFormation スタックをデプロイします。`STACK_NAME` を CloudFormation スタックの名前に置き換え、`AWS_REGION` をクラスターを作成する AWS リージョンに置き換えます。

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --region AWS_REGION \
       --template-file hybrid-eks-cfn.yaml \
       --parameter-overrides file://cfn-eks-parameters.json \
       --capabilities CAPABILITY_NAMED_IAM
   ```

   クラスターのプロビジョニングには数分かかります。以下のコマンドを使用してスタックの状態を確認できます。`STACK_NAME` を CloudFormation スタックの名前に置き換え、`AWS_REGION` をクラスターを作成する AWS リージョンに置き換えます。

   ```
   aws cloudformation describe-stacks \
       --stack-name STACK_NAME \
       --region AWS_REGION \
       --query 'Stacks[].StackStatus'
   ```

1. 「[ステップ 3: kubeconfig を更新する](#hybrid-nodes-cluster-create-kubeconfig)」に進みます。

### ハイブリッドノード対応クラスターの作成 - AWS CLI
<a name="hybrid-nodes-cluster-create-cli"></a>

1. 以下のコマンドを実行して、ハイブリッドノード対応の EKS クラスターを作成します。コマンドを実行する前に、以下を自分の設定に置き換えます。設定の完全なリストについては、[Amazon EKS クラスターを作成します。](create-cluster.md) のドキュメントを参照してください。

   1.  `CLUSTER_NAME`: 作成する EKS クラスターの名前。

   1.  `AWS_REGION`: クラスターを作成する AWS リージョン。

   1.  `K8S_VERSION`: クラスターに使用する Kubernetes のバージョン。「サポートされている Amazon EKS バージョン」を参照してください。

   1.  `ROLE_ARN`: クラスター用に設定した Amazon EKS クラスターロール。詳細については、「Amazon EKS クラスターの IAM ロール」を参照してください。

   1.  `SUBNET1_ID`: 前提条件のステップで作成した最初のサブネットの ID

   1.  `SUBNET2_ID`: 前提条件のステップで作成した 2 番目のサブネットの ID

   1.  `SG_ID`: 前提条件のステップで作成したセキュリティグループの ID

   1. クラスターアクセス認証モードには `API`と `API_AND_CONFIG_MAP` を使用できます。以下のコマンドでは、クラスターアクセス認証モードは `API_AND_CONFIG_MAP` に設定されています。

   1. `endpointPrivateAccess` パラメータ と `endpointPublicAccess` パラメータを使用して、クラスターの Kubernetes API サーバーエンドポイントへのパブリックとプライベートアクセスを有効または無効にすることができます。以下のコマンドでは、`endpointPublicAccess` は false に設定され、`endpointPrivateAccess` は true に設定されています。

   1.  `REMOTE_NODE_CIDRS`: ハイブリッドノードのオンプレミスノード CIDR。

   1.  `REMOTE_POD_CIDRS` (オプション): ハイブリッドノードで実行されているワークロードのオンプレミスポッド CIDR

   1. オンプレミスノードとポッド CIDR ブロックは、以下の要件を満たしている必要があります。

      1. IPv4 RFC-1918 のいずれかの範囲内にある (`10.0.0.0/8`、`172.16.0.0/12`、または `192.168.0.0/16`) か、RFC 6598 で定義される CGNAT 範囲内にある (`100.64.0.0/10`) こと。

      1. 相互に、Amazon EKS クラスターの `VPC CIDR`、または Kubernetes サービスの IPv4 CIDR と重複しないこと。

         ```
         aws eks create-cluster \
             --name CLUSTER_NAME \
             --region AWS_REGION \
             --kubernetes-version K8S_VERSION \
             --role-arn ROLE_ARN \
             --resources-vpc-config subnetIds=SUBNET1_ID,SUBNET2_ID,securityGroupIds=SG_ID,endpointPrivateAccess=true,endpointPublicAccess=false \
             --access-config authenticationMode=API_AND_CONFIG_MAP \
             --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["REMOTE_POD_CIDRS"]}]}'
         ```

1. クラスターがプロビジョニングされるまでに数分かかります。クラスターのステータスのクエリを実行するには次のコマンドを使用します。`CLUSTER_NAME` を、作成しているクラスターの名前に置き換え、`AWS_REGION` を、クラスターを作成している AWS リージョンに置き換えます。出力が「`ACTIVE`」を返すまで、次のステップに進まないでください。

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

1. 「[ステップ 3: kubeconfig を更新する](#hybrid-nodes-cluster-create-kubeconfig)」に進みます。

### ハイブリッドノード対応クラスターの作成 - AWS マネジメントコンソール
<a name="hybrid-nodes-cluster-create-console"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)で Amazon EKS コンソールを開きます。

1. [クラスターを追加]、[作成] の順にクリックします。

1. [クラスターの設定] ページで、次のフィールドに入力します。

   1.  **[名前]** - クラスターの名前。この名前には英数字 (大文字と小文字が区別されます)、ハイフン、下線のみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前はクラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。

   1.  **[クラスター IAM ロール]** – ユーザーに代わって AWS リソースを管理することを Kubernetes コントロールプレーンに許可するために作成した Amazon EKS クラスター IAM ロールを選択します。

   1.  **[Kubernetes バージョン]** – クラスターで使用する Kubernetes のバージョン。以前のバージョンが必要でない限り、最新バージョンを選択することをお勧めします。

   1.  **[アップグレードポリシー]** — 拡張または標準を選択します。

      1.  **拡張:** このオプションは、リリース日から 26 か月間 Kubernetes バージョンをサポートします。延長サポート期間には、標準サポート期間終了後に開始される追加の時間単位のコストがかかります。延長サポートが終了すると、クラスターは次のバージョンに自動的にアップグレードされます。

      1.  **標準:** このオプションは、リリース日から 14 か月間 Kubernetes バージョンをサポートします。追加コストはかかりません。標準サポートが終了すると、クラスターは次のバージョンに自動的にアップグレードされます。

   1.  **クラスターアクセス** - クラスター管理者アクセスを許可または禁止し、認証モードを選択します。ハイブリッドノードが有効なクラスターでは、以下の認証モードがサポートされます。

      1.  **EKS API**: クラスターは、認証された IAM プリンシパルを EKS アクセスエントリ API からのみ取得します。

      1.  **EKS API と ConfigMap**: クラスターは、EKS アクセスエントリ API と `aws-auth` ConfigMap の両方から認証された IAM プリンシパルを取得します。

   1.  **[Secret encryption]** (シークレット暗号化) – (オプション) KMS キーを使用して Kubernetes シークレットのシークレット暗号化を有効にするよう選択します。クラスターを作成した後で、これを有効にすることもできます。この機能を有効にする前に、[既存のクラスターで KMS を使用して Kubernetes シークレットを暗号化する](enable-kms.md) の情報をよく理解していることを確認してください。

   1.  **ARC ゾーンシフト** - 有効にすると、EKS はクラスターを ARC ゾーンシフトに登録し、ゾーンシフトを使用してアプリケーショントラフィックを AZ から遠ざけることができるようになります。

   1.  **[タグ]** - (オプション) クラスターに任意のタグを追加します。詳細については、「[タグを使用して Amazon EKS リソースを整理する](eks-using-tags.md)」を参照してください。

   1. このページを読み終えたら、**[次へ]** を選択してください。

1. **[ネットワーキングの指定]** ページで、次のフィールドの値を選択してください：

   1.  **VPC** – [VPC とサブネットの Amazon EKS ネットワーキング要件を表示する](network-reqs.md) および [Amazon EKS Hybrid Nodes](hybrid-nodes-prereqs.md) の要件を満たす既存の VPC を選択します。VPC を選択する前に、「VPC、サブネット、ハイブリッドノードの Amazon EKS ネットワーキング要件を表示する」の要件と考慮事項をすべて理解しておくことをお勧めします。クラスターの作成後は使用する VPC を変更できません。VPC が表示されていない場合はまず作成する必要があります。詳細については、「[Amazon EKS クラスターの Amazon VPC を作成する](creating-a-vpc.md)」および「[Amazon EKS Hybrid Nodes のネットワーク要件](hybrid-nodes-prereqs.md)」を参照してください。

   1.  **[サブネット]** - デフォルトで、前のフィールドで指定した VPC 内の利用可能なすべてのサブネットがあらかじめ選択されています。少なくとも 2 つ選択する必要があります。

   1.  **[セキュリティグループ]** - (オプション Amazon EKS が作成するネットワークインターフェイスに関連付ける 1 つまたは複数のセキュリティグループを指定します。指定するセキュリティグループの少なくとも 1 つには、オンプレミスのノードとオプションで ポッド CIDR に対するインバウンドルールが必要です。詳細については、「[Amazon EKS Hybrid Nodes のネットワーク要件](hybrid-nodes-networking.md)」を参照してください。セキュリティグループを選択するかどうかにかかわらず、Amazon EKS はクラスターと VPC 間の通信を可能にするセキュリティグループを作成します。Amazon EKS はこのセキュリティグループおよびユーザーが選択したセキュリティグループを、作成するネットワークインターフェイスに関連付けます。Amazon EKS が作成するクラスターセキュリティグループの詳細については、「[クラスターの Amazon EKS セキュリティグループ要件を表示する](sec-group-reqs.md)」を参照してください。Amazon EKS が作成するクラスターセキュリティグループのルールは変更できます。

   1.  **クラスター IP アドレスファミリーの選択** — ハイブリッドノード対応クラスターには IPv4 を選択する必要があります。

   1. (オプション) **[Kubernetes サービス IP アドレスの範囲を設定する]** を選択し、**[サービスの IPv4 範囲]** を指定します。

   1.  **[リモートネットワークを設定してハイブリッドノードを有効にする]** を選択し、ハイブリッドノードのオンプレミスノードとポッド CIDR を指定します。

   1. ポッドトラフィックがオンプレミスホストを離れる際、CNI がポッド IP アドレスに対してネットワークアドレス変換 (NAT) またはマスカレードを使用しない場合は、リモートポッド CIDR を設定する必要があります。ハイブリッドノードでウェブフックを実行している場合は、リモートポッド CIDR を設定する必要があります。

   1. オンプレミスノードとポッド CIDR ブロックは、以下の要件を満たしている必要があります。

      1. IPv4 RFC-1918 のいずれかの範囲内にある (`10.0.0.0/8`、`172.16.0.0/12`、または `192.168.0.0/16`) か、RFC 6598 で定義される CGNAT 範囲内にある (`100.64.0.0/10`) こと。

      1. 相互に、クラスターの `VPC CIDR`、または Kubernetes サービスの IPv4 CIDR と重複しないこと

   1. **[クラスターエンドポイントのアクセス]** で、オプションを選択してください。クラスターを作成した後で、このオプションを変更できます。ハイブリッドノードが有効なクラスターの場合は、パブリックまたはプライベートのいずれかを選択する必要があります。デフォルト以外のオプションを選択する前に、オプションとその意味を理解しておいてください。詳細については「[クラスター API サーバーエンドポイント](cluster-endpoint.md)」を参照してください。

   1. このページを読み終えたら、**[次へ]** を選択してください。

1. (オプション) **[オブザーバビリティの設定]** ページで、有効にする [メトリクス] と [コントロールプレーンのロギング] オプションを選択します。デフォルトではそれぞれのログタイプは無効化されています。

   1. Prometheus メトリクスの詳細については、「[Prometheus を使用してクラスターのメトリクスをモニタリングする](prometheus.md)」を参照してください。

   1. EKS コントロールのログ記録のオプションの詳細については、「[コントロールプレーンログを CloudWatch Logs に送信する](control-plane-logs.md)」を参照してください。

   1. このページを読み終えたら、**[次へ]** を選択してください。

1. **[アドオンの選択]** ページで、クラスターに追加するアドオンを選択してください。

   1. **[Amazon EKS アドオン]** と **[AWS マーケットプレイス アドオン]** は必要な数だけ選択できます。ハイブリッドノードと互換性のない Amazon EKS アドオンは「ハイブリッドノードと互換性がない」とマークされ、これらのアドオンには、ハイブリッドノードで実行されないようにするためのアンチアフィニティルールが設定されます。詳細については、「ハイブリッドノードのアドオンの設定」を参照してください。インストールする **[AWS Marketplace アドオン]** が一覧にない場合は、検索ボックスにテキストを入力して、利用可能な **[AWS Marketplace アドオン]** を検索できます。**[カテゴリ]**、**[ベンダー]**、または **[価格モデル]** で検索し、検索結果からアドオンを選択することもできます。

   1. CoreDNS や kube-proxy などの一部のアドオンは、デフォルトでインストールされます。デフォルトのアドオンのいずれかを無効にすると、Kubernetes アプリケーションを実行する機能に影響する場合があります。

   1. このページを読み終えたら、[`Next`] を選択してください。

1. **[選択したアドオン設定の構成]** ページで、インストールするバージョンを選択し、[次へ] を選択してください。

   1. クラスターを作成した後はいつでも新しいバージョンに更新できます。クラスターの作成後に、各アドオンの設定を更新できます。アドオンの設定の詳細については「[Amazon EKS アドオンを更新する](updating-an-add-on.md)」を参照してください。ハイブリッドノードと互換性のあるアドオンのバージョンについては、「[ハイブリッドノードのアドオンを構成する](hybrid-nodes-add-ons.md)」を参照してください。

   1. このページを読み終えたら、[次へ] を選択してください。

1. **[確認と作成]** ページで、前のページで入力または選択した情報を確認します。変更する必要がある場合は**[編集]** を選択してください。そのままでよければ、**[作成]** を選択してください。クラスターがプロビジョニングされている間、**[ステータス]** フィールドに **[作成中]** と表示されます。クラスターのプロビジョニングには数分かかります。

1. 「[ステップ 3: kubeconfig を更新する](#hybrid-nodes-cluster-create-kubeconfig)」に進みます。

## ステップ 3: kubeconfig を更新する
<a name="hybrid-nodes-cluster-create-kubeconfig"></a>

`eksctl` を使用してクラスターを作成した場合、このステップはスキップできます。`eksctl` によってこのステップは既に完了しているからです。新しいコンテキストを `kubectl` 設定ファイルに追加して、`kubectl` がクラスターと通信できるようにします。ファイルを作成および更新する方法の詳細については「[kubeconfig ファイルを作成して kubectl を EKS クラスターに接続する](create-kubeconfig.md)」を参照してください。

```
aws eks update-kubeconfig --name CLUSTER_NAME --region AWS_REGION
```

出力例は次のとおりです。

```
Added new context arn:aws:eks:AWS_REGION:111122223333:cluster/CLUSTER_NAME to /home/username/.kube/config
```

次のコマンドを実行して、クラスターとの通信を確認します。

```
kubectl get svc
```

出力例は次のとおりです。

```
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   28h
```

## ステップ 4: クラスターのセットアップ
<a name="_step_4_cluster_setup"></a>

次のステップとして、ハイブリッドノードをクラスターに参加させるためにアクセスを有効にする手順は、「[ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md)」を参照してください。

# 既存の Amazon EKS クラスターでハイブリッドノードを有効にするか、設定を変更する
<a name="hybrid-nodes-cluster-update"></a>

このトピックでは、使用可能なオプションの概要と、Amazon EKS クラスターのハイブリッドノード設定を追加、変更、削除する際の考慮事項について説明します。

Amazon EKS クラスターでハイブリッドノードを使用できるようにするには、オンプレミスノードとポッドネットワーク (オプション) の IP アドレス CIDR 範囲を `RemoteNetworkConfig` 設定に追加します。EKS では、この CIDR リストを使用して、クラスターとオンプレミスネットワーク間の接続を有効にします。クラスター設定を更新する際のオプションについては、「*Amazon EKS API リファレンス*」の「[UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)」でリスト全体を確認できます。

クラスター内にある EKS Hybrid Nodes のネットワーク設定では、次のいずれかのアクションを実行できます。
+  [リモートネットワーク設定を追加して、既存のクラスターで EKS Hybrid Nodes を有効にする。](#hybrid-nodes-cluster-enable-existing)
+  [既存のクラスター内のリモートノードネットワークまたはリモートポッドネットワークを追加、変更、削除する。](#hybrid-nodes-cluster-update-config)
+  [すべてのリモートノードネットワーク CIDR 範囲を削除して、既存のクラスターの EKS Hybrid Nodes を無効にする。](#hybrid-nodes-cluster-disable)

## 前提条件
<a name="hybrid-nodes-cluster-enable-prep"></a>
+ ハイブリッドノードの Amazon EKS クラスターを有効にする前に、環境が次の要件を満たしていることを確認してください: 「[ハイブリッドノードの前提条件のセットアップ](hybrid-nodes-prereqs.md)」で概説されている要件に加え、「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」、「[ハイブリッドノード用のオペレーティングシステムを準備する](hybrid-nodes-os.md)」、「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」で詳述されている要件
+ クラスターは IPv4 アドレスファミリーを使用する必要があります。
+ クラスターは、クラスター認証モードに `API` または `API_AND_CONFIG_MAP` を使用する必要があります。クラスター認証モードを変更するプロセスについては、「[アクセスエントリを使用するように認証モードを変更する](setting-up-access-entries.md)」を参照してください。
+ Amazon EKS Kubernetes API サーバーエンドポイントには、パブリックまたはプライベートいずれか (両方ではなく) のエンドポイントアクセスを使用することが推奨されます。「Public and Private (パブリックとプライベート)」を選択した場合、Amazon EKS Kubernetes API サーバーエンドポイントは、常に VPC の外部で稼働しているハイブリッドノードのパブリック IP に解決されるため、ハイブリッドノードがクラスターに参加できなくなる可能性があります。クラスターへのネットワークアクセスを変更するプロセスについては、「[クラスター API サーバーエンドポイント](cluster-endpoint.md)」を参照してください。
+ AWS コマンドラインインターフェイス (AWS CLI) の最新バージョンがデバイスにインストールおよび設定されていること。現在のバージョンを確認するには「`aws --version`」を参照してください。yum、apt-get、macOS 用の Homebrew などのパッケージマネージャーは、多くの場合 AWS CLI の最新バージョンより数バージョン古くなっています。最新バージョンをインストールするには、「AWS Command Line Interface ユーザーガイド」の「[AWS CLI の最新バージョンのインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」および「[AWS CLI の設定を構成する](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)」を参照してください。
+ Amazon EKS クラスターで [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html) を呼び出す権限を持つ [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)。
+ ハイブリッドノードと互換性のあるバージョンにアドオンを更新します。ハイブリッドノードと互換性のあるアドオンのバージョンについては、「[ハイブリッドノードのアドオンを構成する](hybrid-nodes-add-ons.md)」を参照してください。
+ ハイブリッドノードと互換性のないアドオンを実行している場合は、ハイブリッドノードへのデプロイを防ぐために、アドオンの [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) または [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) に、次のアフィニティルールが設定されていることを確認します。次のアフィニティルールが存在しない場合は追加してください。

  ```
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
  ```

## 考慮事項
<a name="hybrid-nodes-cluster-enable-consider"></a>

`remoteNetworkConfig` JSON オブジェクトは、更新中に次のように動作します。
+ 指定していない既存の設定部分は変更されません。`remoteNodeNetworks` または `remotePodNetworks` のいずれかを指定していない場合、該当箇所への変更は行われません。
+ `remoteNodeNetworks` または `remotePodNetworks` の CIDR リストを変更する場合は、最終設定に必要な CIDR の完全なリストを指定しなければなりません。`remoteNodeNetworks` または `remotePodNetworks` の CIDR リストのいずれかに変更を指定すると、更新中に元のリストが置き換えられます。
+ オンプレミスノードとポッド CIDR ブロックは、以下の要件を満たしている必要があります。

  1. IPv4 RFC-1918 のいずれかの範囲内にある (10.0.0.0/8、172.16.0.0/12、または 192.168.0.0/16) か、RFC 6598 で定義される CGNAT 範囲内にある (`100.64.0.0/10`) こと。

  1. Amazon EKS クラスターの VPC の全 CIDR、または Kubernetes サービスの IPv4 CIDR と相互に重複していないこと。

## 既存のクラスターでハイブリッドノードを有効にする
<a name="hybrid-nodes-cluster-enable-existing"></a>

既存のクラスターで EKS Hybrid Nodes を有効にするには、以下を使用します。
+  [AWS CloudFormation](#hybrid-nodes-cluster-enable-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-enable-cli) 
+  [AWS マネジメントコンソール](#hybrid-nodes-cluster-enable-console) 

### 既存のクラスターで EKS Hybrid Nodes を有効にする - AWS CloudFormation
<a name="hybrid-nodes-cluster-enable-cfn"></a>

1. クラスターで EKS Hybrid Nodes を有効にするには、`RemoteNodeNetwork` と `RemotePodNetwork` (オプション) を CloudFormation テンプレートに追加して、スタックを更新します。`RemoteNodeNetwork` は最大 1 つの `Cidrs` 項目が含まれるリストであり、`Cidrs` は複数の IP CIDR 範囲が含まれるリストであることに注意してください。

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks:
       - Cidrs: [RemoteNodeCIDR]
     RemotePodNetworks:
       - Cidrs: [RemotePodCIDR]
   ```

1. 「[ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md)」に進みます。

### 既存のクラスターで EKS Hybrid Nodes を有効にする - AWS CLI
<a name="hybrid-nodes-cluster-enable-cli"></a>

1. EKS クラスターの EKS Hybrid Nodes に使用する `RemoteNetworkConfig` を有効にするには、以下のコマンドを実行します。コマンドを実行する前に、以下を自分の設定に置き換えます。全設定のリストについては、「*Amazon EKS API リファレンス*」の「[UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)」を参照してください。

   1.  `CLUSTER_NAME`: 更新する EKS クラスターの名前。

   1.  `AWS_REGION`: EKS クラスターが実行されている AWS リージョン。

   1.  `REMOTE_NODE_CIDRS`: ハイブリッドノードのオンプレミスノード CIDR。

   1.  `REMOTE_POD_CIDRS` (オプション): ハイブリッドノードで実行されているワークロードのオンプレミスポッド CIDR

      ```
      aws eks update-cluster-config \
          --name CLUSTER_NAME \
          --region AWS_REGION \
          --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["REMOTE_POD_CIDRS"]}]}'
      ```

1. クラスターの更新には数分かかります。クラスターのステータスのクエリを実行するには次のコマンドを使用します。`CLUSTER_NAME` は変更するクラスターの名前に、`AWS_REGION` はクラスターが稼働している AWS リージョンに置き換えてください。出力が「`ACTIVE`」を返すまで、次のステップに進まないでください。

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

1. 「[ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md)」に進みます。

### 既存のクラスターで EKS Hybrid Nodes を有効にする - AWS マネジメントコンソール
<a name="hybrid-nodes-cluster-enable-console"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)で Amazon EKS コンソールを開きます。

1. クラスター名を選択すると、そのクラスターの情報を表示されます。

1. **[ネットワーキング]** タブを開き、**[管理]** 選択します。

1. ドロップダウンで、**[リモートネットワーク]** を選択します。

1.  **[リモートネットワークを設定してハイブリッドノードを有効にする]** を選択し、ハイブリッドノードのオンプレミスノードとポッド CIDR を指定します。

1. [**変更を保存**] を選択して終了します。クラスターのステータスが **[アクティブ]** に戻るまで待ちます。

1. 「[ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md)」に進みます。

## 既存のクラスターでハイブリッドノード設定を更新する
<a name="hybrid-nodes-cluster-update-config"></a>

既存のハイブリッドクラスターで `remoteNetworkConfig` を変更するには、以下のいずれかを使用します。
+  [AWS CloudFormation](#hybrid-nodes-cluster-update-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-update-cli) 
+  [AWS マネジメントコンソール](#hybrid-nodes-cluster-update-console) 

### 既存のクラスターでハイブリッド設定を更新する - AWS CloudFormation
<a name="hybrid-nodes-cluster-update-cfn"></a>

1. CloudFormation テンプレートを新しいネットワーク CIDR 値で更新します。

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks:
       - Cidrs: [NEW_REMOTE_NODE_CIDRS]
     RemotePodNetworks:
       - Cidrs: [NEW_REMOTE_POD_CIDRS]
   ```
**注記**  
`RemoteNodeNetworks` または `RemotePodNetworks` の CIDR リストを更新するときは、すべての CIDR (新規と既存) を含めます。更新中には、リスト全体が置き換えられます。更新リクエストでこれらのフィールドを省略すると、既存の設定が保持されます。

1. 変更したテンプレートで CloudFormation スタックを更新し、スタックの更新が完了するまで待ちます。

### 既存のクラスターでハイブリッド設定を更新する - AWS CLI
<a name="hybrid-nodes-cluster-update-cli"></a>

1. リモートネットワークの CIDR を変更するには、次のコマンドを実行します。値をご自身の設定に置き換えます。

   ```
   aws eks update-cluster-config
   --name CLUSTER_NAME
   --region AWS_REGION
   --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["NEW_REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["NEW_REMOTE_POD_CIDRS"]}]}'
   ```
**注記**  
`remoteNodeNetworks` または `remotePodNetworks` の CIDR リストを更新するときは、すべての CIDR (新規と既存) を含めます。更新中には、リスト全体が置き換えられます。更新リクエストでこれらのフィールドを省略すると、既存の設定が保持されます。

1. クラスターのステータスが [アクティブ] に戻るまで待ち、次に進みます。

### 既存のクラスターでハイブリッド設定を更新する - AWS マネジメントコンソール
<a name="hybrid-nodes-cluster-update-console"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)で Amazon EKS コンソールを開きます。

1. クラスター名を選択すると、そのクラスターの情報を表示されます。

1. **[ネットワーキング]** タブを開き、**[管理]** 選択します。

1. ドロップダウンで、**[リモートネットワーク]** を選択します。

1. 必要に応じて、`Remote node networks` と `Remote pod networks - Optional` の CIDR を更新します。

1. **[変更の保存]** を選択し、クラスターのステータスが **[アクティブ]** に戻るのを待ちます。

## 既存のクラスターで Hybrid Nodes を無効にする
<a name="hybrid-nodes-cluster-disable"></a>

既存のクラスターで EKS Hybrid Nodes を無効にするには、以下を使用します。
+  [AWS CloudFormation](#hybrid-nodes-cluster-disable-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-disable-cli) 
+  [AWS マネジメントコンソール](#hybrid-nodes-cluster-disable-console) 

### 既存のクラスターで EKS Hybrid Nodes を無効にする - AWS CloudFormation
<a name="hybrid-nodes-cluster-disable-cfn"></a>

1. クラスターで EKS Hybrid Nodes を無効にするには、`RemoteNodeNetworks` と `RemotePodNetworks` を CloudFormation テンプレートの空の配列に設定して、スタックを更新します。

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks: []
     RemotePodNetworks: []
   ```

### 既存のクラスターで EKS Hybrid Nodes を無効にする - AWS CLI
<a name="hybrid-nodes-cluster-disable-cli"></a>

1. クラスターから `RemoteNetworkConfig` を削除するには、以下のコマンドを実行します。コマンドを実行する前に、以下を自分の設定に置き換えます。全設定のリストについては、「*Amazon EKS API リファレンス*」の「[UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)」を参照してください。

   1.  `CLUSTER_NAME`: 更新する EKS クラスターの名前。

   1.  `AWS_REGION`: EKS クラスターが実行されている AWS リージョン。

      ```
      aws eks update-cluster-config \
          --name CLUSTER_NAME \
          --region AWS_REGION \
          --remote-network-config '{"remoteNodeNetworks":[],"remotePodNetworks":[]}'
      ```

1. クラスターの更新には数分かかります。クラスターのステータスのクエリを実行するには次のコマンドを使用します。`CLUSTER_NAME` は変更するクラスターの名前に、`AWS_REGION` はクラスターが稼働している AWS リージョンに置き換えてください。出力が「`ACTIVE`」を返すまで、次のステップに進まないでください。

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

### 既存のクラスターで EKS Hybrid Nodes を無効にする - AWS マネジメントコンソール
<a name="hybrid-nodes-cluster-disable-console"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)で Amazon EKS コンソールを開きます。

1. クラスター名を選択すると、そのクラスターの情報を表示されます。

1. **[ネットワーキング]** タブを開き、**[管理]** 選択します。

1. ドロップダウンで、**[リモートネットワーク]** を選択します。

1. **[リモートネットワークを設定してハイブリッドノードを有効にする]** を選択して、`Remote node networks` と `Remote pod networks - Optional` のすべての CIDR を削除します。

1. [**変更を保存**] を選択して終了します。クラスターのステータスが **[アクティブ]** に戻るまで待ちます。

# ハイブリッドノードのクラスターアクセスを準備する
<a name="hybrid-nodes-cluster-prep"></a>

ハイブリッドノードを Amazon EKS クラスターに接続するには、クラスターに参加するために Kubernetes のアクセス許可を持つハイブリッドノードの IAM ロールを有効にする必要があります。ハイブリッドノードの IAM ロールの作成方法については、「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。Amazon EKS は、IAM プリンシパルを Kubernetes ロールベースアクセスコントロール (RBAC) に関連付ける方法として、Amazon EKS アクセスエントリと `aws-auth` ConfigMap の 2 つをサポートしています。Amazon EKS アクセス管理の詳細については、「[IAM ユーザーおよびロールに Kubernetes API へのアクセスを付与する](grant-k8s-access.md)」を参照してください。

以下の手順を使用して、ハイブリッドノードの IAM ロールを Kubernetes のアクセス許可に関連付けます。Amazon EKS のアクセスエントリを使用するには、クラスターが `API` または `API_AND_CONFIG_MAP` 認証モードで作成されている必要があります。`aws-auth` ConfigMap を使用するには、クラスターが `API_AND_CONFIG_MAP` 認証モードで作成されている必要があります。`CONFIG_MAP` のみの認証モードは、ハイブリッドノードが有効な Amazon EKS クラスターではサポートされていません。

## ハイブリッドノードの IAM ロールに Amazon EKS のアクセスエントリを使用する
<a name="_using_amazon_eks_access_entries_for_hybrid_nodes_iam_role"></a>

IAM ロールと組み合わせて使用できる、HYBRID\$1LINUX というハイブリッドノード用 Amazon EKS アクセスエントリタイプがあります。このアクセスエントリタイプでは、ユーザー名は自動的に system:node:\$1\$1SessionName\$1\$1 に設定されます。アクセスエントリの作成の詳細については、「[アクセスエントリを作成する](creating-access-entries.md)」を参照してください。

### AWS CLI
<a name="shared_aws_cli"></a>

1. デバイスに最新バージョンの AWS CLI をインストールし、設定しておく必要があります。現在のバージョンを確認するには「`aws --version`」を参照してください。yum、apt-get、macOS 用の Homebrew などのパッケージマネージャーは、多くの場合 AWS CLI の最新バージョンより数バージョン古くなっています。最新バージョンをインストールするには、「AWS コマンドラインインターフェイスユーザーガイド」の「インストール」および「aws configure を使用したクイック設定」を参照してください。

1. 以下のコマンドを使用してアクセスエントリーを作成します。CLUSTER\$1NAME をお使いのクラスターの名前に、HYBRID\$1NODES\$1ROLE\$1ARN を [ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md) のステップで作成したロールの ARN に置き換えます。

   ```
   aws eks create-access-entry --cluster-name CLUSTER_NAME \
       --principal-arn HYBRID_NODES_ROLE_ARN \
       --type HYBRID_LINUX
   ```

### AWS マネジメントコンソール
<a name="hybrid-nodes-cluster-prep-console"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)で Amazon EKS コンソールを開きます。

1. ハイブリッドノードが有効なクラスターの名前を選択します。

1. **[リモートアクセス]** タブを選択してください。

1. **[アクセスエントリの作成]** を選択してください。

1. **[IAM プリンシパル]** には、「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」のステップで作成したハイブリッドノードの IAM ロールを選択します。

1. **[タイプ]** には **Hybrid Linux** を選択します。

1. (オプション) **[タグ]** ではアクセスエントリにラベルを割り当てます。例えば、同じタグを持つすべてのリソースを検索しやすくするためです。

1. **[レビューと作成にスキップ]** を選択します。Hybrid Linux のアクセスエントリにポリシーを追加することや、アクセス範囲を変更することはできません。

1. アクセスエントリの設定を確認してください。何かが正しくないと思われる場合は**[戻る]** を選択してステップに戻り、エラーを修正します。設定が正しければ、**[作成]** を選択してください。

## ハイブリッドノードの IAM ロールに aws-auth ConfigMap を使用する
<a name="_using_aws_auth_configmap_for_hybrid_nodes_iam_role"></a>

以下のステップでは、[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md) のステップで作成したハイブリッドノード IAM ロールの ARN を使用して、`aws-auth` ConfigMap を作成または更新します。

1. クラスターに既存の `aws-auth` ConfigMap があるかどうかを確認します。特定の `kubeconfig` ファイルを使用している場合は、`--kubeconfig` フラグを使用してください。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. `aws-auth` ConfigMap が表示されている場合は、必要に応じて更新してください。

   1. ConfigMap を編集用に開きます。

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 必要に応じて新しい `mapRoles` エントリを追加します。`HYBRID_NODES_ROLE_ARN` をハイブリッドノード IAM ロールの ARN に置き換えます。なお、`{{SessionName}}` は ConfigMap に保存するための正しいテンプレート形式です。他の値には置き換えないでください。

      ```
      data:
        mapRoles: |
        - groups:
          - system:bootstrappers
          - system:nodes
          rolearn: HYBRID_NODES_ROLE_ARN
          username: system:node:{{SessionName}}
      ```

   1. ファイルを保存し、テキストエディタを終了します。

1. クラスターに既存の `aws-auth` ConfigMap がない場合は、以下のコマンドを使用して作成します。`HYBRID_NODES_ROLE_ARN` をハイブリッドノード IAM ロールの ARN に置き換えます。なお、`{{SessionName}}` は ConfigMap に保存するための正しいテンプレート形式です。他の値には置き換えないでください。

   ```
   kubectl apply -f=/dev/stdin <<-EOF
   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: aws-auth
     namespace: kube-system
   data:
     mapRoles: |
     - groups:
       - system:bootstrappers
       - system:nodes
       rolearn: HYBRID_NODES_ROLE_ARN
       username: system:node:{{SessionName}}
   EOF
   ```

# ハイブリッドノードでオンプレミスのワークロードを実行する
<a name="hybrid-nodes-tutorial"></a>

ハイブリッドノードが有効になっている EKS クラスターではAWS クラウドで使用するのと同じ Amazon EKS クラスター、機能、ツールを使用して、独自のインフラストラクチャでオンプレミスおよびエッジアプリケーションを実行できます。

以下のセクションではハイブリッドノードを使用するためのステップバイステップの手順について説明します。

**Topics**
+ [ハイブリッドノードを接続する](hybrid-nodes-join.md)
+ [Bottlerocket を実行しているハイブリッドノードの接続](hybrid-nodes-bottlerocket.md)
+ [ハイブリッドノードをアップグレードする](hybrid-nodes-upgrade.md)
+ [ハイブリッドノードへのパッチの適用](hybrid-nodes-security.md)
+ [ハイブリッドノードを削除する](hybrid-nodes-remove.md)

# ハイブリッドノードを接続する
<a name="hybrid-nodes-join"></a>

**注記**  
次の手順は、互換性のあるオペレーティングシステム (Bottlerocket を除く) を実行しているハイブリッドノードに適用されます。Bottlerocket を実行するハイブリッドノードを接続する手順については、「[Bottlerocket を実行しているハイブリッドノードの接続](hybrid-nodes-bottlerocket.md)」を参照してください。

このトピックでは、ハイブリッドノードを Amazon EKS クラスターに接続する方法について説明します。ハイブリッドノードがクラスターに参加すると、Amazon EKS コンソールと kubectl などの Kubernetes 互換ツールに準備中ステータスが表示されます。このページのステップを完了したら、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」に進み、ハイブリッドノードでアプリケーションを実行する準備をします。

## 前提条件
<a name="_prerequisites"></a>

ハイブリッドノードを Amazon EKS クラスターに接続する前に、前提条件の手順が完了していることを確認してください。
+ オンプレミス環境から Amazon EKS クラスターをホストする AWS リージョンへのネットワーク接続があること。詳細については「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。
+ ハイブリッドノード用の互換性のあるオペレーティングシステムがオンプレミスホストにインストールされていること。詳細については「[ハイブリッドノード用のオペレーティングシステムを準備する](hybrid-nodes-os.md)」を参照してください。
+ ハイブリッドノードの IAM ロールを作成し、オンプレミス認証情報プロバイダー (AWS Systems Manager ハイブリッドアクティベーションまたは AWS IAM Roles Anywhere) をセットアップしていること。詳細については「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。
+ ハイブリッドノード対応の Amazon EKS クラスターを作成していること。詳細については「[ハイブリッドノードを使用して Amazon EKS クラスターを作成する](hybrid-nodes-cluster-create.md)」を参照してください。
+ ハイブリッドノードの IAM ロールを、Kubernetes ロールベースのアクセスコントロール (RBAC) のアクセス許可に関連付けていること。詳細については「[ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md)」を参照してください。

## ステップ 1: ハイブリッドノード CLI (`nodeadm`) を各オンプレミスホストにインストールする
<a name="_step_1_install_the_hybrid_nodes_cli_nodeadm_on_each_on_premises_host"></a>

構築済みのオペレーティングシステムイメージに Amazon EKS Hybrid Nodes CLI (`nodeadm`) を含める場合は、このステップをスキップできます。`nodeadm` のハイブリッドノード版の詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

`nodeadm` のハイブリッドノード版は、Amazon CloudFront をフロントに置いた Amazon S3 でホストされます。各オンプレミスホストに `nodeadm` をインストールするにはオンプレミスホストから以下のコマンドを実行してください。

 **x86\$164 ホストの場合:** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/amd64/nodeadm'
```

 **ARM ホストの場合** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/arm64/nodeadm'
```

各ホストでダウンロードしたバイナリに実行可能ファイルのアクセス許可を追加します。

```
chmod +x nodeadm
```

## ステップ 2: `nodeadm` を使用してハイブリッドノードの依存関係をインストールする
<a name="_step_2_install_the_hybrid_nodes_dependencies_with_nodeadm"></a>

構築済みのオペレーティングシステムイメージにハイブリッドノードの依存関係をインストールする場合は、このステップをスキップできます。`nodeadm install` コマンドを使用して、ハイブリッドノードに必要なすべての依存関係をインストールできます。ハイブリッドノードの依存関係には、containerd、kubelet、kubectl、AWS SSM または AWS IAM Roles Anywhere コンポーネントが含まれます。`nodeadm install` によってインストールされるコンポーネントとファイルの場所の詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。オンプレミスファイアウォールで `nodeadm install` プロセスのために許可する必要があるドメインの詳細については、「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。

以下のコマンドを実行して、ハイブリッドノードの依存関係をオンプレミスホストにインストールします。以下のコマンドは、ホストで sudo/root アクセスを持つユーザーで実行する必要があります。

**重要**  
ハイブリッドノードの CLI (`nodeadm`) は、ホストで sudo/root アクセスを持つユーザーで実行する必要があります。
+ `K8S_VERSION` を、`1.31` などの Amazon EKS クラスターの Kubernetes マイナーバージョンに置き換えます。サポートされている Kubernetes のバージョンのリストについては、「[Amazon EKS supported versions](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)」を参照してください。
+ `CREDS_PROVIDER` を、使用しているオンプレミスの認証情報プロバイダーに置き換えます。有効な値は、AWS SSM の場合は `ssm`、AWS IAM Roles Anywhere の場合は `iam-ra` です。

```
nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER
```

## ステップ 3: ハイブリッドノードをクラスターに接続する
<a name="_step_3_connect_hybrid_nodes_to_your_cluster"></a>

ハイブリッドノードをクラスターに接続する前に、Amazon EKS コントロールプレーンとハイブリッドノード間の通信のために、オンプレミスファイアウォールとクラスターのセキュリティグループで必要なアクセスを許可していることを確認してください。このステップのほとんどの問題は、ファイアウォール設定、セキュリティグループ設定、またはハイブリッドノードの IAM ロール設定に関連しています。

**重要**  
ハイブリッドノードの CLI (`nodeadm`) は、ホストで sudo/root アクセスを持つユーザーで実行する必要があります。

1. デプロイの値を使用して、各ホストに `nodeConfig.yaml` ファイルを作成します。使用可能な構成設定の詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。ハイブリッドノードの IAM ロールに `eks:DescribeCluster` アクションのアクセス許可がない場合は、`nodeConfig.yaml` のクラスターセクションで Kubernetes API エンドポイント、クラスター CA バンドル、および Kubernetes サービス IPv4 CIDR を渡す必要があります。

   1. オンプレミス認証情報プロバイダーに AWS SSM ハイブリッドアクティベーションを使用している場合は、以下の `nodeConfig.yaml` の例を使用します。

      1. `CLUSTER_NAME` を自分のクラスター名に置き換えます。

      1. `AWS_REGION` を、クラスターがホストされている AWS リージョンに置き換えます。例えば、`us-west-2`。

      1. `ACTIVATION_CODE` を、AWS SSM ハイブリッドアクティベーションの作成時に受け取ったアクティベーションコードに置き換えます。詳細については「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。

      1. `ACTIVATION_ID` を、AWS SSM ハイブリッドアクティベーションの作成時に受け取ったアクティベーション ID に置き換えます。この情報は、AWS Systems Manager コンソールまたは AWS CLI `aws ssm describe-activations` コマンドから取得できます。

         ```
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
           cluster:
             name: CLUSTER_NAME
             region: AWS_REGION
           hybrid:
             ssm:
               activationCode: ACTIVATION_CODE
               activationId: ACTIVATION_ID
         ```

   1. オンプレミス認証情報プロバイダーに AWS IAM Roles Anywhere を使用している場合は、以下の `nodeConfig.yaml` の例を使用します。

      1. `CLUSTER_NAME` を自分のクラスター名に置き換えます。

      1. `AWS_REGION` を、クラスターがホストされている AWS リージョンに置き換えます。例えば、`us-west-2`。

      1. `NODE_NAME` をノードの名前に置き換えます。ハイブリッドノードの IAM ロールの信頼ポリシーを `"sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}"` リソース条件で設定した場合、ノード名はホスト上の証明書の CN と一致する必要があります。使用する `nodeName` は 64 文字以下にする必要があります。

      1. `TRUST_ANCHOR_ARN` を、ハイブリッドノードの認証情報を準備する手順で設定したトラストアンカーの ARN に置き換えます。

      1. `PROFILE_ARN` を、[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md) のステップで設定したトラストアンカーの ARN に置き換えます。

      1. `ROLE_ARN` をハイブリッドノード IAM ロールの ARN に置き換えます。

      1. `CERTIFICATE_PATH` をノード証明書へのディスク内のパスに置き換えます。指定しなかった場合、デフォルトは `/etc/iam/pki/server.pem` です。

      1. `KEY_PATH` を、証明書のプライベートキーへのディスク内のパスに置き換えます。指定しなかった場合、デフォルトは `/etc/iam/pki/server.key` です。

         ```
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
           cluster:
             name: CLUSTER_NAME
             region: AWS_REGION
           hybrid:
             iamRolesAnywhere:
               nodeName: NODE_NAME
               trustAnchorArn: TRUST_ANCHOR_ARN
               profileArn: PROFILE_ARN
               roleArn: ROLE_ARN
               certificatePath: CERTIFICATE_PATH
               privateKeyPath: KEY_PATH
         ```

1. `nodeConfig.yaml` で `nodeadm init` コマンドを実行して、ハイブリッドノードを Amazon EKS クラスターに接続します。

   ```
   nodeadm init -c file://nodeConfig.yaml
   ```

上記のコマンドが正常に完了すれば、ハイブリッドノードは Amazon EKS クラスターに参加したことになります。これは、Amazon EKS コンソールでクラスターの [コンピューティング] タブに移動する ([IAM プリンシパルに表示権限があることを確認してください](view-kubernetes-resources.md#view-kubernetes-resources-permissions)) か、または `kubectl get nodes` を使用して確認できます。

**重要**  
ノードのステータスは `Not Ready` になります。これは、ハイブリッドノードで実行されている CNI がないことが原因であり、予想通りのことです。ノードがクラスターに参加しなかった場合は、「[ハイブリッドノードのトラブルシューティング](hybrid-nodes-troubleshooting.md)」を参照してください。

## ステップ 4: ハイブリッドノードの CNI を設定する
<a name="_step_4_configure_a_cni_for_hybrid_nodes"></a>

ハイブリッドノードでアプリケーションを実行する準備を整えるには、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に進みます。

# Bottlerocket を実行しているハイブリッドノードの接続
<a name="hybrid-nodes-bottlerocket"></a>

このトピックでは、Bottlerocket を実行しているハイブリッドノードを Amazon EKS クラスターに接続する方法について解説します。[Bottlerocket](https://aws.amazon.com/bottlerocket/) は、AWS が支援およびサポートしているオープンソースの Linux ディストリビューションです。Bottlerocket は、コンテナワークロードをホストするために専用に構築されています。Bottlerocket を使用すると、コンテナインフラストラクチャの更新を自動化することで、コンテナ化されたデプロイの可用性を向上させ、運用コストを削減できます。Bottlerocket には、コンテナの実行に不可欠なソフトウェアのみが含まれており、リソース使用率の向上、セキュリティ上の脅威の軽減、管理オーバーヘッドの軽減が実現されます。

EKS Hybrid Nodes でサポートされているのは、Bottlerocket のバージョンが v1.37.0 以降である VMware のバリアントのみです。Bottlerocket の VMware のバリアントは、Kubernetes のバージョン v1.28 以降で使用できます。これらのバリアント OS イメージには、kubelet、containerd、aws-iam-authenticator、ならびに EKS Hybrid Nodes のその他のソフトウェアの前提条件、が含まれています。これらのコンポーネントは、Bottlerocket のブートストラップと管理コンテナ向けの、base64 でエンコードされたユーザーデータを含む、Bottlerocket の[設定](https://github.com/bottlerocket-os/bottlerocket#settings)ファイルを使用して設定できます。これらを設定することで、Bottlerocket は、ハイブリッドノードの認証情報プロバイダーを使用して、クラスターのハイブリッドノードを認証できるようになります。ハイブリッドノードをクラスターに追加すると、Amazon EKS コンソールや Kubernetes 互換ツール (`kubectl` など) にそれらのステータスが `Not Ready` と表示されます。このページのステップを完了したら、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」に進み、ハイブリッドノードでアプリケーションを実行する準備をします。

## 前提条件
<a name="_prerequisites"></a>

ハイブリッドノードを Amazon EKS クラスターに接続する前に、前提条件の手順が完了していることを確認してください。
+ オンプレミス環境から Amazon EKS クラスターをホストする AWS リージョンへのネットワーク接続があること。詳細については「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。
+ ハイブリッドノードの IAM ロールを作成し、オンプレミス認証情報プロバイダー (AWS Systems Manager ハイブリッドアクティベーションまたは AWS IAM Roles Anywhere) をセットアップしていること。詳細については「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。
+ ハイブリッドノード対応の Amazon EKS クラスターを作成していること。詳細については「[ハイブリッドノードを使用して Amazon EKS クラスターを作成する](hybrid-nodes-cluster-create.md)」を参照してください。
+ ハイブリッドノードの IAM ロールを、Kubernetes ロールベースのアクセスコントロール (RBAC) のアクセス許可に関連付けていること。詳細については「[ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md)」を参照してください。

## ステップ 1: Bottlerocket 設定の TOML ファイルを作成する
<a name="_step_1_create_the_bottlerocket_settings_toml_file"></a>

ハイブリッドノード用に Bottlerocket を設定するには、`settings.toml` ファイルを必要とする設定で作成する必要があります。TOML ファイルのコンテンツは、使用している認証情報プロバイダー (SSM または IAM Roles Anywhere) に応じて異なります。このファイルは、Bottlerocket インスタンスをプロビジョニングするときに、ユーザーデータとして渡されます。

**注記**  
以下に示す TOML ファイルは、Bottlerocket VMWare マシンを EKS クラスターのノードとして初期化するために必要な最小設定のみを示しています。Bottlerocket にはさまざまなユースケースに対応する幅広い設定が用意されているため、ハイブリッドノードの初期化以外の設定オプションについては、使用している Bottlerocket バージョンに関して文書化されているすべての設定の包括的なリストが記載されている [Bottlerocket ドキュメント](https://bottlerocket.dev/en)を参照してください (例: Bottlerocket 1.51.x で使用できるすべての設定は[次のとおりです](https://bottlerocket.dev/en/os/1.51.x/api/settings-index))。

### SSM
<a name="_ssm"></a>

AWS Systems Manager を認証情報プロバイダーとして使用している場合は、コンテンツを次のようにして `settings.toml` ファイルを作成します。

```
[settings.kubernetes]
cluster-name = "<cluster-name>"
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
hostname-override = "<hostname>"
provider-id = "eks-hybrid:///<region>/<cluster-name>/<hostname>"
authentication-mode = "aws"
cloud-provider = ""
server-tls-bootstrap = true

[settings.network]
hostname = "<hostname>"

[settings.aws]
region = "<region>"

[settings.kubernetes.credential-providers.ecr-credential-provider]
enabled = true
cache-duration = "12h"
image-patterns = [
    "*.dkr.ecr.*.amazonaws.com",
    "*.dkr.ecr.*.amazonaws.com.rproxy.goskope.com.cn",
    "*.dkr.ecr.*.amazonaws.eu",
    "*.dkr.ecr-fips.*.amazonaws.com",
    "*.dkr.ecr-fips.*.amazonaws.eu",
    "public.ecr.aws"
]

[settings.kubernetes.node-labels]
"eks.amazonaws.com/compute-type" = "hybrid"
"eks.amazonaws.com/hybrid-credential-provider" = "ssm"

[settings.host-containers.admin]
enabled = true
user-data = "<base64-encoded-admin-container-userdata>"

[settings.bootstrap-containers.eks-hybrid-setup]
mode = "always"
user-data = "<base64-encoded-bootstrap-container-userdata>"

[settings.host-containers.control]
enabled = true
```

プレースホルダを次の値に置き換えます。
+  `<cluster-name>`: Amazon EKS クラスターの名前
+  `<api-server-endpoint>`: クラスターの API サーバーエンドポイント
+  `<cluster-certificate-authority>`: クラスターの base64 エンコードされた CA バンドル
+  `<region>`: クラスターをホストしている AWS リージョン。例: "us-east-1"
+  `<hostname>`: Bottlerocket インスタンスのホスト名。これはノード名としても設定されます。こちらは任意の一意の値にすることができますが、[Kubernetes オブジェクトの命名規則](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names)に従う必要があります。さらに、使用するホスト名は 64 文字以下にする必要があります。注: SSM プロバイダーを使用する場合、このホスト名とノード名は、インスタンスが SSM に登録された後、マネージドインスタンス ID (`mi-*` ID など) に置き換えられます。
+  `<base64-encoded-admin-container-userdata>`: Bottlerocket 管理コンテナの設定の、base64 でエンコードされたコンテンツ。管理コンテナを有効にすると、SSH を使用して Bottlerocket インスタンスに接続し、システムの探索やデバッグを行えるようになります。これは必須の設定ではありませんが、トラブルシューティングを容易にするため有効にしておくことが推奨されます。管理コンテナを使用した認証の詳細については [Bottlerocket 管理コンテナのドキュメント](https://github.com/bottlerocket-os/bottlerocket-admin-container#authenticating-with-the-admin-container)を参照してください。管理者コンテナは、以下の例に示すように、SSH ユーザーとキーの入力を JSON 形式で受け取ります。

```
{
  "user": "<ssh-user>",
  "ssh": {
    "authorized-keys": [
      "<ssh-authorized-key>"
    ]
  }
}
```
+  `<base64-encoded-bootstrap-container-userdata>`: Bottlerocket ブートストラップコンテナの設定の、base64 でエンコードされたコンテンツ。設定の詳細については [Bottlerocket ブートストラップコンテナのドキュメント](https://github.com/bottlerocket-os/bottlerocket-bootstrap-container)を参照してください。ブートストラップコンテナは、インスタンスを AWS SSM マネージドインスタンスとして登録し、これを Amazon EKS クラスターの Kubernetes ノードとして結合する役割を果たします。ブートストラップコンテナに渡されるユーザーデータは、以前に作成した SSM ハイブリッドアクティベーションコードと ID を入力として受け入れる、コマンド呼び出しの形式をとります。

```
eks-hybrid-ssm-setup --activation-id=<activation-id> --activation-code=<activation-code> --region=<region>
```

### IAM Roles Anywhere
<a name="_iam_roles_anywhere"></a>

AWS IAM Roles Anywhere を認証情報プロバイダーとして使用している場合は、コンテンツを次のようにして `settings.toml` ファイルを作成します。

```
[settings.kubernetes]
cluster-name = "<cluster-name>"
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
hostname-override = "<hostname>"
provider-id = "eks-hybrid:///<region>/<cluster-name>/<hostname>"
authentication-mode = "aws"
cloud-provider = ""
server-tls-bootstrap = true

[settings.network]
hostname = "<hostname>"

[settings.aws]
region = "<region>"
config = "<base64-encoded-aws-config-file>"

[settings.kubernetes.credential-providers.ecr-credential-provider]
enabled = true
cache-duration = "12h"
image-patterns = [
    "*.dkr.ecr.*.amazonaws.com",
    "*.dkr.ecr.*.amazonaws.com.rproxy.goskope.com.cn",
    "*.dkr.ecr.*.amazonaws.eu",
    "*.dkr.ecr-fips.*.amazonaws.com",
    "*.dkr.ecr-fips.*.amazonaws.eu",
    "public.ecr.aws"
]

[settings.kubernetes.node-labels]
"eks.amazonaws.com/compute-type" = "hybrid"
"eks.amazonaws.com/hybrid-credential-provider" = "iam-ra"

[settings.host-containers.admin]
enabled = true
user-data = "<base64-encoded-admin-container-userdata>"

[settings.bootstrap-containers.eks-hybrid-setup]
mode = "always"
user-data = "<base64-encoded-bootstrap-container-userdata>"
```

プレースホルダを次の値に置き換えます。
+  `<cluster-name>`: Amazon EKS クラスターの名前
+  `<api-server-endpoint>`: クラスターの API サーバーエンドポイント
+  `<cluster-certificate-authority>`: クラスターの base64 エンコードされた CA バンドル
+  `<region>`: クラスターをホストしている AWS リージョン。例: "us-east-1"
+  `<hostname>`: Bottlerocket インスタンスのホスト名。これはノード名としても設定されます。こちらは任意の一意の値にすることができますが、[Kubernetes オブジェクトの命名規則](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names)に従う必要があります。さらに、使用するホスト名は 64 文字以下にする必要があります。注: IAM-RA プロバイダーを使用しているときは、ノード名は、ハイブリッドノードの IAM ロールの信頼ポリシーを `"sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}"` リソース条件で設定した場合にホストの証明書の CN と一致している必要があります。
+  `<base64-encoded-aws-config-file>`: AWS 設定ファイルの base64 でエンコードされたコンテンツ。ファイルのコンテンツは以下のようになるはずです。

```
[default]
credential_process = aws_signing_helper credential-process --certificate /root/.aws/node.crt --private-key /root/.aws/node.key --profile-arn <profile-arn> --role-arn <role-arn> --trust-anchor-arn <trust-anchor-arn> --role-session-name <role-session-name>
```
+  `<base64-encoded-admin-container-userdata>`: Bottlerocket 管理コンテナの設定の、base64 でエンコードされたコンテンツ。管理コンテナを有効にすると、SSH を使用して Bottlerocket インスタンスに接続し、システムの探索やデバッグを行えるようになります。これは必須の設定ではありませんが、トラブルシューティングを容易にするため有効にしておくことが推奨されます。管理コンテナを使用した認証の詳細については [Bottlerocket 管理コンテナのドキュメント](https://github.com/bottlerocket-os/bottlerocket-admin-container#authenticating-with-the-admin-container)を参照してください。管理者コンテナは、以下の例に示すように、SSH ユーザーとキーの入力を JSON 形式で受け取ります。

```
{
  "user": "<ssh-user>",
  "ssh": {
    "authorized-keys": [
      "<ssh-authorized-key>"
    ]
  }
}
```
+  `<base64-encoded-bootstrap-container-userdata>`: Bottlerocket ブートストラップコンテナの設定の、base64 でエンコードされたコンテンツ。設定の詳細については [Bottlerocket ブートストラップコンテナのドキュメント](https://github.com/bottlerocket-os/bottlerocket-bootstrap-container)を参照してください。ブートストラップコンテナは、インスタンスに IAM Roles Anywhere ホスト証明書と証明書プライベートキーファイルを作成する役割を果たします。これらはその後、Amazon EKS クラスターで認証を行うときに、一時的な認証情報を取得するために `aws_signing_helper` が使用します。ブートストラップコンテナに渡されるユーザーデータは、以前に作成した証明書とプライベートキーのコンテンツを入力として受け入れる、コマンド呼び出しの形式をとります。

```
eks-hybrid-iam-ra-setup --certificate=<certificate> --key=<private-key>
```

## ステップ 2: ユーザーデータを使用して Bottlerocket vSphere VM をプロビジョニングする
<a name="_step_2_provision_the_bottlerocket_vsphere_vm_with_user_data"></a>

TOML ファイルを作成したら、vSphere VM の作成時にこれをユーザーデータとして渡します。ユーザーデータは VM の電源を初めて入れる前に設定しておく必要があることを忘れないでください。そのため、インスタンスの作成時にこれを指定しておく必要があります。または、VM を事前に作成する場合は、ユーザーデータを設定するまで VM のステータスを poweredOff にしておく必要があります。`govc` CLI を使用する場合の例を以下に示します。

### VM を初めて作成する
<a name="_creating_vm_for_the_first_time"></a>

```
govc vm.create \
  -on=true \
  -c=2 \
  -m=4096 \
  -net.adapter=<network-adapter> \
  -net=<network-name> \
  -e guestinfo.userdata.encoding="base64" \
  -e guestinfo.userdata="$(base64 -w0 settings.toml)" \
  -template=<template-name> \
  <vm-name>
```

### 既存の VM のユーザーデータを更新する
<a name="_updating_user_data_for_an_existing_vm"></a>

```
govc vm.create \
    -on=false \
    -c=2 \
    -m=4096 \
    -net.adapter=<network-adapter> \
    -net=<network-name> \
    -template=<template-name> \
    <vm-name>

govc vm.change
    -vm <vm-name> \
    -e guestinfo.userdata="$(base64 -w0 settings.toml)" \
    -e guestinfo.userdata.encoding="base64"

govc vm.power -on <vm-name>
```

上記のセクションでは、`-e guestinfo.userdata.encoding="base64"` オプションでユーザーデータが base64 でエンコードされていることを指定します。`-e guestinfo.userdata` オプションは、`settings.toml` ファイルの base64 でエンコードされたコンテンツを、ユーザーデータとして Bottlerocket インスタンスに渡します。プレースホルダーを Bottlerocket OVA テンプレートやネットワークの詳細など特定の値に置き換えます。

## ステップ 3: ハイブリッドノードの接続を検証する
<a name="_step_3_verify_the_hybrid_node_connection"></a>

Bottlerocket インスタンスは、起動すると、Amazon EKS クラスターに結合しようとします。Amazon EKS コンソールでこの接続を検証するには、クラスターの [コンピューティング] タブに移動するか、次のコマンドを実行します。

```
kubectl get nodes
```

**重要**  
ノードのステータスは `Not Ready` になります。これは、ハイブリッドノードで実行されている CNI がないことが原因であり、予想通りのことです。ノードがクラスターに参加しなかった場合は、「[ハイブリッドノードのトラブルシューティング](hybrid-nodes-troubleshooting.md)」を参照してください。

## ステップ 4: ハイブリッドノードの CNI を設定する
<a name="_step_4_configure_a_cni_for_hybrid_nodes"></a>

ハイブリッドノードでアプリケーションを実行する準備を整えるには、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に進みます。

# クラスターのハイブリッドノードをアップグレードする
<a name="hybrid-nodes-upgrade"></a>

ハイブリッドノードのアップグレードに関するガイダンスは、Amazon EC2 で実行されるセルフマネージド Amazon EKS ノードと類似しています。ターゲットの Kubernetes バージョンで新しいハイブリッドノードを作成し、既存のアプリケーションを新しい Kubernetes バージョンのハイブリッドノードに円滑に移行し、古い Kubernetes バージョンのハイブリッドノードをクラスターから削除することが推奨されます。アップグレードを開始する前に、アップグレードに関する「[Amazon EKS ベストプラクティス](https://docs.aws.amazon.com/eks/latest/best-practices/cluster-upgrades.html)」を確認してください。Amazon EKS Hybrid Nodes には、標準サポートや拡張サポートなどの、クラウドノードを持つ Amazon EKS クラスターに対して同じ [Kubernetes バージョン](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)のサポートがあります。

Amazon EKS Hybrid Nodes は、アップストリーム Kubernetes と同じノードの[バージョンスキューポリシー](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew)に従います。Amazon EKS Hybrid Nodes は、Amazon EKS コントロールプレーンよりも新しいバージョンにすることはできません。また、ハイブリッドノードは、Amazon EKS のコントロールプレーンのマイナーバージョンより、最大 3 つ前まで古い Kubernetes のマイナーバージョンである可能性があります。

カットオーバー移行のアップグレード戦略のためにターゲットの Kubernetes バージョンに新しいハイブリッドノードを作成する空き容量がない場合は、代わりに Amazon EKS Hybrid Nodes CLI (`nodeadm`) を使用してハイブリッドノードの Kubernetes バージョンをインプレースでアップグレードできます。

**重要**  
`nodeadm` を使用してインプレースでハイブリッドノードをアップグレードしている場合、古いバージョンの Kubernetes コンポーネントがシャットダウンされ、新しい Kubernetes バージョンコンポーネントがインストールされて起動されるプロセス中に、ノードのダウンタイムが発生します。

## 前提条件
<a name="_prerequisites"></a>

アップグレードする前に、以下の前提条件を満たしていることを確認してください。
+ ハイブリッドノードのアップグレードのターゲット Kubernetes バージョンは、Amazon EKS コントロールプレーンのバージョン以下である必要があります。
+ カットオーバー移行のアップグレード戦略に従う場合、ターゲット Kubernetes バージョンにインストールする新しいハイブリッドノードは、[ハイブリッドノードの前提条件のセットアップ](hybrid-nodes-prereqs.md) 要件を満たしている必要があります。この要件には、Amazon EKS クラスターの作成時に渡した Remote Node Network CIDR 内に IP アドレスがあることが含まれます。
+ カットオーバー移行とインプレースアップグレードの両方について、ハイブリッドノードは、ハイブリッドノードの依存関係の新しいバージョンを取得するために[必要なドメイン](hybrid-nodes-networking.md#hybrid-nodes-networking-on-prem)にアクセスできる必要があります。
+ Amazon EKS Kubernetes API エンドポイントとのやり取りに使用するローカルマシンまたはインスタンスに kubectl をインストールしてる必要があります。
+ CNI のバージョンは、アップグレード先の Kubernetes バージョンをサポートしている必要があります。そうでない場合は、ハイブリッドノードをアップグレードする前に CNI バージョンをアップグレードします。詳細については「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」を参照してください。

## カットオーバー移行 (Blue/Green) アップグレード
<a name="hybrid-nodes-upgrade-cutover"></a>

 *カットオーバー移行のアップグレード*とは、ターゲット Kubernetes バージョンを使用して新しいホストに新しいハイブリッドノードを作成し、既存のアプリケーションをターゲット Kubernetes バージョンの新しいハイブリッドノードに円滑に移行し、クラスターから古い Kubernetes のバージョンのハイブリッドノードを削除するプロセスを指します。この戦略は Blue/Green 移行とも呼ばれます。

1. [ハイブリッドノードを接続する](hybrid-nodes-join.md) 手順に従って、新しいホストをハイブリッドノードとして接続します。`nodeadm install` コマンドを実行するときは、ターゲット Kubernetes バージョンを使用します。

1. ターゲット Kubernetes バージョンの新しいハイブリッドノードと古い Kubernetes バージョンのハイブリッドノード間の通信を有効にします。この設定により、ターゲット Kubernetes バージョンのハイブリッドノードにワークロードを移行している間に、ポッドが相互に通信できるようになります。

1. ターゲット Kubernetes バージョンのハイブリッドノードがクラスターに正常に参加しており、ステータスが Ready (準備完了) であることを確認します。

1. 以下のコマンドを使用して、削除する各ノードをスケジュール不可としてマークします。これは、置き換えるノード上で新しいポッドがスケジュールまたは再スケジュールされないようにするためです。詳細については、Kubernetes のドキュメントの「[kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/)」を参照してください。`NODE_NAME` を古い Kubernetes バージョンのハイブリッドノードの名前に置き換えます。

   ```
   kubectl cordon NODE_NAME
   ```

   次のコードスニペットを使用して、特定の Kubernetes バージョン (この場合は `1.28`) のすべてのノードを識別して隔離できます。

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Cordoning $node"
       kubectl cordon $node
   done
   ```

1. 現在のデプロイメントで、ハイブリッドノードで実行している CoreDNS レプリカが 2 つ未満の場合は、そのデプロイメントを少なくとも 2 つのレプリカにスケールアウトします。通常のオペレーションでは、回復力を高めるためにハイブリッドノードで少なくとも 2 つの CoreDNS レプリカを実行することが推奨されます。

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. 次のコマンドを使用して、クラスターから削除する古い Kubernetes バージョンのハイブリッドノードをそれぞれドレインします。ノードドレインのドレイン処理に関する詳細については、Kubernetes ドキュメントの「[Safely Drain a Node](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)」を参照してください。`NODE_NAME` を古い Kubernetes バージョンのハイブリッドノードの名前に置き換えます。

   ```
   kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
   ```

   以下のコードスニペットを使用して、特定の Kubernetes バージョン (この場合は `1.28`) のすべてのノードを識別してドレインすることができます。

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Draining $node"
       kubectl drain $node --ignore-daemonsets --delete-emptydir-data
   done
   ```

1. `nodeadm` を使用して、ホストからハイブリッドノードアーティファクトを停止および削除できます。root/sudo 権限を持つユーザーで `nodeadm` を実行する必要があります。デフォルトでは、ノードにポッドが残っている場合、`nodeadm uninstall` は続行されません。詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

   ```
   nodeadm uninstall
   ```

1. ハイブリッドノードのアーティファクトを停止およびアンインストールしたら、クラスターからノードリソースを削除します。

   ```
   kubectl delete node node-name
   ```

   次のコードスニペットを使用して、特定の Kubernetes バージョン (この場合は `1.28`) のすべてのノードを識別および削除できます。

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Deleting $node"
       kubectl delete node $node
   done
   ```

1. CNI の選択によっては、上記のステップを実行した後にハイブリッドノードにアーティファクトが残っている場合があります。詳細については「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」を参照してください。

## インプレースアップグレード
<a name="hybrid-nodes-upgrade-inplace"></a>

インプレースアップグレードプロセスとは、`nodeadm upgrade` を使用して、新しい物理ホストまたは仮想ホストやカットオーバー移行戦略を使用せずに、ハイブリッドノードの Kubernetes バージョンをアップグレードすることを指します。この `nodeadm upgrade` プロセスでは、ハイブリッドノードで実行されている既存の古い Kubernetes コンポーネントのシャットダウン、既存の古い Kubernetes コンポーネントのアンインストール、新しいターゲット Kubernetes コンポーネントのインストールを行い、新しいターゲット Kubernetes コンポーネントを起動します。ハイブリッドノードで実行されているアプリケーションへの影響を最小限に抑えるために、一度にアップグレードするノードは 1 つにすることを強くお勧めします。このプロセスの期間は、ネットワーク帯域幅とレイテンシーによって異なります。

1. アップグレードするノードをスケジュール不可としてマークするには、次のコマンドを使用します。これは、アップグレードするノード上で新しいポッドがスケジュールまたは再スケジュールされないようにするためです。詳細については、Kubernetes のドキュメントの「[kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/)」を参照してください。`NODE_NAME` をアップグレードするハイブリッドノードの名前に置き換える

   ```
   kubectl cordon NODE_NAME
   ```

1. 次のコマンドを使用して、アップグレードするノードをドレインします。ノードドレインのドレイン処理に関する詳細については、Kubernetes ドキュメントの「[Safely Drain a Node](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)」を参照してください。`NODE_NAME` をアップグレードするハイブリッドノードの名前に置き換えます。

   ```
   kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
   ```

1. アップグレードするハイブリッドノードで `nodeadm upgrade` を実行します。root/sudo 権限を持つユーザーで `nodeadm` を実行する必要があります。ノードの名前は、AWS SSM と AWS IAM Roles Anywhere の両方の認証情報プロバイダーのアップグレードによって保持されます。アップグレードプロセス中に認証情報プロバイダーを変更することはできません。`nodeConfig.yaml` の設定値については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。`K8S_VERSION` を、アップグレード先のターゲット Kubernetes バージョンに置き換えます。

   ```
   nodeadm upgrade K8S_VERSION -c file://nodeConfig.yaml
   ```

1. アップグレード後にノード上で Pod をスケジュールできるように、以下を入力します。`NODE_NAME` をノードの名前に置き換えます。

   ```
   kubectl uncordon NODE_NAME
   ```

1. ハイブリッドノードのステータスを監視し、ノードがシャットダウンするのを待ち、Ready (準備完了) ステータスになったら新しい Kubernetes バージョンで再起動します。

   ```
   kubectl get nodes -o wide -w
   ```

# ハイブリッドノード用のセキュリティ更新プログラムにパッチを適用する
<a name="hybrid-nodes-security"></a>

このトピックでは、ハイブリッドノードで実行されている特定のパッケージと依存関係を対象としたセキュリティ更新プログラムにインプレースでパッチを適用する手順について説明します。ベストプラクティスとして、ハイブリッドノードを定期的に更新して CVE とセキュリティパッチを受け取ることをお勧めします。

Kubernetes バージョンをアップグレードする手順については、「[クラスターのハイブリッドノードをアップグレードする](hybrid-nodes-upgrade.md)」を参照してください。

セキュリティパッチの適用が必要になるソフトウェアの一例が `containerd` です。

## `Containerd`
<a name="_containerd"></a>

 `containerd` は、標準の Kubernetes コンテナランタイムであり、EKS ハイブリッドノードとはコアな依存関係にあります。その用途は、イメージのプルやコンテナ実行の管理などコンテナのライフサイクルを管理することです。ハイブリッドノードでは、[nodeadm CLI](https://docs.aws.amazon.com/eks/latest/userguide/hybrid-nodes-nodeadm.html) を利用するか手動で `containerd` をインストールできます。ノードのオペレーティングシステムに応じて、`nodeadm` は OS 配布のパッケージまたは Docker パッケージから `containerd` をインストールします。

`containerd` の CVE が公開されたら、以下のオプションを利用して、ハイブリッドノードで `containerd` をパッチ適用済みのバージョンにアップグレードできます。

## ステップ 1: パッチがパッケージマネージャーに公開されているかどうかを確認する
<a name="_step_1_check_if_the_patch_published_to_package_managers"></a>

`containerd` CVE パッチがそれぞれの OS パッケージマネージャーに公開されているかどうか、対応するセキュリティ速報を参照することで確認できます。
+  [Amazon Linux 2023](https://alas.aws.amazon.com/alas2023.html) 
+  [RHEL](https://access.redhat.com/security/security-updates/security-advisories) 
+  [Ubuntu 20.04](https://ubuntu.com/security/notices?order=newest&release=focal) 
+  [Ubuntu 22.04](https://ubuntu.com/security/notices?order=newest&release=jammy) 
+  [Ubuntu 24.04](https://ubuntu.com/security/notices?order=newest&release=noble) 

Docker リポジトリを `containerd` のソースとして使用している場合は、[Docker セキュリティのお知らせ](https://docs.docker.com/security/security-announcements/)をチェックして、Docker リポジトリからパッチ適用済みのバージョンを入手できるかどうかを確認できます。

## ステップ 2: パッチのインストール方法を選択する
<a name="_step_2_choose_the_method_to_install_the_patch"></a>

ノードにインプレースでパッチを適用し、セキュリティアップグレードをインストールする方法が 3 つあります。どの方法を使用できるかは、パッチをパッケージマネージャーでオペレーティングシステムから入手できるかどうかによって異なります。

1. `nodeadm upgrade` を使用してパッケージマネージャーに公開されているパッチをインストールします。「[ステップ 2 a](#hybrid-nodes-security-nodeadm)」を参照してください。

1. パッケージマネージャーで直接パッチをインストールします。「[ステップ 2 b](#hybrid-nodes-security-package)」を参照してください。

1. パッケージマネージャーに公開されていないカスタムパッチをインストールします。`containerd` に対するカスタムパッチについては特別な考慮事項があるので注意してください。「[ステップ 2 c](#hybrid-nodes-security-manual)」を参照してください。

## ステップ 2 a: `nodeadm upgrade` でパッチを適用する
<a name="hybrid-nodes-security-nodeadm"></a>

`containerd` CVE パッチが OS や Docker リポジトリ (Apt または RPM) に公開されたことを確認したら、`nodeadm upgrade` コマンドを使用して `containerd` を最新バージョンにアップグレードできます。これは Kubernetes バージョンのアップグレードではないため、現在の Kubernetes バージョンを `nodeadm` アップグレードコマンドに渡す必要があります。

```
nodeadm upgrade K8S_VERSION --config-source file:///root/nodeConfig.yaml
```

## ステップ 2 b: オペレーティングシステムのパッケージマネージャーでパッチを適用する
<a name="hybrid-nodes-security-package"></a>

あるいは、それぞれのパッケージマネージャーから更新することも可能であり、それを使用して以下のように `containerd` パッケージをアップグレードできます。

 **Amazon Linux 2023** 

```
sudo yum update -y
sudo yum install -y containerd
```

 **RHEL** 

```
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo yum update -y
sudo yum install -y containerd
```

 **Ubuntu** 

```
sudo mkdir -p /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update -y
sudo apt install -y --only-upgrade containerd.io
```

## ステップ 2 c: `Containerd` CVE パッチがパッケージマネージャーに公開されていない場合の対応
<a name="hybrid-nodes-security-manual"></a>

パッチ適用済みの `containerd` バージョンがパッケージマネージャー以外の手段でのみ使用できる場合、例えば GitHub リリースのみであれば GitHub の公式サイトから `containerd` をインストールできます。

1. マシンがハイブリッドノードとしてクラスターに既に参加している場合は、`nodeadm uninstall` コマンドを実行する必要があります。

1. `containerd` の公式のバイナリをインストールします。GitHub の[公式のインストール手順](https://github.com/containerd/containerd/blob/main/docs/getting-started.md#option-1-from-the-official-binaries)を使用できます。

1. `--containerd-source` 引数を `none` に設定して `nodeadm install` コマンドを実行します。`nodeadm` から `containerd` をインストールする操作がスキップされます。ノードでどのオペレーティングシステムが実行されていても、`containerd` ソースで `none` の値を使用できます。

   ```
   nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER --containerd-source none
   ```

# ハイブリッドノードを削除する
<a name="hybrid-nodes-remove"></a>

このトピックではAmazon EKS クラスターからハイブリッドノードを削除する方法について説明します。[kubectl](https://kubernetes.io/docs/reference/kubectl/) などの Kubernetes 互換ツールを選択して、ハイブリッドノードを削除する必要があります。ハイブリッドノードの課金はノードオブジェクトが Amazon EKS クラスターから削除されると停止します。ハイブリッドノードの料金の詳細については「[Amazon EKS 料金表](https://aws.amazon.com/eks/pricing/)」を参照してください。

**重要**  
ノードを削除すると、ノードで実行されているワークロードが中断されます。ハイブリッドノードを削除する前に、まずノードをドレインしてポッドを別のアクティブノードに移動することが推奨されます。ノードドレインのドレイン処理に関する詳細についてはKubernetes ドキュメントの「[ノードの安全な排水](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)」を参照してください。

Amazon EKS クラスターの Kubernetes API エンドポイントとのやり取りに使用するローカルマシンまたはインスタンスから、以下の kubectl ステップを実行してください。特定の `kubeconfig` ファイルを使用している場合は`--kubeconfig` フラグを使用します。

## ステップ 1: ノードを一覧表示する
<a name="_step_1_list_your_nodes"></a>

```
kubectl get nodes
```

## ステップ 2: ノードをドレインする
<a name="_step_2_drain_your_node"></a>

`kubectl drain` コマンドの詳細についてはKubernetes ドキュメントの「[kubectl drain](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_drain/)」を参照してください。

```
kubectl drain --ignore-daemonsets <node-name>
```

## ステップ 3: ハイブリッドノードアーティファクトを停止およびアンインストールする
<a name="_step_3_stop_and_uninstall_hybrid_nodes_artifacts"></a>

Amazon EKS Hybrid Nodes CLI (`nodeadm`) を使用して、ホストからハイブリッドノードアーティファクトを停止および削除できます。root/sudo 権限を持つユーザーで `nodeadm` を実行する必要があります。デフォルトではノードにポッドが残っている場合、`nodeadm uninstall` は続行されません。AWS システム・マネージャー (SSM) を認証情報プロバイダーとして使用している場合、`nodeadm uninstall` コマンドはホストの AWS SSM マネージドインスタンスとしての登録を解除します。詳細については「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

```
nodeadm uninstall
```

## ステップ 4: クラスターからノードを削除する
<a name="_step_4_delete_your_node_from_the_cluster"></a>

ハイブリッドノードのアーティファクトを停止およびアンインストールしたら、クラスターからノードリソースを削除します。

```
kubectl delete node <node-name>
```

## ステップ 5: 残りのアーティファクトを確認する
<a name="_step_5_check_for_remaining_artifacts"></a>

CNI の選択によっては上記のステップを実行した後にハイブリッドノードにアーティファクトが残っている場合があります。詳細については「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」を参照してください。

# ハイブリッドノードのアプリケーションネットワーキング、アドオン、ウェブフックを設定する
<a name="hybrid-nodes-configure"></a>

ハイブリッドノード用に EKS クラスターを作成したら、アプリケーションネットワーキングに関する追加の機能 (CNI、BGP、Ingress、Load Balancing、Network Policies)、アドオン、ウェブフック、プロキシを設定します。ハイブリッドノードと互換性のある EKS およびコミュニティアドオンの完全なリストは、「[ハイブリッドノードのアドオンを構成する](hybrid-nodes-add-ons.md)」を参照してください。

 **EKS クラスターインサイト** EKS には、クラスターまたはワークロードの機能を損なう可能性のあるハイブリッドノードの設定ミスに関するインサイトチェックが含まれています。クラスターインサイトの詳細については、「[Kubernetes バージョンアップグレードの準備およびクラスターインサイトでの設定ミスのトラブルシューティング](cluster-insights.md)」を参照してください。

以下に、ハイブリッドノードでよく使用される機能とアドオンを示します。
+  **Container Networking Interface (CNI)**: AWS は、ハイブリッドノード向けの CNI として [Cilium](https://docs.cilium.io/en/stable/index.html) をサポートしています。詳細については、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」を参照してください。AWS VPC CNI はハイブリッドノードでは使用できないことに注意してください。
+  **CoreDNS と `kube-proxy`**: ハイブリッドノードが EKS クラスターと結合したときは、CoreDNS と `kube-proxy` が自動的にインストールされます。これらのアドオンは、クラスターの作成後、EKS アドオンとして管理できます。
+  **Ingress と Load Balancing**: ハイブリッドノード上で実行されているワークロードのターゲットタイプが `ip` の場合、AWS Load Balancer Controller を Application Load Balancer (ALB) または Network Load Balancer (NLB) と共に使用できます。AWS は、ハイブリッドノード上で実行されているワークロード向けに Cilium に組み込みの Ingress、Gateway、Kubernetes Service のロードバランシング機能をサポートしています。詳細については、「[ハイブリッドノード用に Kubernetes Ingress を設定する](hybrid-nodes-ingress.md)」および「[ハイブリッドノード用にタイプ LoadBalancer の Service を設定する](hybrid-nodes-load-balancing.md)」を参照してください。
+  **メトリクス**: Amazon Managed Service for Prometheus (AMP) エージェントレススクレイパー、AWS Distro for Open Telemetry (ADOT)、Amazon CloudWatch Observability Agent は、ハイブリッドノードで使用できます。ポッドメトリクス用の AMP エージェントレススクレイパーをハイブリッドノードで使用する場合は、Amazon EKS クラスターに使用する VPC からポッドにアクセスできる必要があります。
+  **ログ**: ハイブリッドノードが有効になっているクラスターに対して、EKS コントロールプレーンのログ記録を有効にすることができます。ADOT EKS アドオンと Amazon CloudWatch Observability Agent EKS アドオンを、ハイブリッドノードとポッドのログ記録に使用できます。
+  **Pod Identity と IRSA**: EKS Pod Identity と IAM Roles for Service Accounts (IRSA) を、ハイブリッドノードで実行中のアプリケーションで使用すると、ハイブリッドノードで実行中の Pod に、他の AWS サービスを使ってきめ細かくアクセスすることが可能になります。
+  **ウェブフック**: ウェブフックを実行している場合は、オンプレミスのポッドネットワークをルーティングできない場合に、クラウドノードでウェブフックを選択的に実行する際の考慮事項と手順について「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」を参照してください。
+  **Proxy**: データセンターまたはエッジ環境から送信されるトラフィックに、オンプレミス環境にあるプロキシサーバーを使用している場合は、そのプロキシサーバーを使用するようにノードとクラスターを設定することができます。詳細については、「[ハイブリッドノードのプロキシを設定する](hybrid-nodes-proxy.md)」を参照してください。

**Topics**
+ [ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)
+ [ハイブリッドノードのアドオンを構成する](hybrid-nodes-add-ons.md)
+ [ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)
+ [ハイブリッドノードのプロキシを設定する](hybrid-nodes-proxy.md)
+ [ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)
+ [ハイブリッドノード用に Kubernetes Ingress を設定する](hybrid-nodes-ingress.md)
+ [ハイブリッドノード用にタイプ LoadBalancer の Service を設定する](hybrid-nodes-load-balancing.md)
+ [ハイブリッドノード用に Kubernetes ネットワークポリシーを設定する](hybrid-nodes-network-policies.md)

# ハイブリッドノードの CNI を設定する
<a name="hybrid-nodes-cni"></a>

Cilium は、Amazon EKS Hybrid Nodes 向けに AWS でサポートされるコンテナネットワークインターフェイス (CNI) です。ハイブリッドノードがワークロードを処理できるようにするにはCNI をインストールする必要があります。CNI が稼働するまではハイブリッドノードは `Not Ready` のステータスで表示されます。CNI は、Helm など任意のツールで管理できます。このページでは、Cilium ライフサイクル管理 (インストール、アップグレード、削除) の手順を説明します。Cilium をイングレス、ロードバランシング、ネットワークポリシー用に設定する方法については、「[Cilium Ingress および Cilium Gateway の概要](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium)」、「[サービスタイプ LoadBalancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium-loadbalancer)」、「[ハイブリッドノード用に Kubernetes ネットワークポリシーを設定する](hybrid-nodes-network-policies.md)」を参照してください。

AWS では、AWS Cloud 内のノードで Cilium を実行する操作はサポートされていません。Amazon VPC CNI はハイブリッドノードと互換性がなく、VPC CNI は `eks.amazonaws.com/compute-type: hybrid` ラベルに対しアンチアフィニティで設定されています。

このページにこれまで記載されていた Calico ドキュメントは、[EKS ハイブリッドサンプルリポジトリ](https://github.com/aws-samples/eks-hybrid-examples)に移動しました。

## バージョン互換性
<a name="hybrid-nodes-cilium-version-compatibility"></a>

Cilium バージョン `v1.17.x` および `v1.18.x` は、Amazon EKS でサポートされているすべての Kubernetes バージョンの EKS ハイブリッドノードでサポートされています。

**注記**  
 **Cilium v1.18.3 カーネル要件**: カーネル要件 (Linux カーネル >= 5.10) により、Cilium v1.18.3 は以下ではサポートされていません。
+ Ubuntu 20.04
+ Red Hat Enterprise Linux (RHEL) 8

システム要件については、「[Cilium システム要件](https://docs.cilium.io/en/stable/operations/system_requirements/)」を参照してください。

Amazon EKS でサポートされている Kubernetes のバージョンについては、「[Kubernetes version support](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)」を参照してください。EKS Hybrid Nodes には、クラウドノードを使用する Amazon EKS クラスターと同じ Kubernetes バージョンのサポートがあります。

## サポートされる機能
<a name="hybrid-nodes-cilium-support"></a>

 AWS は、オープンソース [Cilium プロジェクト](https://github.com/cilium/cilium) に基づく Cilium for EKS Hybrid Nodes のビルドを維持します。AWS から Cilium のサポートを受けるには、AWS が維持する Cilium ビルドとサポート対象の Cilium バージョンを使用している必要があります。

 AWS は、EKS ハイブリッドノードで使用する Cilium の以下の機能のデフォルト設定についてテクニカルサポートを提供しています。AWS のサポート範囲外の機能を使用する場合は、Cilium の代替商用サポートを受けるか、社内のエキスパートがトラブルシューティングして解決策を Cilium プロジェクトに提供することをお勧めします。


| Cilium 機能 | AWS によりサポート  | 
| --- | --- | 
|  Kubernetes ネットワーク適合性  |  はい  | 
|  コアクラスターの接続  |  はい  | 
|  IP ファミリー  |  IPv4  | 
|  ライフサイクル管理  |  Helm  | 
|  ネットワークモード  |  VXLAN カプセル化  | 
|  IP アドレス管理 (IPAM)  |  Cilium IPAM クラスタースコープ  | 
|  ネットワークポリシー  |  Kubernetes ネットワークポリシー  | 
|  ボーダーゲートウェイプロトコル (BGP)  |  Cilium BGP コントロールプレーン  | 
|  Kubernetes Ingress  |  Cilium Ingress、Cilium Gateway  | 
|  Service LoadBalancer IP 割り当て  |  Cilium Load Balancer IPAM  | 
|  Service LoadBalancer の IP アドレスのアドバタイズ  |  Cilium BGP コントロールプレーン  | 
|  kube-proxy replacement  |  はい  | 

## Cilium に関する考慮事項
<a name="hybrid-nodes-cilium-considerations"></a>
+  **Helm リポジトリ** - AWS は、Amazon Elastic Container Registry Public (Amazon ECR Public) の [Amazon EKS Cilium/Cilium](https://gallery.ecr.aws/eks/cilium/cilium) で Cilium Helm チャートをホストします。使用可能なバージョンは次のとおりです。
  + Cilium v1.17.9: `oci://public.ecr.aws/eks/cilium/cilium:1.17.9-0` 
  + Cilium v1.18.3: `oci://public.ecr.aws/eks/cilium/cilium:1.18.3-0` 

    このトピックで示したコマンドでは、このリポジトリを使用しています。`helm repo` コマンドの中に Amazon ECR Public の Helm リポジトリに対して有効でないものがあるため、ローカルの Helm リポジトリ名からこのリポジトリを参照できません。代わりに、ほとんどのコマンドで URI を完全な形で使用してください。
+ デフォルトでは、Cilium は VXLAN を[カプセル化方法](https://docs.cilium.io/en/stable/network/concepts/routing/#encapsulation)とするオーバーレイ/トンネルモードで動作するように設定されています。このモードでは、基盤となる物理ネットワークに関する要件が最も少なくなります。
+ デフォルトでは、Cilium はクラスターから出ていくすべてのポッドトラフィックの送信元 IP アドレスをノードの IP アドレスに[マスカレード](https://docs.cilium.io/en/stable/network/concepts/masquerading/)します。マスカレードを無効にする場合は、ポッド CIDR がオンプレミスネットワークでルーティング可能である必要があります。
+ ハイブリッドノードでウェブフックを実行している場合は、オンプレミスネットワークでポッド CIDR をルーティング可能である必要があります。オンプレミスネットワークでポッド CIDR をルーティングできない場合は、同じクラスター内のクラウドノードでウェブフックを実行することをお勧めします。詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」と「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。
+  AWS では、Cilium に組み込みの BGP 機能を使用して、オンプレミスネットワークでポッド CIDR をルーティング可能にすることをお勧めします。ハイブリッドノードで Cilium BGP を設定する方法の詳細については、「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」を参照してください。
+ Cilium のデフォルトの IP Address Manager (IPAM) は[クラスタースコープ](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/)と呼ばれ、Cilium オペレーターがユーザー設定のポッド CIDR に基づいてノードごとに IP アドレスを割り当てます。

## ハイブリッドノードに Cilium をインストールする
<a name="hybrid-nodes-cilium-install"></a>

### 手順
<a name="_procedure"></a>

1. `cilium-values.yaml` という名前の YAML ファイルを作成します。次の例では、Cilium のエージェントとオペレーターの `eks.amazonaws.com/compute-type: hybrid` ラベルにアフィニティを設定することで、ハイブリッドノードでのみ動作するように Cilium を設定しています。
   + EKS クラスターの*リモートポッドネットワーク*の場合と同じポッド CIDR で `clusterPoolIpv4PodCIDRList` を設定してください。例えば、`10.100.0.0/24`。Cilium オペレーターは、設定された `clusterPoolIpv4PodCIDRList` IP スペース内から IP アドレススライスを割り当てます。ポッド CIDR は、オンプレミスノード CIDR、VPC CIDR、Kubernetes サービス CIDR と重複してはいけません。
   + ノードあたりに必要なポッドに基づいて `clusterPoolIpv4MaskSize` を設定します。例えば、ノードあたり 128 個のポッドが必要で、そのサイズが /25 セグメントの場合は `25` とします。
   + クラスターに Cilium をデプロイした後で `clusterPoolIpv4PodCIDRList` または `clusterPoolIpv4MaskSize` を変更しないでください。詳細については、「[Expanding the cluster pool](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/#expanding-the-cluster-pool)」を参照してください。
   + kube-proxy 置き換えモードで Cilium を実行している場合は、Helm 値に `kubeProxyReplacement: "true"` を設定し、Cilium と同じノードで既存の kube-proxy デプロイが実行されていないことを確認します。
   + 以下の例では、Cilium が L7 ネットワークポリシーとイングレスに使用する Envoy Layer 7 (L7) プロキシを無効にしています。詳細については、「[ハイブリッドノード用に Kubernetes ネットワークポリシーを設定する](hybrid-nodes-network-policies.md)」および「[Cilium Ingress および Cilium Gateway の概要](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium)」を参照してください。
   + 以下の例では、サービストラフィック分散がお使いのサービス用に設定した場合に正しく機能するように、`loadBalancer.serviceTopology`: `true` を設定しています。詳細については、「[サービストラフィック分散の設定](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution)」を参照してください。
   + Cilium の Helm 値の完全なリストについては、Cilium ドキュメントの「[Helm reference](https://docs.cilium.io/en/stable/helm-reference/)」を参照してください。

     ```
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
     ipam:
       mode: cluster-pool
       operator:
         clusterPoolIPv4MaskSize: 25
         clusterPoolIPv4PodCIDRList:
         - POD_CIDR
     loadBalancer:
       serviceTopology: true
     operator:
       affinity:
         nodeAffinity:
           requiredDuringSchedulingIgnoredDuringExecution:
             nodeSelectorTerms:
             - matchExpressions:
               - key: eks.amazonaws.com/compute-type
                 operator: In
                 values:
                   - hybrid
       unmanagedPodWatcher:
         restart: false
     loadBalancer:
       serviceTopology: true
     envoy:
       enabled: false
     kubeProxyReplacement: "false"
     ```

1. クラスターに Cilium をインストールします。
   + `CILIUM_VERSION` を Cilium バージョン (`1.17.9-0` または `1.18.3-0` など) に置き換えます。Cilium のマイナーバージョンに最新のパッチバージョンを使用することをお勧めします。
   + ノードが、選択したバージョンのカーネル要件を満たしていることを確認します。Cilium v1.18.3 には Linux カーネル >= 5.10 が必要です。
   + 特定の kubeconfig ファイルを使用している場合はHelm install コマンドで `--kubeconfig` フラグを使用します。

     ```
     helm install cilium oci://public.ecr.aws/eks/cilium/cilium \
         --version CILIUM_VERSION \
         --namespace kube-system \
         --values cilium-values.yaml
     ```

1. 以下のコマンドを使用して、Cilium のインストールが成功したことを確認します。`cilium-operator` デプロイと、各ハイブリッドノードで実行されている `cilium-agent` が確認できるはずです。また、ハイブリッドノードのステータスは `Ready` になっているはずです。ポッド CIDR をオンプレミスネットワークにアドバタイズするように Cilium BGP を設定する方法については、「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」に進んでください。

   ```
   kubectl get pods -n kube-system
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   cilium-jjjn8                      1/1     Running   0          11m
   cilium-operator-d4f4d7fcb-sc5xn   1/1     Running   0          11m
   ```

   ```
   kubectl get nodes
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION
   mi-04a2cf999b7112233   Ready    <none>   19m   v1.31.0-eks-a737599
   ```

## ハイブリッドノードで Cilium をアップグレードする
<a name="hybrid-nodes-cilium-upgrade"></a>

Cilium デプロイをアップグレードする前に、[Cilium アップグレードのドキュメント](https://docs.cilium.io/en/v1.17/operations/upgrade/)とアップグレードに関する注意事項をよく確認し、対象となる Cilium バージョンの変更について理解してください。

1. コマンドライン環境に `helm` CLI がインストールされていることを確認します。インストール手順については「[Helm のドキュメント](https://helm.sh/docs/intro/quickstart/)」を参照してください。

1. Cilium アップグレードのプリフライトチェックを実行してください。`CILIUM_VERSION` を対象となる Cilium バージョンに置き換えます。Cilium のマイナーバージョンに対して、最新のパッチバージョンを実行することをお勧めします。特定の Cilium マイナーリリースの最新のパッチリリースはCilium ドキュメントの「[安定リリースのセクション](https://github.com/cilium/cilium#stable-releases)」で確認できます。

   ```
   helm install cilium-preflight oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
     --namespace=kube-system \
     --set preflight.enabled=true \
     --set agent=false \
     --set operator.enabled=false
   ```

1. `cilium-preflight.yaml` の適用後は `READY` Pod の数が実行中の Cilium Pod の数と同じであることを確認します。

   ```
   kubectl get ds -n kube-system | sed -n '1p;/cilium/p'
   ```

   ```
   NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   cilium                    2         2         2       2            2           <none>          1h20m
   cilium-pre-flight-check   2         2         2       2            2           <none>          7m15s
   ```

1. READY ポッドの数が同じになったら、Cilium プリフライトデプロイも READY 1/1 とマークされていることを確認してください。READY 0/1 と表示された場合はアップグレードを続行する前に、「[CNP の検証](https://docs.cilium.io/en/v1.17/operations/upgrade/#cnp-validation)」セクションを参照しながらデプロイの問題を解決してください。

   ```
   kubectl get deployment -n kube-system cilium-pre-flight-check -w
   ```

   ```
   NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
   cilium-pre-flight-check   1/1     1            0           12s
   ```

1. プリフライトを削除する

   ```
   helm uninstall cilium-preflight --namespace kube-system
   ```

1. `helm upgrade` コマンドを実行する場合は、事前にデプロイの値を `existing-cilium-values.yaml` に保存します。あるいは、そのアップグレードコマンドを実行する際に、お使いの設定に対して `--set` コマンドラインオプションを使用します。アップグレード操作は Cilium ConfigMap を上書きするため、アップグレード時に設定値を渡すことが極めて重要です。

   ```
   helm get values cilium --namespace kube-system -o yaml > existing-cilium-values.yaml
   ```

1. 通常のクラスターオペレーションではすべての Cilium コンポーネントが同じバージョンを実行している必要があります。以下のステップではある安定版リリースからより新しい安定版リリースへと、すべてのコンポーネントをアップグレードする方法について説明します。あるマイナーリリースから別のマイナーリリースにアップグレードする場合はまず既存の Cilium マイナーバージョンの最新のパッチリリースにアップグレードすることをお勧めします。中断を最小限に抑えるには `upgradeCompatibility` オプションを、このクラスターに最初にインストールされた Cilium のバージョンに設定します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
     --namespace kube-system \
     --set upgradeCompatibility=1.X \
     -f existing-cilium-values.yaml
   ```

1. (オプション) 問題があってアップグレードをロールバックする必要がある場合は次のコマンドを実行してください。

   ```
   helm history cilium --namespace kube-system
   helm rollback cilium [REVISION] --namespace kube-system
   ```

## ハイブリッドノードから Cilium を削除する
<a name="hybrid-nodes-cilium-delete"></a>

1. 以下のコマンドを実行して、クラスターからすべての Cilium コンポーネントをアンインストールします。なお、CNI をアンインストールすると、ノードと Pod の正常性に影響する可能性があるため、本番稼働用クラスターでは実行しないでください。

   ```
   helm uninstall cilium --namespace kube-system
   ```

   CNI がクラスターから削除されても、Cilium によって設定されたインターフェイスとルートはデフォルトでは削除されません。詳細については「[GitHub の問題](https://github.com/cilium/cilium/issues/34289)」を参照してください。

1. ディスク上の設定ファイルとリソースをクリーンアップするには標準的な設定ディレクトリを使用している場合はGitHub の Cilium リポジトリの [`cni-uninstall.sh` スクリプト](https://github.com/cilium/cilium/blob/main/plugins/cilium-cni/cni-uninstall.sh)に示されているようにファイルを削除できます。

1. Cilium カスタムリソース定義 (CRD クラスターから削除するには以下のコマンドを実行してください。

   ```
   kubectl get crds -oname | grep "cilium" | xargs kubectl delete
   ```

# ハイブリッドノードのアドオンを構成する
<a name="hybrid-nodes-add-ons"></a>

このページでは、Amazon EKS Hybrid Nodes で AWS アドオンとコミュニティアドオンを実行する際の考慮事項について説明します。Amazon EKS アドオンと、クラスターからアドオンを作成、アップグレード、削除するプロセスの詳細については、「[Amazon EKS アドオン](eks-add-ons.md)」を参照してください。このページに特に明記されていない限り、Amazon EKS アドオンを作成、アップグレード、削除するプロセスは、ハイブリッドノードを備える Amazon EKS クラスターでも、AWS クラウドでノードが実行される Amazon EKS クラスターでも同じです。このページに記載のアドオンについてのみ、Amazon EKS Hybrid Nodes との互換性が検証されています。

以下の AWS アドオンは、Amazon EKS Hybrid Nodes と互換性があります。


|  AWS アドオン | 互換性のあるアドオンバージョン | 
| --- | --- | 
|  kube-proxy  |  v1.25.14-eksbuild.2 以降  | 
|  CoreDNS  |  v1.9.3-eksbuild.7 以降  | 
|   AWS オープンテレメトリー用ディストリビューター (ADOT)  |  v0.102.1-eksbuild.2 以降  | 
|  CloudWatch Observability エージェント  |  v2.2.1-eksbuild.1 以降  | 
|  EKS Pod Identity エージェント  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/hybrid-nodes-add-ons.html)  | 
|  ノードモニタリングエージェント  |  v1.2.0-eksbuild.1 以降  | 
|  CSI スナップショットコントローラー  |  v8.1.0-eksbuild.1 以降  | 
|   AWS プライベート CA の Connector for Kubernetes  |  v1.6.0-eksbuild.1 以降  | 
|  Amazon FSx CSI ドライバー  |  v1.7.0-eksbuild.1 以降  | 
|   AWS Secrets Store CSI Driver プロバイダー  |  v2.1.1-eksbuild.1 以降  | 

以下のコミュニティアドオンは、Amazon EKS Hybrid Nodes と互換性があります。コミュニティアドオンの詳細については、「[コミュニティアドオン](community-addons.md)」を参照してください。


| コミュニティアドオン | 互換性のあるアドオンバージョン | 
| --- | --- | 
|  Kubernetes メトリクスサーバー  |  v0.7.2-eksbuild.1 以降  | 
|  cert-manager  |  v1.17.2-eksbuild.1 以降  | 
|  Prometheus Node Exporter  |  v1.9.1-eksbuild.2 以降  | 
|  kube-state-metrics  |  v2.15.0-eksbuild.4 以降  | 
|  外部 DNS  |  v0.19.0-eksbuild.1 以降  | 

上記の表の Amazon EKS アドオンに加えて、[Amazon Managed Service for Prometheus コレクター](prometheus.md)、および[アプリケーションイングレス](alb-ingress.md) (HTTP) および[ロードバランシング](network-load-balancing.md) (TCP/UDP) 用の [AWS ロードバランサーコントローラー](aws-load-balancer-controller.md)はハイブリッドノードと互換性があります。

AWS アドオンとコミュニティアドオンには、Amazon EKS Hybrid Nodes と互換性のないものがあります。こうしたアドオンの最新バージョンには、デフォルトの `eks.amazonaws.com/compute-type: hybrid` ラベルをハイブリッドノードに適用するにあたってアンチアフィニティルールがあります。これにより、クラスターにデプロイされたときにハイブリッドノードで実行されるのが防止されます。ハイブリッドノードと AWS クラウドで実行されているノードの両方を備えたクラスターがある場合、クラスター内のこれらのアドオンを AWS クラウドで実行されているノードにデプロイできます。Amazon VPC CNI はハイブリッドノードと互換性がなく、Cilium と Calico は Amazon EKS Hybrid Nodes のコンテナネットワークインターフェイス (CNI としてサポートされています。詳細については「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」を参照してください。

## AWSアドオン
<a name="hybrid-nodes-add-ons-aws-add-ons"></a>

以降のセクションでは、ハイブリッドノード上の互換性のある AWS アドオンを実行する場合と、他の Amazon EKS コンピューティングタイプで同じアドオンを実行する場合の違いについて説明します。

## kube-proxy と CoreDNS
<a name="hybrid-nodes-add-ons-core"></a>

AWS CLI によるものも含め AWS API と AWS SDK で EKS クラスターを作成すると、EKS はデフォルトで kube-proxy と CoreDNS をセルフマネージドアドオンとしてインストールします。こうしたアドオンは、クラスターの作成後に Amazon EKS アドオンで上書きできます。[Amazon EKS クラスターで `kube-proxy` を管理する](managing-kube-proxy.md) および [Amazon EKS クラスターで DNS の CoreDNS を管理する](managing-coredns.md) の詳細についてはEKS ドキュメントを参照してください。ハイブリッドノードと AWS クラウド内のノードの両方がある混合モードのクラスターを実行している場合、AWS ではハイブリッドノードに少なくとも 1 つの CoreDNS レプリカがあり、AWS クラウド内のノードに少なくとも 1 つの CoreDNS レプリカがあるようにすることをお勧めします。設定手順については、「[CoreDNS レプリカを設定する](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-coredns)」を参照してください。

## CloudWatch Observability エージェント
<a name="hybrid-nodes-add-ons-cw"></a>

CloudWatch Observability エージェントオペレーターは、[ウェブフック](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)を使用します。ハイブリッドノードでオペレーターを実行する場合は、オンプレミスネットワークでオンプレミスポッド CIDR をルーティングし、リモートポッドネットワークで EKS クラスターを設定する必要があります。詳細については、「[Configure webhooks for hybrid nodes](hybrid-nodes-webhooks.md)」を参照してください。

ノードレベルのメトリクスは[クラウドコンテナインサイトを見る](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContainerInsights.html) がノードレベルのメトリクスに関して[インスタンスメタデータサービス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html) (IMDS の可用性に依存するため、ハイブリッドノードでは利用できません。クラスター、ワークロード、ポッド、コンテナレベルのメトリクスはハイブリッドノードで利用できます。

「[Amazon CloudWatch オベサビリティ を使用して Amazon CloudWatch エージェントをインストールする](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Observability-EKS-addon.html)」で説明されているステップに従ってアドオンをインストールした後、エージェントがハイブリッドノードで正常に実行できるようにするにはアドオンマニフェストを更新する必要があります。以下に示すように、クラスターの `amazoncloudwatchagents` リソースを編集して `RUN_WITH_IRSA` 環境変数を追加します。

```
kubectl edit amazoncloudwatchagents -n amazon-cloudwatch cloudwatch-agent
```

```
apiVersion: v1
items:
- apiVersion: cloudwatch.aws.amazon.com/v1alpha1
  kind: AmazonCloudWatchAgent
  metadata:
    ...
    name: cloudwatch-agent
    namespace: amazon-cloudwatch
    ...
  spec:
    ...
    env:
    - name: RUN_WITH_IRSA # <-- Add this
      value: "True" # <-- Add this
    - name: K8S_NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
          ...
```

## Amazon Managed Prometheus ハイブリッドノード用マネージドコレクター
<a name="hybrid-nodes-add-ons-amp"></a>

Amazon Managed Service for Prometheus (AMP) マネージドコレクターは Amazon EKS クラスター内のリソースからメトリクスを検出して収集するスクレイパーで構成されています。AMP はスクレイパーを自動的に管理するため、インスタンス、エージェント、スクレイパーをユーザーが管理する必要はありません。

AMP マネージドコレクターはハイブリッドノードに固有の追加設定を行わなくても使用できます。ただし、VPC からリモートポッドネットワーク CIDR へのルートや、オンプレミスファイアウォールで開いているポートなど、ハイブリッドノード上のアプリケーションのメトリクスエンドポイントが VPC から到達可能である必要があります。さらに、クラスターには[プライベートクラスターエンドポイントアクセス](cluster-endpoint.md)が必要です。

「Amazon Managed Service for Prometheus ユーザーガイド」の「[AWS マネージドコレクターの使用](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-collector-how-to.html)」のステップに従います。

## AWS オープンテレメトリー用ディストリビューター (ADOT)
<a name="hybrid-nodes-add-ons-adot"></a>

AWS Distro for OpenTelemetry (ADOT) アドオンを使用して、ハイブリッドノードで実行されているアプリケーションからメトリクス、ログ、トレースデータを収集できます。ADOT は、Collector Custom Resource リクエストの変更と検証にアドミッション[ウェブフック](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)を使用します。ハイブリッドノードで ADOT オペレーターを実行する場合は、オンプレミスネットワークでオンプレミスポッド CIDR をルーティングし、リモートポッドネットワークで EKS クラスターを設定する必要があります。詳細については、「[Configure webhooks for hybrid nodes](hybrid-nodes-webhooks.md)」を参照してください。

*AWS オープンテレメトリー用ディストリビューター* ドキュメントの「[EKS アドオンを使用した AWSオープンテレメトリー用ディストリビューター の開始方法](https://aws-otel.github.io/docs/getting-started/adot-eks-add-on)」のステップに従ってください。

## AWS ロードバランサーコントローラー
<a name="hybrid-nodes-add-ons-lbc"></a>

ハイブリッドノード上のワークロードのターゲットタイプが `ip` の場合、[AWS Load Balancer Controller](aws-load-balancer-controller.md) を Application Load Balancer (ALB) や Network Load Balancer (NLB) と共に使用できます。ALB または NLB で使用される IP ターゲットは、AWS からルーティング可能である必要があります。AWS Load Balancer Controller も、[ウェブフック](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)を使用します。ハイブリッドノードで AWS Load Balancer Controller オペレーターを実行する場合は、オンプレミスネットワークでオンプレミスポッド CIDR をルーティングし、リモートポッドネットワークで EKS クラスターを設定する必要があります。詳細については、「[Configure webhooks for hybrid nodes](hybrid-nodes-webhooks.md)」を参照してください。

AWS ロードバランサーコントローラー をインストールするには「[AWS Application Load Balancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-alb)」または「[AWS Network Load Balancer](hybrid-nodes-load-balancing.md#hybrid-nodes-service-lb-nlb)」のステップに従います。

ALB でイングレスを使用する場合は以下の注釈を指定する必要があります。詳細については「[Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする](alb-ingress.md)」を参照してください。

```
alb.ingress.kubernetes.io/target-type: ip
```

NLB で負荷分散を使用する場合は以下の注釈を指定する必要があります。詳細については「[Network Load Balancer を使用して TCP および UDP トラフィックをルーティングする](network-load-balancing.md)」を参照してください。

```
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
```

## EKS Pod Identity エージェント
<a name="hybrid-nodes-add-ons-pod-id"></a>

**注記**  
Bottlerocket を実行しているハイブリッドノードに EKS Pod Identity Agent アドオンを正常にデプロイするには、Bottlerocket のバージョンが v1.39.0 以上であることを確認します。Pod Identity エージェントのハイブリッドノード環境では、以前の Bottlerocket バージョンがサポートされていません。

元の Amazon EKS Pod Identity エージェント DaemonSet は必要な AWS 認証情報を取得するために、ノードの EC2 IMDS を利用します。IMDS はハイブリッドノードでは使用できないため、バージョン 1.3.3-eksbuild.1 以降では必要に応じて Pod Identity Agent アドオンに必要な認証情報をマウントする DaemonSet がデプロイされます。Bottlerocket を実行するハイブリッドノードでは、認証情報をマウントするために別の方法が必要です。バージョン 1.3.7-eksbuild.2 以降では、必要に応じて Pod Identity Agent アドオンに Bottlerocket ハイブリッドノードを対象とする専用の DaemonSet がデプロイされます。以下のセクションでは、オプションの DaemonSet を有効にするプロセスについて説明します。

### Ubuntu/RHEL/AL2023
<a name="_ubunturhelal2023"></a>

1. Ubuntu/RHEL/Al2023 ハイブリッドノードで Pod Identity エージェントを使用するには、以下に示すように `nodeadm` 設定のハイブリッドセクションで `enableCredentialsFile: true` を設定します。

   ```
   apiVersion: node.eks.aws/v1alpha1
   kind: NodeConfig
   spec:
       hybrid:
           enableCredentialsFile: true # <-- Add this
   ```

   これにより、`eks-pod-identity-agent` ポッドで使用される認証情報ファイルをノード上の `/eks-hybrid/.aws/credentials` に作成するように `nodeadm` が設定されます。この認証情報ファイルには定期的に更新される一時的な AWS 認証情報が含まれます。

1. *各*ノードの `nodeadm` 設定を更新したら、`nodeConfig.yaml` で以下の `nodeadm init` コマンドを実行して、ハイブリッドノードを Amazon EKS クラスターに結合します。ノードが以前にクラスターに参加していた場合でも、`nodeadm init` コマンドを再度実行してください。

   ```
   nodeadm init -c file://nodeConfig.yaml
   ```

1. AWS CLI または AWS マネジメントコンソール のいずれかを使用し、ハイブリッドノードのサポートを有効にして `eks-pod-identity-agent` をインストールします。

   1.  AWS CLI: クラスターの管理に使用しているマシンから以下のコマンドを実行して、ハイブリッドノードのサポートを有効にして `eks-pod-identity-agent` をインストールします。`my-cluster` を自分のクラスター名に置き換えます。

      ```
      aws eks create-addon \
          --cluster-name my-cluster \
          --addon-name eks-pod-identity-agent \
          --configuration-values '{"daemonsets":{"hybrid":{"create": true}}}'
      ```

   1.  AWS マネジメントコンソール: AWS コンソールから Pod Identity Agent アドオンをインストールする場合は、オプションの設定に以下を追加して、ハイブリッドノードを対象とする DaemonSet をデプロイします。

      ```
      {"daemonsets":{"hybrid":{"create": true}}}
      ```

### Bottlerocket
<a name="_bottlerocket"></a>

1. Bottlerocket ハイブリッドノードで Pod Identity エージェントを使用するには、「[Bottlerocket を実行しているハイブリッドノードの接続](hybrid-nodes-bottlerocket.md)」で説明されているように、Bottlerocket ブートストラップコンテナのユーザーデータに使用されるコマンドに `--enable-credentials-file=true` フラグを追加します。

   1. SSM 認証情報プロバイダーを使用している場合、コマンドは次のようになります。

      ```
      eks-hybrid-ssm-setup --activation-id=<activation-id> --activation-code=<activation-code> --region=<region> --enable-credentials-file=true
      ```

   1. IAM Roles Anywhere 認証情報プロバイダーを使用している場合、コマンドは次のようになります。

      ```
      eks-hybrid-iam-ra-setup --certificate=<certificate> --key=<private-key> --enable-credentials-file=true
      ```

      これによりブートストラップスクリプトが設定され、`/var/eks-hybrid/.aws/credentials` で `eks-pod-identity-agent` ポッドで使用される認証情報ファイルがノード上に作成されます。この認証情報ファイルには定期的に更新される一時的な AWS 認証情報が含まれます。

1. AWS CLI または AWS マネジメントコンソール のいずれかを使用し、Bottlerocket ハイブリッドノードのサポートを有効にして `eks-pod-identity-agent` をインストールします。

   1.  AWS CLI: クラスターの管理に使用しているマシンから、以下のコマンドを実行して `eks-pod-identity-agent` をインストールし、Bottlerocket ハイブリッドノードのサポートを有効にします。`my-cluster` を自分のクラスター名に置き換えます。

      ```
      aws eks create-addon \
          --cluster-name my-cluster \
          --addon-name eks-pod-identity-agent \
          --configuration-values '{"daemonsets":{"hybrid-bottlerocket":{"create": true}}}'
      ```

   1.  AWS マネジメントコンソール: AWS コンソールから Pod Identity Agent アドオンをインストールする場合は、オプションの設定に以下を追加して、Bottlerocket ハイブリッドノードを対象とする DaemonSet をデプロイします。

      ```
      {"daemonsets":{"hybrid-bottlerocket":{"create": true}}}
      ```

## CSI スナップショットコントローラー
<a name="hybrid-nodes-add-ons-csi-snapshotter"></a>

バージョン `v8.1.0-eksbuild.2` 以降、[CSI スナップショットコントローラーアドオン](csi-snapshot-controller.md)はハイブリッドノードにソフトアンチアフィニティルールを適用し、コントローラーの `deployment` を Amazon EKS コントロールプレーンと同じ AWS リージョンの EC2 で実行することを優先します。`deployment` を Amazon EKS コントロールプレーンと同じ AWS リージョンに配置することで、レイテンシーが改善されます。

## コミュニティアドオン
<a name="hybrid-nodes-add-ons-community"></a>

以降のセクションでは、ハイブリッドノード上の互換性のあるコミュニティアドオンを実行する場合と、他の Amazon EKS コンピューティングタイプで同じアドオンを実行する場合の違いについて説明します。

## Kubernetes メトリクスサーバー
<a name="hybrid-nodes-add-ons-metrics-server"></a>

コントロールプレーンは、Metrics Server のポッド IP (あるいは hostNetwork が有効になっている場合にはノード IP) に到達しなければなりません。このため、hostNetwork モードで Metrics Server を実行しない限り、Amazon EKS クラスターを作成するときにリモートポッドネットワークを設定し、ポッド IP アドレスをルーティング可能にする必要があります。ポッド IP アドレスをルーティング可能にする場合によく使用される方法の 1 つに、CNI でボーダーゲートウェイプロトコル (BGP) を実装することがあります。

## cert-manager
<a name="hybrid-nodes-add-ons-cert-manager"></a>

 `cert-manager` は[ウェブフック](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)を使用します。ハイブリッドノードで `cert-manager` を実行する場合は、オンプレミスネットワークでオンプレミスポッド CIDR をルーティングし、リモートポッドネットワークで EKS クラスターを設定する必要があります。詳細については、「[Configure webhooks for hybrid nodes](hybrid-nodes-webhooks.md)」を参照してください。

# ハイブリッドノード用のウェブフックを設定する
<a name="hybrid-nodes-webhooks"></a>

このページでは、ハイブリッドノードでウェブフックを実行する場合の考慮事項について詳しく説明します。ウェブフックは、AWS Load Balancer Controller や CloudWatch Observability エージェントといった Kubernetes アプリケーションとオープンソースプロジェクトで実行時にミューテーション機能と検証機能を利用する目的で使用されます。

 **ルーティング可能なポッドネットワーク** 

オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にできる場合、ハイブリッドノードでウェブフックを実行できます。オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にするために使用できる手法がいくつかあります。具体的には、ボーダーゲートウェイプロトコル (BGP)、静的ルート、その他のカスタムルーティングソリューションなどです。BGP はカスタムまたは手動でルート設定する必要がある代替ソリューションよりもスケーラブルで管理しやすいため、推奨されるソリューションです。AWS は、ポッド CIDR をアドバタイズするための Cilium と Calico の BGP 機能をサポートしています。詳細については、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」および「[ルーティング可能なリモートポッド CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)」を参照してください。

 **ルーティング不可能なポッドネットワーク** 

オンプレミスポッド CIDR をオンプレミスネットワークでルーティング可能にすることが*できず*、ウェブフックを実行する必要がある場合、すべてのウェブフックをハイブリッドノードと同じ EKS クラスターのクラウドノードで実行することが推奨されます。

## 混合モードクラスターの考慮事項
<a name="hybrid-nodes-considerations-mixed-mode"></a>

 *混合モードクラスター*は、ハイブリッドノードと AWS クラウドで実行中のノードの両方を備えた EKS クラスターであると定義されています。混合モードクラスターを実行する場合は、以下の推奨事項を検討してください。
+ AWS Cloud 内のノードでは VPC CNI を実行し、ハイブリッドノードでは Cilium または Calico を実行します。AWS では、AWS Cloud 内のノードで Cilium と Calico を実行する操作はサポートされていません。
+ AWS Cloud 内のノードで動作するようにウェブフックを設定します。AWS およびコミュニティアドオンのウェブフックを設定する方法については、「[アドオン用のウェブフックを設定する](#hybrid-nodes-webhooks-add-ons)」を参照してください。
+ アプリケーションの要件により AWS Cloud 内のノードで実行中のポッドがハイブリッドノードで実行中のポッドと直接通信 (「東西通信」) しなければならず、かつ AWS Cloud 内のノードでは VPC CNI が使用され、ハイブリッドノードでは Cilium または Calico が使用されている場合は、オンプレミスネットワークでオンプレミスポッド CIDR がルーティング可能である必要があります。
+ AWS クラウドのノードで少なくとも 1 つの CoreDNS レプリカを実行し、ハイブリッドノードで少なくとも 1 つの CoreDNS レプリカを実行してください。
+ サービストラフィック分散を設定し、Service トラフィックを発信元のゾーン内に留めます。サービストラフィック分散の詳細については、「[サービストラフィック分散の設定](#hybrid-nodes-mixed-service-traffic-distribution)」を参照してください。
+ ハイブリッドノードで実行されているワークロードトラフィックに AWS Application Load Balancer (ALB) または Network Load Balancer (NLB) を使用している場合、ALB または NLB と使用されている IP ターゲットを AWS からルーティング可能である必要があります。
+ Metrics Server アドオンでは、EKS コントロールプレーンから Metrics Server ポッド IP アドレスへの接続が必要になります。ハイブリッドノードで Metrics Server アドオンを実行している場合は、オンプレミスネットワークでオンプレミスポッド CIDR をルーティングできる必要があります。
+ Amazon Managed Service for Prometheus (AMP) マネージドコレクターを使用してハイブリッドノードに関するメトリクスを収集するには、オンプレミスネットワークでオンプレミスポッド CIDR をルーティングできる必要があります。または、EKS コントロールプレーンメトリクスおよび AWS クラウドで実行されているリソースに AMP マネージドコレクターを使用し、AWS Distro for OpenTelemetry (ADOT) アドオンを使用してハイブリッドノードのメトリクスを収集することもできます。

## 混合モードクラスターの設定
<a name="hybrid-nodes-mixed-mode"></a>

クラスターで実行中のミューテーション用と検証用のウェブフックを表示するには、クラスターの EKS コンソールの **[リソース]** パネルで **[拡張機能]** リソースタイプを表示するか、以下のコマンドを使用します。EKS は、クラスターオブザーバビリティダッシュボードにウェブフックメトリクスもレポートします。詳細については、「[オブザーバビリティダッシュボードを使用してクラスターをモニタリングする](observability-dashboard.md)」を参照してください。

```
kubectl get mutatingwebhookconfigurations
```

```
kubectl get validatingwebhookconfigurations
```

### サービストラフィック分散の設定
<a name="hybrid-nodes-mixed-service-traffic-distribution"></a>

混合モードクラスターを実行する際、[https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution](https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution)を使用してサービストラフィックを発信元のゾーン内に留めることが推奨されます。サービストラフィック分散 (EKS では Kubernetes バージョン 1.31 以降で利用可能) は、[Topology Aware Routing](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/) よりも予測性に優れているため、推奨されるソリューションです。サービストラフィック分散を使用すると、ゾーン内の正常なエンドポイントはそのゾーンのすべてのトラフィックが受信されます。Topology Aware Routing を使用すると、カスタムルーティングを適用するために各サービスはそのゾーンの複数の条件を満たす必要があります。そうでない場合、トラフィックはすべてのエンドポイントに均等にルーティングされます。

Cilium を CNI として使用している場合は、`enable-service-topology` を `true` に設定して CNI を実行し、Service Traffic Distribution を有効にする必要があります。この設定は Helm インストールフラグ `--set loadBalancer.serviceTopology=true` で渡すことができます。あるいは、Cilium CLI コマンド `cilium config set enable-service-topology true` を使用して既存のインストールを更新することもできます。既存のインストールの設定を更新した場合は、その後に各ノードで実行されている Cilium エージェントを再起動する必要があります。

CoreDNS サービスにサービストラフィック分散を設定する方法の例は、次のセクションで示されています。意図しない環境間トラフィックを回避するには、クラスター内のすべてのサービスに同じ設定を有効にすることが推奨されます。

### CoreDNS レプリカを設定する
<a name="hybrid-nodes-mixed-coredns"></a>

ハイブリッドノードと AWS クラウド内のノードの両方を備える混合モードのクラスターを実行している場合は、ハイブリッドノードと AWS クラウド内のノードのそれぞれに CoreDNS レプリカを 1 つ以上作成しておくことが推奨されます。混合モードクラスターの設定でレイテンシーとネットワークの問題を回避するには、[Service Traffic Distribution](https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution) を使って最も近くにある CoreDNS レプリカを優先するように CoreDNS サービスを設定します。

 *Service Traffic Distribution* (EKS で Kubernetes バージョン 1.31 以降で使用可能) は、[Topology Aware Routing](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/) よりも予測性に優れているため、推奨される方法です。Service Traffic Distribution では、ゾーン内の正常なエンドポイントは、そのゾーンのすべてのトラフィックを受信します。Topology Aware Routing の場合、カスタムルーティングを適用するには各サービスがそのゾーンの複数の条件を満たしている必要があります。満たしていない場合、トラフィックはすべてのエンドポイントに均等にルーティングされます。以下のステップで、Service Traffic Distribution を設定していきます。

Cilium を CNI として使用している場合は、`enable-service-topology` を `true` に設定して CNI を実行し、Service Traffic Distribution を有効にする必要があります。この設定は Helm インストールフラグ `--set loadBalancer.serviceTopology=true` で渡すことができます。あるいは、Cilium CLI コマンド `cilium config set enable-service-topology true` を使用して既存のインストールを更新することもできます。既存のインストールの設定を更新した場合は、その後に各ノードで実行されている Cilium エージェントを再起動する必要があります。

1. ハイブリッドノードごとにトポロジゾーンラベルを追加します。例えば、`topology.kubernetes.io/zone: onprem` とします。または、`nodeadm` 設定でラベルを指定することで、`nodeadm init` フェーズのラベルを設定できます。「[kubelet をカスタマイズするためのノード設定 (オプション)](hybrid-nodes-nodeadm.md#hybrid-nodes-nodeadm-kubelet)」を参照してください。なお、AWS Cloud で実行されているノードは、自身のアベイラビリティーゾーン (AZ) に対応するトポロジゾーンラベルを自動的に適用します。

   ```
   kubectl label node hybrid-node-name topology.kubernetes.io/zone=zone
   ```

1. トポロジゾーンキーを使用して `podAntiAffinity` を CoreDNS デプロイに追加します。または、EKS アドオンを使用してインストール時に CoreDNS デプロイを設定することもできます。

   ```
   kubectl edit deployment coredns -n kube-system
   ```

   ```
   spec:
     template:
       spec:
         affinity:
          ...
           podAntiAffinity:
             preferredDuringSchedulingIgnoredDuringExecution:
             - podAffinityTerm:
                 labelSelector:
                   matchExpressions:
                   - key: k8s-app
                     operator: In
                     values:
                     - kube-dns
                 topologyKey: kubernetes.io/hostname
               weight: 100
             - podAffinityTerm:
                 labelSelector:
                   matchExpressions:
                   - key: k8s-app
                     operator: In
                     values:
                     - kube-dns
                 topologyKey: topology.kubernetes.io/zone
               weight: 50
         ...
   ```

1. `trafficDistribution: PreferClose` 設定を `kube-dns` サービス設定に追加し、サービストラフィック分散を有効にします。

   ```
   kubectl patch svc kube-dns -n kube-system --type=merge -p '{
     "spec": {
       "trafficDistribution": "PreferClose"
     }
   }'
   ```

1. `kube-dns` サービスのエンドポイントスライスを表示することで、Service Traffic Distribution が有効になっていることを確認できます。エンドポイントスライスにはトポロジーゾーンのラベルの `hints` が表示されているはずです。これで、Service Traffic Distribution が有効になっていることが確認できます。各エンドポイントアドレスの `hints` が表示されなければ、Service Traffic Distribution は有効になっていません。

   ```
   kubectl get endpointslice -A | grep "kube-dns"
   ```

   ```
   kubectl get endpointslice [.replaceable]`kube-dns-<id>`  -n kube-system -o yaml
   ```

   ```
   addressType: IPv4
   apiVersion: discovery.k8s.io/v1
   endpoints:
   - addresses:
     - <your-hybrid-node-pod-ip>
     hints:
       forZones:
       - name: onprem
     nodeName: <your-hybrid-node-name>
     zone: onprem
   - addresses:
     - <your-cloud-node-pod-ip>
     hints:
       forZones:
       - name: us-west-2a
     nodeName: <your-cloud-node-name>
     zone: us-west-2a
   ```

### アドオン用のウェブフックを設定する
<a name="hybrid-nodes-webhooks-add-ons"></a>

以下のアドオンは、ウェブフックを使用しており、ハイブリッドノードでの使用がサポートされています。
+  AWS ロードバランサーコントローラー
+ Amazon CloudWatch オベサビリティ エージェント
+  AWS オープンテレメトリー用ディストリビューター (ADOT)
+  `cert-manager` 

これらのアドオンで使用されるウェブフックを AWS クラウド内のノードで実行するように設定する方法については、以下のセクションを参照してください。

#### AWS ロードバランサーコントローラー
<a name="hybrid-nodes-mixed-lbc"></a>

AWS Load Balancer Controller を混合モードクラスターの設定で使用するには、このコントローラーを AWS クラウドのノードで実行する必要があります。それには、Helm 値の設定に以下を追加するか、EKS アドオン設定を使用して値を指定します。

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
```

#### Amazon CloudWatch オベサビリティ エージェント
<a name="hybrid-nodes-mixed-cwagent"></a>

CloudWatch Observability Agent アドオンには、ウェブフックを使用する Kubernetes Operator があります。混合モードクラスター設定の AWS Cloud 内のノードでオペレーターを実行するには、CloudWatch Observability エージェントオペレーター設定を編集します。インストール時に Helm と EKS アドオンを使用してオペレーターアフィニティを設定することはできません (「[containers-roadmap issue \$12431](https://github.com/aws/containers-roadmap/issues/2431)」を参照のこと)。

```
kubectl edit -n amazon-cloudwatch deployment amazon-cloudwatch-observability-controller-manager
```

```
spec:
  ...
  template:
    ...
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: eks.amazonaws.com/compute-type
                operator: NotIn
                values:
                - hybrid
```

#### AWS オープンテレメトリー用ディストリビューター (ADOT)
<a name="hybrid-nodes-mixed-adot"></a>

AWS Distro for OpenTelemetry (ADOT) アドオンには、ウェブフックを使用する Kubernetes Operator があります。混合モードクラスター設定の AWS クラウド内のノードでオペレーターを実行するには、Helm 値設定に以下を追加するか、EKS アドオン設定を使用して値を指定します。

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
```

ポッド CIDR をオンプレミスネットワークでルーティングできない場合は、ADOT コレクターをハイブリッドノードで実行して、ハイブリッドノードとそこで実行されているワークロードからメトリクスをスクレイピングする必要があります。これを行うには、カスタムリソース定義 (CRD) を編集します。

```
kubectl -n opentelemetry-operator-system edit opentelemetrycollectors.opentelemetry.io adot-col-prom-metrics
```

```
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: In
            values:
            - hybrid
```

ADOT コレクター CRD 設定で各 `scrape_configs` に以下の `relabel_configs` を追加することで、ハイブリッドノードとそこで実行されているリソースからのみメトリクスをスクレイピングするように ADOT コレクターを設定できます。

```
relabel_configs:
  - action: keep
    regex: hybrid
    source_labels:
    - __meta_kubernetes_node_label_eks_amazonaws_com_compute_type
```

ADOT アドオンには、ADOT オペレーターウェブフックで使用される TLS 証明書に `cert-manager` をインストールするための前提条件があります。`cert-manager` はウェブフックも実行し、次の Helm 値設定を使用して AWS クラウドのノードで実行するように設定することができます。

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
webhook:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
cainjector:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
startupapicheck:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
```

#### `cert-manager`
<a name="hybrid-nodes-mixed-cert-manager"></a>

`cert-manager` アドオンは、ウェブフックを実行し、以下の Helm 値設定を使用して AWS クラウド内のノードで実行するように設定することができます。

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
webhook:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
cainjector:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
startupapicheck:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
```

# ハイブリッドノードのプロキシを設定する
<a name="hybrid-nodes-proxy"></a>

オンプレミス環境でデータセンターまたはエッジ環境から出ていくトラフィックにプロキシサーバーを使用している場合は、プロキシサーバーを使用するように個別にノードとクラスターを設定する必要があります。

クラスター  
クラスターでは、プロキシサーバーを使用するように `kube-proxy` を設定する必要があります。Amazon EKS クラスターの作成後に `kube-proxy` を設定する必要があります。

ノード  
ノードでは、プロキシサーバーを使用するようにオペレーティングシステム、`containerd`、`kubelet`、Amazon SSM エージェントを設定する必要があります。こうした変更は、オペレーティングシステムイメージのビルドプロセス中に加えることも、各ハイブリッドノードで `nodeadm init` を実行する前に加えることもできます。

## ノードレベルの設定
<a name="_node_level_configuration"></a>

以下の設定は、オペレーティングシステムイメージに適用するか、各ハイブリッドノードで `nodeadm init` を実行する前に適用する必要があります。

### `containerd` プロキシ設定
<a name="_containerd_proxy_configuration"></a>

 `containerd` は、Kubernetes のデフォルトのコンテナ管理ランタイムです。インターネットアクセスにプロキシを使用している場合は、Kubernetes と Amazon EKS に必要なコンテナイメージをプルできるように `containerd` を設定する必要があります。

次の内容で、各ハイブリッドノード上の `/etc/systemd/system/containerd.service.d` ディレクトリに「`http-proxy.conf`」という名前のファイルを作成します。`proxy-domain` および `port` を環境の値で置き換えます。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### ユーザーデータからの `containerd` 設定
<a name="_containerd_configuration_from_user_data"></a>

このファイル用に `containerd.service.d` ディレクトリを作成する必要があります。systemd を再ロードして設定ファイルを選択すると、再起動しなくても済むようになります。AL2023 では、スクリプトを実行した時点で既にサービスが実行されている可能性があります。その場合は再起動も必要です。

```
mkdir -p /etc/systemd/system/containerd.service.d
echo '[Service]' > /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart containerd
```

### `kubelet` プロキシ設定
<a name="_kubelet_proxy_configuration"></a>

 `kubelet` は、各 Kubernetes ノードで実行される Kubernetes ノードエージェントであり、そのノードで実行されているノードとポッドの管理を担当します。オンプレミス環境でプロキシを使用している場合は、Amazon EKS クラスターのパブリックエンドポイントまたはプライベートエンドポイントと通信できるように `kubelet` を設定する必要があります。

次の内容で、各ハイブリッドノードの `/etc/systemd/system/kubelet.service.d/` ディレクトリに「`http-proxy.conf`」という名前のファイルを作成します。`proxy-domain` および `port` を環境の値で置き換えます。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### ユーザーデータからの `kubelet` 設定
<a name="_kubelet_configuration_from_user_data"></a>

このファイル用に `kubelet.service.d` ディレクトリを作成する必要があります。systemd を再ロードして設定ファイルを選択すると、再起動しなくても済むようになります。AL2023 では、スクリプトを実行した時点で既にサービスが実行されている可能性があります。その場合は再起動も必要です。

```
mkdir -p /etc/systemd/system/kubelet.service.d
echo '[Service]' > /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart kubelet
```

### `ssm` プロキシ設定
<a name="_ssm_proxy_configuration"></a>

 `ssm` は認証情報プロバイダーの 1 つであり、これを使用するとハイブリッドノードを初期化できます。`ssm` は、AWS での認証を実施し、`kubelet` によって使用される一時的な認証情報を生成します。オンプレミス環境でプロキシを使用し、ノードで `ssm` を認証情報プロバイダーとして使用している場合は、Amazon SSM サービスエンドポイントと通信できるように `ssm` を設定する必要があります。

オペレーティングシステムに応じて、各ハイブリッドノードに `http-proxy.conf` という名前でファイルを以下のパスに作成します。
+ Ubuntu - `/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d/http-proxy.conf` 
+ Amazon Linux 2023 および Red Hat Enterprise Linux - `/etc/systemd/system/amazon-ssm-agent.service.d/http-proxy.conf` 

ファイルには次の内容を入力します。`proxy-domain` および `port` を環境の値で置き換えます。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### ユーザーデータからの `ssm` 設定
<a name="_ssm_configuration_from_user_data"></a>

このファイル用に `ssm` システムサービスファイルディレクトリを作成する必要があります。ディレクトリパスは、ノードで使用されているオペレーティングシステムによって異なります。
+ Ubuntu - `/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d` 
+ Amazon Linux 2023 および Red Hat Enterprise Linux - `/etc/systemd/system/amazon-ssm-agent.service.d` 

ノードで使用されているオペレーティングシステムに応じて、以下の restart コマンドの systemd サービス名を置き換えます。
+ Ubuntu - `snap.amazon-ssm-agent.amazon-ssm-agent` 
+ Amazon Linux 2023 および Red Hat Enterprise Linux - `amazon-ssm-agent` 

```
mkdir -p systemd-service-file-directory
echo '[Service]' > [.replaceable]#systemd-service-file-directory/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://[.replaceable]#proxy-domain:port"' >> systemd-service-file-directory/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://[.replaceable]#proxy-domain:port"' >> [.replaceable]#systemd-service-file-directory/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> [.replaceable]#systemd-service-file-directory/http-proxy.conf
systemctl daemon-reload
systemctl restart [.replaceable]#systemd-service-name
```

### オペレーティングシステムのプロキシ設定
<a name="_operating_system_proxy_configuration"></a>

インターネットアクセスにプロキシを使用している場合は、オペレーティングシステムのパッケージマネージャーからハイブリッドノードの依存関係をプルできるようにオペレーティングシステムを設定する必要があります。

 **Ubuntu** 

1. 次のコマンドでプロキシを使用するように `snap` を設定します。

   ```
   sudo snap set system proxy.https=http://proxy-domain:port
   sudo snap set system proxy.http=http://proxy-domain:port
   ```

1. `apt` のプロキシを有効にするには、`/etc/apt/` ディレクトリに `apt.conf` という名前のファイルを作成します。proxy-domain と port を環境の値に置き換えます。

   ```
   Acquire::http::Proxy "http://proxy-domain:port";
   Acquire::https::Proxy "http://proxy-domain:port";
   ```

 **Amazon Linux 2023** 

1. プロキシを使用するように `dnf` を設定します。環境のプロキシドメイン値とポート値を使用してファイル `/etc/dnf/dnf.conf` を作成します。

   ```
   proxy=http://proxy-domain:port
   ```

 **Red Hat Enterprise Linux** 

1. プロキシを使用するように `yum` を設定します。環境のプロキシドメイン値とポート値を使用してファイル `/etc/yum.conf` を作成します。

   ```
   proxy=http://proxy-domain:port
   ```

### IAM Roles Anywhere のプロキシ設定
<a name="_iam_roles_anywhere_proxy_configuration"></a>

IAM Roles Anywhere 認証情報プロバイダーサービスは、`enableCredentialsFile` フラグと共に IAM Roles Anywhere と使用する際に認証情報を更新する役割があります ([EKS Pod Identity エージェント](hybrid-nodes-add-ons.md#hybrid-nodes-add-ons-pod-id) を参照)。オンプレミス環境でプロキシを使用している場合は、IAM Roles Anywhere エンドポイントと通信できるようにサービスを設定する必要があります。

次の内容で、`/etc/systemd/system/aws_signing_helper_update.service.d/` ディレクトリに「`http-proxy.conf`」という名前のファイルを作成します。`proxy-domain` および `port` を環境の値で置き換えます。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

## クラスター全体の設定
<a name="_cluster_wide_configuration"></a>

このセクションの設定は、Amazon EKS クラスターを作成した後、および各ハイブリッドノードで `nodeadm init` を実行する前に適用する必要があります。

### kube-proxy のプロキシ設定
<a name="_kube_proxy_proxy_configuration"></a>

Amazon EKS は、ハイブリッドノードがクラスターに参加すると、各ハイブリッドノードに DaemonSet として自動的に `kube-proxy` をインストールします。`kube-proxy` は、Amazon EKS クラスターのポッドによってバックアップされるサービス間のルーティングを有効にします。各ホストを設定するために、`kube-proxy` には Amazon EKS クラスターエンドポイントの DNS 解決が必要です。

1. 次のコマンドを使用して `kube-proxy` DaemonSet を編集する

   ```
   kubectl -n kube-system edit ds kube-proxy
   ```

   これにより、設定されたエディタで `kube-proxy` DaemonSet 定義が開きます。

1. `HTTP_PROXY` および `HTTPS_PROXY` の環境変数を追加します。`NODE_NAME` 環境変数は設定に既に存在している必要があります。`proxy-domain` と `port` を環境の値に置き換えます。

   ```
   containers:
     - command:
       - kube-proxy
       - --v=2
       - --config=/var/lib/kube-proxy-config/config - --hostname-override=$(NODE_NAME)
       env:
       - name: HTTP_PROXY
         value: http://proxy-domain:port
       - name: HTTPS_PROXY
         value: http://proxy-domain:port
       - name: NODE_NAME
         valueFrom:
           fieldRef:
             apiVersion: v1
             fieldPath: spec.nodeName
   ```

# ハイブリッドノード向けに Cilium BGP を設定する
<a name="hybrid-nodes-cilium-bgp"></a>

このトピックでは、Amazon EKS Hybrid Nodes の Cilium ボーダーゲートウェイプロトコル (BGP) を設定する方法について説明します。Cilium の BGP は [Cilium BGP コントロールプレーン](https://docs.cilium.io/en/stable/network/bgp-control-plane/bgp-control-plane/)と呼ばれる機能で、この機能を使用すると、ポッドアドレスとサービスアドレスをオンプレミスネットワークにアドバタイズできます。これ以外にオンプレミスネットワークでポッド CIDR をルーティング可能にする方法については、「[ルーティング可能なリモートポッド CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)」を参照してください。

## Cilium BGP を設定する
<a name="hybrid-nodes-cilium-bgp-configure"></a>

### 前提条件
<a name="_prerequisites"></a>
+ 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。

### 手順
<a name="_procedure"></a>

1. Cilium で BGP を使用してオンプレミスネットワークでポッドアドレスまたはサービスアドレスをアドバタイズするには、`bgpControlPlane.enabled: true` を使用して Cilium をインストールしている必要があります。既存の Cilium のデプロイで BGP を有効にする場合は、Cilium 演算子を再起動して BGP 設定を適用する必要があります (BGP が以前に有効になっていない場合)。Helm のインストール/アップグレードプロセスの一環として Cilium 演算子を再起動するには、Helm 値の `operator.rollOutPods` を `true` に設定します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --set bgpControlPlane.enabled=true
   ```

1. Cilium オペレーターとエージェントが再起動されて実行中であることを確認します。

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

1. `CiliumBGPClusterConfig` を定義したファイルを `cilium-bgp-cluster.yaml` という名前で作成します。ネットワーク管理者から次の情報を取得する必要が生じる場合があります。
   + Cilium を実行しているノードの ASN を使用して、`localASN` を設定します。
   + オンプレミスルーターの ASN を使用して、`peerASN` を設定します。
   + Cilium を実行している各ノードがピアリングするオンプレミスルーター IP を使用して、`peerAddress` を設定します。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPClusterConfig
     metadata:
       name: cilium-bgp
     spec:
       nodeSelector:
         matchExpressions:
         - key: eks.amazonaws.com/compute-type
           operator: In
           values:
           - hybrid
       bgpInstances:
       - name: "rack0"
         localASN: NODES_ASN
         peers:
         - name: "onprem-router"
           peerASN: ONPREM_ROUTER_ASN
           peerAddress: ONPREM_ROUTER_IP
           peerConfigRef:
             name: "cilium-peer"
     ```

1. Cilium BGP クラスター設定をクラスターに適用します。

   ```
   kubectl apply -f cilium-bgp-cluster.yaml
   ```

1. `CiliumBGPPeerConfig` リソースを使用して BGP ピア設定を定義するファイルを `cilium-bgp-peer.yaml` という名前で作成します。複数のピアが同じ設定を共有し、共通の `CiliumBGPPeerConfig` リソースを参照することができます。設定オプションの完全なリストについては、Cilium のドキュメントの「[BGP Peer configuration](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane-v2/#bgp-peer-configuration)」を参照してください。

   次の Cilium ピア設定の値は、ピアリング先のオンプレミスルーターの値と一致する必要があります。
   + `holdTimeSeconds` では、BGP ピアがキープアライブメッセージまたは更新メッセージを待機する時間を設定します。この時間を過ぎると、セッションのダウンが宣言されます。デフォルト値は 90 秒です。
   + `keepAliveTimeSeconds` では、BGP ピアが引き続き到達可能で、BGP セッションがアクティブかどうかを設定します。デフォルト値は 30 秒です。
   + `restartTimeSeconds` では、Cilium の BGP コントロールプレーンが再起動後に BGP セッションを再確立するまでにかかると見込まれる時間を設定します。デフォルト値は 120 秒です。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPPeerConfig
     metadata:
       name: cilium-peer
     spec:
       timers:
         holdTimeSeconds: 90
         keepAliveTimeSeconds: 30
       gracefulRestart:
         enabled: true
         restartTimeSeconds: 120
       families:
         - afi: ipv4
           safi: unicast
           advertisements:
             matchLabels:
               advertise: "bgp"
     ```

1. Cilium BGP ピア設定をクラスターに適用します。

   ```
   kubectl apply -f cilium-bgp-peer.yaml
   ```

1. `CiliumBGPAdvertisement` リソースを使用してポッド CIDR をオンプレミスネットワークにアドバタイズするファイルを `cilium-bgp-advertisement-pods.yaml` という名前で作成します。
   + `CiliumBGPAdvertisement` リソースは、関連付けられるアドバタイズタイプと属性を定義するために使用されます。以下の例では、ポッド CIDR のみをアドバタイズするように Cilium を設定しています。サービスアドレスをアドバタイズするように Cilium を設定する方法の詳細については、「[サービスタイプ LoadBalancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium-loadbalancer)」と「[Cilium クラスター内ロードバランシング](hybrid-nodes-load-balancing.md#hybrid-nodes-service-lb-cilium)」の例を参照してください。
   + Cilium エージェントを実行している各ハイブリッドノードは、アップストリーム BGP 対応ルーターとピアリングします。以下の例のように、Cilium の `advertisementType` が `PodCIDR` に設定されていると、各ノードは所有するポッド CIDR 範囲をアドバタイズします。詳細については、Cilium のドキュメントの「[BGP Advertisements configuration](https://docs.cilium.io/en/stable/network/bgp-control-plane/bgp-control-plane-v2/#bgp-advertisements)」を参照してください。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPAdvertisement
     metadata:
       name: bgp-advertisement-pods
       labels:
         advertise: bgp
     spec:
       advertisements:
         - advertisementType: "PodCIDR"
     ```

1. Cilium BGP アドバタイズ設定をクラスターに適用します。

   ```
   kubectl apply -f cilium-bgp-advertisement-pods.yaml
   ```

1. `cilium bgp peers` コマンドを使用して、BGP ピアリングが [Cilium CLI](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli) で機能していることを確認できます。出力には環境に応じた正しい値が表示され、セッションの状態が `established` と表示されているはずです。トラブルシューティングの詳細については「Cilium 資料」の「[トラブルシューティングおよび操作ガイド](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane/#troubleshooting-and-operation-guide)」を参照してください。

   以下の例では、Cilium エージェントを実行しているハイブリッドノードが 5 つあり、各ノードが所有するポッド CIDR 範囲をアドバタイズしています。

   ```
   cilium bgp peers
   ```

   ```
   Node                   Local AS    Peer AS               Peer Address        Session State   Uptime     Family         Received   Advertised
   mi-026d6a261e355fba7   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m58s   ipv4/unicast   1          2
   mi-082f73826a163626e   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h19m12s   ipv4/unicast   1          2
   mi-09183e8a3d755abf6   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m47s   ipv4/unicast   1          2
   mi-0d78d815980ed202d   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h19m12s   ipv4/unicast   1          2
   mi-0daa253999fe92daa   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m58s   ipv4/unicast   1          2
   ```

   ```
   cilium bgp routes
   ```

   ```
   Node                   VRouter       Prefix           NextHop   Age         Attrs
   mi-026d6a261e355fba7   NODES_ASN     10.86.2.0/26     0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-082f73826a163626e   NODES_ASN     10.86.2.192/26   0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-09183e8a3d755abf6   NODES_ASN     10.86.2.64/26    0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0d78d815980ed202d   NODES_ASN     10.86.2.128/26   0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0daa253999fe92daa   NODES_ASN     10.86.3.0/26     0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   ```

# ハイブリッドノード用に Kubernetes Ingress を設定する
<a name="hybrid-nodes-ingress"></a>

このトピックでは、Amazon EKS Hybrid Nodes で実行されているワークロード用に Kubernetes Ingress を設定する方法について説明します。[Kubernetes Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) は、クラスターの外部からクラスター内のサービスに至るまでの HTTP ルートと HTTPS ルートを公開します。Ingress リソースを利用するには、ネットワークトラフィックを処理するネットワークインフラストラクチャとネットワークコンポーネントをセットアップするために Kubernetes Ingress コントローラーが必要です。

 AWS は、EKS Hybrid Nodes で実行されているワークロード向けに AWS Application Load Balancer (ALB) と Cilium for Kubernetes Ingress をサポートしています。Ingress に ALB を使用するか Cilium を使用するかは、アプリケーショントラフィックのソースに基づきます。アプリケーショントラフィックの発信元が AWS リージョンである場合、AWS では AWS ALB と AWS Load Balancer Controller の使用を推奨しています。アプリケーショントラフィックの発信元がローカルのオンプレミス環境またはエッジ環境である場合、AWS では Cilium に組み込みの Ingress 機能の使用を推奨しています。この機能は、お使いの環境にロードバランサーインフラストラクチャを搭載しているかどうかにかかわらず使用できます。

![\[EKS Hybrid Nodes の Ingress\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-ingress.png)


## AWS Application Load Balancer
<a name="hybrid-nodes-ingress-alb"></a>

ハイブリッドノード上で実行されているワークロードのターゲットタイプが `ip` の場合、[AWS Load Balancer](aws-load-balancer-controller.md) と Application Load Balancer (ALB) を使用できます。ターゲットタイプ `ip` を使用している場合、ALB はトラフィックをポッドに直接転送して、Service レイヤーネットワークパスをバイパスします。ALB がハイブリッドノード上のポッド IP ターゲットに到達するためには、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能である必要があります。また、AWS Load Balancer Controller はウェブフックを使用し、EKS コントロールプレーンからの直接通信が必要です。詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」を参照してください。

### 考慮事項
<a name="_considerations"></a>
+ AWS Application Load Balancer と AWS Load Balancer Controller の詳細については、「[Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする](alb-ingress.md)」と「[Helm による AWS Load Balancer Controller のインストール](lbc-helm.md)」を参照してください。
+ AWS Application Load Balancer と AWS Network Load Balancer のどちらかを選択する方法については、「[Best Practices for Load Balancing](https://docs.aws.amazon.com/eks/latest/best-practices/load-balacing.html)」を参照してください。
+ AWS Application Load Balancer で Ingress リソース用に設定できる注釈のリストについては、「[AWS Load Balancer Controller Ingress annotations](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)」を参照してください。

### 前提条件
<a name="_prerequisites"></a>
+ 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。
+ 「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」の手順に従って Cilium BGP コントロールプレーンを有効にしていること。BGP を使用しない場合は、別の方法を使用して、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にする必要があります。オンプレミスポッド CIDR をルーティング可能にしないと、ALB はポッド IP ターゲットの登録も接続もできません。
+ コマンドライン環境に Helm がインストールされていること。詳細については、「[Setup Helm instructions](helm.md)」を参照してください。
+ コマンドライン環境に eksctl がインストールされていること。詳細については、「[eksctl install instructions](install-kubectl.md#eksctl-install-update)」を参照してください。

### 手順
<a name="_procedure"></a>

1. ユーザーに代わって AWS API を呼び出すことを許可する、AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
   ```

1. 前のステップでダウンロードしたポリシー を使用して、IAM ポリシーを作成します。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```

1. クラスター名 (`CLUSTER_NAME`)、AWS リージョン (`AWS_REGION`)、AWS アカウント ID (`AWS_ACCOUNT_ID`) の各値を自分の設定値に置き換えて、次のコマンドを実行します。

   ```
   eksctl create iamserviceaccount \
       --cluster=CLUSTER_NAME \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region AWS_REGION \
       --approve
   ```

1. eks-charts Helm チャートリポジトリを追加し、ローカル Helm リポジトリを更新して、チャートを最新の状態にします。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

   ```
   helm repo update eks
   ```

1. AWS Load Balancer コントローラをインストールします。クラスター名 (`CLUSTER_NAME`)、AWS リージョン (`AWS_REGION`)、VPC ID (`VPC_ID`)、AWS Load Balancer Controller Helm チャートバージョン (`AWS_LBC_HELM_VERSION`) の各値を自分の設定値に置き換えて、次のコマンドを実行します。ハイブリッドノードと AWS クラウド内のノードの両方を使用して混合モードクラスターを実行している場合は、「[AWS ロードバランサーコントローラー](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-lbc)」の手順に従ってクラウドノード上で AWS Load Balancer Controller を実行できます。
   + Helm チャートの最新バージョンを確認するには、`helm search repo eks/aws-load-balancer-controller --versions` を実行します。

     ```
     helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
       -n kube-system \
       --version AWS_LBC_HELM_VERSION \
       --set clusterName=CLUSTER_NAME \
       --set region=AWS_REGION \
       --set vpcId=VPC_ID \
       --set serviceAccount.create=false \
       --set serviceAccount.name=aws-load-balancer-controller
     ```

1. AWS Load Balancer Controller が正常にインストールされたことを確認します。

   ```
   kubectl get -n kube-system deployment aws-load-balancer-controller
   ```

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

1. サンプルアプリケーションを作成します。以下の例では、[Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) サンプルマイクロサービスアプリケーションを使用しています。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. 次の内容で、`my-ingress-alb.yaml` という名前のファイルを作成します。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       alb.ingress.kubernetes.io/load-balancer-name: "my-ingress-alb"
       alb.ingress.kubernetes.io/target-type: "ip"
       alb.ingress.kubernetes.io/scheme: "internet-facing"
       alb.ingress.kubernetes.io/healthcheck-path: "/details/1"
   spec:
     ingressClassName: alb
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. Ingress 設定をクラスターに適用します。

   ```
   kubectl apply -f my-ingress-alb.yaml
   ```

1. Ingress リソース用に ALB をプロビジョニングするには、数分かかる場合があります。ALB がプロビジョニングされると、ALB デプロイの DNS 名に対応するアドレスが Ingress リソースに割り当てられます。アドレスの形式は `<alb-name>-<random-string>.<region>.elb.amazonaws.com` です。

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS   HOSTS   ADDRESS                                                     PORTS   AGE
   my-ingress   alb     *       my-ingress-alb-<random-string>.<region>.elb.amazonaws.com   80      23m
   ```

1. ALB のアドレスを使用して Service にアクセスします。

   ```
   curl -s http//my-ingress-alb-<random-string>.<region>.elb.amazonaws.com:80/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
     "details": "This is the details page"
   }
   ```

## Cilium Ingress および Cilium Gateway の概要
<a name="hybrid-nodes-ingress-cilium"></a>

Cilium Ingress は、Cilium のアーキテクチャに組み込みの機能であり、Kubernetes Ingress API または Gateway API を使用して管理できます。既存の Ingress リソースがない場合、AWS では Gateway API から始めることを推奨しています。Kubernetes ネットワークリソースを柔軟かつ表現力豊かに定義および管理できるためです。[Kubernetes Gateway API](https://gateway-api.sigs.k8s.io/) の目的は、Kubernetes クラスターに Ingress、Load Balancing、Service Mesh のネットワークリソースを定義および管理する方法を標準化することにあります。

Cilium の Ingress 機能または Gateway 機能を有効にすると、Cilium オペレーターがクラスター内の Ingress/Gateway オブジェクトを照合し、各ノードの Envoy プロキシがレイヤー 7 (L7) ネットワークトラフィックを処理します。Cilium は、ロードバランサーなどの Ingress/Gateway インフラストラクチャを直接にはプロビジョニングしません。ロードバランサーと共に Cilium Ingress/Gateway を使用する場合は、ロードバランサーのツール (通常は Ingress コントローラーや Gateway コントローラー) を使用して、ロードバランサーのインフラストラクチャをデプロイおよび管理する必要があります。

Ingress/Gateway トラフィックの場合、Cilium がコアネットワークトラフィックと L3/L4 ポリシー適用を処理し、統合 Envoy プロキシが L7 ネットワークトラフィックを処理します。Cilium Ingress/Gateway の場合、Envoy が L7 ルーティングルール、ポリシー、リクエスト操作の適用、高度なトラフィック管理 (トラフィックの分割やミラーリングなど)、TLS の終了と発信を行います。Cilium の Envoy プロキシは、デフォルトでは独立した DaemonSet (`cilium-envoy`) としてデプロイされます。これにより、Envoy と Cilium エージェントを個別に更新、スケール、管理できます。

Cilium Ingress と Cilium Gateway の仕組みの詳細については、Cilium のドキュメントの「[Cilium Ingress](https://docs.cilium.io/en/stable/network/servicemesh/ingress/)」ページと「[Cilium Gateway](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/)」ページを参照してください。

## Cilium Ingress と Cilium Gateway の比較
<a name="hybrid-nodes-ingress-cilium-comparison"></a>

以下の表に、Cilium **バージョン 1.17.x** の Cilium Ingress 機能と Cilium Gateway 機能をまとめます。


| 機能 | Ingress | ゲートウェイ | 
| --- | --- | --- | 
|  サービスタイプ LoadBalancer  |  はい  |  あり  | 
|  サービスタイプ NodePort  |  あり  |  いいえ1   | 
|  ホストネットワーク  |  はい  |  あり  | 
|  共有ロードバランサー  |  はい  |  あり  | 
|  専用ロードバランサー  |  あり  |  なし2   | 
|  ネットワークポリシー  |  はい  |  あり  | 
|  プロトコル  |  レイヤー 7 (HTTP(S)、gRPC)  |  レイヤー 7 (HTTP(S)、gRPC)3   | 
|  TLS パススルー  |  はい  |  あり  | 
|  トラフィック管理  |  パスおよびホストのルーティング  |  パスおよびホストのルーティング、URL のリダイレクトと書き換え、トラフィックの分割、ヘッダーの変更  | 

 1 Cilium Gateway による NodePort サービスのサポートは、Cilium バージョン 1.18.x ([\$127273](https://github.com/cilium/cilium/pull/27273)) で予定されています

 2 Cilium Gateway による専用ロードバランサーのサポート ([\$125567](https://github.com/cilium/cilium/issues/25567))

 3 Cilium Gateway による TCP/UDP のサポート ([\$121929](https://github.com/cilium/cilium/issues/21929))

## Cilium Gateway をインストールする
<a name="hybrid-nodes-ingress-cilium-gateway-install"></a>

### 考慮事項
<a name="_considerations_2"></a>
+ Cilium では、以下の例に示すように、`nodePort.enabled` を `true` に設定する必要があります。Cilium の kube-proxy 置換機能を使用している場合は、`nodePort.enabled` を `true` に設定する必要はありません。
+ Cilium では、以下の例に示すように、`envoy.enabled` を `true` に設定する必要があります。
+ Cilium Gateway は、ロードバランサーモード (デフォルト) またはホストネットワークモードでデプロイできます。
+ Cilium Gateway をロードバランサーモードで使用する場合は、Gateway リソースに `service.beta.kubernetes.io/aws-load-balancer-type: "external"` 注釈を設定する必要があります。これにより、Cilium が Gateway リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しなくなります。
+ Cilium Gateway をホストネットワークモードで使用する場合、タイプ LoadBalancer の Service は無効になります。ホストネットワークモードは、ロードバランサーインフラストラクチャがない環境に有用です。詳細については、「[ホストネットワーク](#hybrid-nodes-ingress-cilium-host-network)」を参照してください。

### 前提条件
<a name="_prerequisites_2"></a>

1. コマンドライン環境に Helm がインストールされていること。「[Setup Helm instructions](helm.md)」を参照してください。

1. 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。

### 手順
<a name="_procedure_2"></a>

1. Kubernetes Gateway API カスタムリソース定義 (CRD) をインストールします。

   ```
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml
   ```

1. `cilium-gateway-values.yaml` というファイルを次の内容で作成します。以下の例では、デフォルトのロードバランサーモードを使用するように Cilium Gateway を設定しています。また、Envoy プロキシをハイブリッドノードでのみ実行するように設定している場合には、そのプロキシに別の `cilium-envoy` DaemonSet を使用するように設定しています。

   ```
   gatewayAPI:
     enabled: true
     # uncomment to use host network mode
     # hostNetwork:
     #   enabled: true
   nodePort:
     enabled: true
   envoy:
     enabled: true
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
   ```

1. Helm 値ファイルをクラスターに適用します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --values cilium-gateway-values.yaml
   ```

1. Cilium オペレーター、エージェント、Envoy ポッドが動作していることを確認します。

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-envoy-5pgnd                 1/1     Running   0          6m31s
   cilium-envoy-6fhg4                 1/1     Running   0          6m30s
   cilium-envoy-jskrk                 1/1     Running   0          6m30s
   cilium-envoy-k2xtb                 1/1     Running   0          6m31s
   cilium-envoy-w5s9j                 1/1     Running   0          6m31s
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

## Cilium Gateway を設定する
<a name="hybrid-nodes-ingress-cilium-gateway-configure"></a>

Cilium Gateway を Gateway オブジェクトで有効にするには、`gatewayClassName` を `cilium` に設定します。Cilium が Gateway リソース用に作成する Service を設定するには、Gateway オブジェクトの各種フィールドを使用します。ロードバランサーインフラストラクチャを設定するために Gateway コントローラーでよく使用される注釈を設定するには、Gateway オブジェクトの `infrastructure` フィールドを使用します。Cilium の LoadBalancer IPAM を使用する場合(「[サービスタイプ LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer)」の例を参照)に、タイプ LoadBalancer の Service に使用する IP アドレスを設定するには、Gateway オブジェクトの `addresses` フィールドを使用します。Gateway 設定の詳細については、「[Kubernetes Gateway API specification](https://gateway-api.sigs.k8s.io/reference/spec/#gateway)」を参照してください。

```
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
spec:
  gatewayClassName: cilium
  infrastructure:
    annotations:
      service.beta.kubernetes.io/...
      service.kuberentes.io/...
  addresses:
  - type: IPAddress
    value: <LoadBalancer IP address>
  listeners:
  ...
```

Cilium と Kubernetes Gateway の仕様では、GatewayClass、Gateway、HTTPRoute、GRPCRoute、ReferenceGrant の各リソースがサポートされています。
+ 使用可能なフィールドのリストについては、「[HTTPRoute](https://gateway-api.sigs.k8s.io/api-types/httproute/HTTPRoute)」と「[GRPCRoute](https://gateway-api.sigs.k8s.io/api-types/grpcroute/GRPCRoute)」の仕様を参照してください。
+ これらのリソースの使用と設定方法については、以下の「[Cilium Gateway をデプロイする](#hybrid-nodes-ingress-cilium-gateway-deploy)」セクションの例と[Cilium のドキュメント](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/#examples)の例を参照してください。

## Cilium Gateway をデプロイする
<a name="hybrid-nodes-ingress-cilium-gateway-deploy"></a>

1. サンプルアプリケーションを作成します。以下の例では、[Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) サンプルマイクロサービスアプリケーションを使用しています。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. アプリケーションが正常に動作していることを確認します。

   ```
   kubectl get pods
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   details-v1-766844796b-9965p       1/1     Running   0          81s
   productpage-v1-54bb874995-jmc8j   1/1     Running   0          80s
   ratings-v1-5dc79b6bcd-smzxz       1/1     Running   0          80s
   reviews-v1-598b896c9d-vj7gb       1/1     Running   0          80s
   reviews-v2-556d6457d-xbt8v        1/1     Running   0          80s
   reviews-v3-564544b4d6-cpmvq       1/1     Running   0          80s
   ```

1. 次の内容で、`my-gateway.yaml` という名前のファイルを作成します。以下の例では、`service.beta.kubernetes.io/aws-load-balancer-type: "external"` 注釈を使用して、Cilium が Gateway リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しないようにしています。

   ```
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
     name: my-gateway
   spec:
     gatewayClassName: cilium
     infrastructure:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-type: "external"
     listeners:
     - protocol: HTTP
       port: 80
       name: web-gw
       allowedRoutes:
         namespaces:
           from: Same
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute
   metadata:
     name: http-app-1
   spec:
     parentRefs:
     - name: my-gateway
       namespace: default
     rules:
     - matches:
       - path:
           type: PathPrefix
           value: /details
       backendRefs:
       - name: details
         port: 9080
   ```

1. クラスターに Gateway リソースを適用します。

   ```
   kubectl apply -f my-gateway.yaml
   ```

1. Gateway リソースとその対応する Service が作成されたことを確認します。この段階では、Gateway リソースの `ADDRESS` フィールドに IP アドレスもホスト名も入力されておらず、Gateway リソースのタイプ LoadBalancer の Service にも同じく IP アドレスもホスト名も割り当てられていないはずです。

   ```
   kubectl get gateway my-gateway
   ```

   ```
   NAME         CLASS    ADDRESS   PROGRAMMED   AGE
   my-gateway   cilium             True         10s
   ```

   ```
   kubectl get svc cilium-gateway-my-gateway
   ```

   ```
   NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
   cilium-gateway-my-gateway   LoadBalancer   172.16.227.247   <pending>     80:30912/TCP   24s
   ```

1. [サービスタイプ LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer) に進み、Cilium Load Balancer IPAM によって割り当てられた IP アドレスを使用するように Gateway リソースを設定します。さらに、[サービスタイプ NodePort](#hybrid-nodes-ingress-cilium-nodeport) または [ホストネットワーク](#hybrid-nodes-ingress-cilium-host-network) に進み、NodePort またはホストネットワークアドレスを使用するように Gateway リソースを設定します。

## Cilium Ingress をインストールする
<a name="hybrid-nodes-ingress-cilium-ingress-install"></a>

### 考慮事項
<a name="_considerations_3"></a>
+ Cilium では、以下の例に示すように、`nodePort.enabled` を `true` に設定する必要があります。Cilium の kube-proxy 置換機能を使用している場合は、`nodePort.enabled` を `true` に設定する必要はありません。
+ Cilium では、以下の例に示すように、`envoy.enabled` を `true` に設定する必要があります。
+ `ingressController.loadbalancerMode` を `dedicated` に設定した場合、Cilium は Ingress リソースごとに専用の Service を作成します。`ingressController.loadbalancerMode` を `shared` に設定した場合、Cilium はクラスター内のすべての Ingress リソースに対してタイプ LoadBalancer の共有 Service を作成します。`shared` ロードバランサーモードを使用する場合、`labels`、`annotations`、`type`、`loadBalancerIP` などの共有 Service の設定を Helm 値の `ingressController.service` セクションで行います。詳細については、「[Cilium Helm values reference](https://github.com/cilium/cilium/blob/v1.17.6/install/kubernetes/cilium/values.yaml#L887)」を参照してください。
+ `ingressController.default` を `true` に設定した場合、Cilium はクラスターのデフォルトの Ingress コントローラーとして設定され、`ingressClassName` が Ingress リソースに指定されていない場合でも Ingress エントリを作成します。
+ Cilium Ingress は、ロードバランサー (デフォルト)、ノードポート、ホストネットワークモードのいずれかでデプロイできます。Cilium をホストネットワークモードでインストールすると、タイプ LoadBalancer の Service およびタイプ NodePort モードの Service が無効になります。詳細については「[ホストネットワーク](#hybrid-nodes-ingress-cilium-host-network)」を参照してください。
+ Helm 値では常に `ingressController.service.annotations` を `service.beta.kubernetes.io/aws-load-balancer-type: "external"` に設定します。これにより、レガシー AWS クラウドプロバイダーは、[Cilium Helm チャート](https://github.com/cilium/cilium/blob/main/install/kubernetes/cilium/templates/cilium-ingress-service.yaml)によって作成されたデフォルトの `cilium-ingress` Service 用に Classic Load Balancer を作成しなくなります。

### 前提条件
<a name="_prerequisites_3"></a>

1. コマンドライン環境に Helm がインストールされていること。「[Setup Helm instructions](helm.md)」を参照してください。

1. 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。

### 手順
<a name="_procedure_3"></a>

1. `cilium-ingress-values.yaml` というファイルを次の内容で作成します。以下に、Cilium Ingress の設定例を示します。デフォルトのロードバランサー `dedicated` モードを使用すること、および Envoy プロキシに個別の `cilium-envoy` DaemonSet を使用してプロキシがハイブリッドノードでのみ動作することを設定しています。

   ```
   ingressController:
     enabled: true
     loadbalancerMode: dedicated
     service:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-type: "external"
   nodePort:
     enabled: true
   envoy:
     enabled: true
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
   ```

1. Helm 値ファイルをクラスターに適用します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --values cilium-ingress-values.yaml
   ```

1. Cilium オペレーター、エージェント、Envoy ポッドが動作していることを確認します。

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-envoy-5pgnd                 1/1     Running   0          6m31s
   cilium-envoy-6fhg4                 1/1     Running   0          6m30s
   cilium-envoy-jskrk                 1/1     Running   0          6m30s
   cilium-envoy-k2xtb                 1/1     Running   0          6m31s
   cilium-envoy-w5s9j                 1/1     Running   0          6m31s
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

## Cilium Ingress を設定する
<a name="hybrid-nodes-ingress-cilium-ingress-configure"></a>

Cilium Ingress を Ingress オブジェクトで有効にするには、`ingressClassName` を `cilium` に設定します。Cilium が Ingress リソース用に作成した Service を設定するには、`dedicated` ロードバランサーモードを使用している場合には Ingress オブジェクトを使用し、`shared` ロードバランサーモードを使用している場合には Cilium/Helm 設定を使用します。こうした注釈は、Ingress コントローラーがロードバランサーインフラストラクチャを設定するときや、サービスタイプ、ロードバランサーモード、ポート、TLS パススルーといった Service のその他の属性を設定するときによく使用されます。以下に、主な注釈を示します。サポートされている注釈の完全なリストについては、Cilium のドキュメントの「[Cilium Ingress annotations](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#supported-ingress-annotations)」を参照してください。


| 注釈 | 説明 | 
| --- | --- | 
|   `ingress.cilium.io/loadbalancer-mode`   |   `dedicated`: 各 Ingress リソースのタイプ LoadBalancer の専用 Service (デフォルト)。  `shared`: すべての Ingress リソースのタイプ LoadBalancer の単一の Service。  | 
|   `ingress.cilium.io/service-type`   |   `LoadBalancer`: Service は、タイプ LoadBalancer になります (デフォルト)。  `NodePort`: Service は、タイプ NodePort になります。  | 
|   `service.beta.kubernetes.io/aws-load-balancer-type`   |   `"external"`: レガシー AWS クラウドプロバイダーは、タイプ LoadBalancer の Service に対して Classic Load Balancer をプロビジョニングしなくなります。  | 
|   `lbipam.cilium.io/ips`   |  Cilium LoadBalancer IPAM から割り当てる IP アドレスのリスト  | 

Cilium と Kubernetes Ingress の仕様は、Ingress パスのマッチングルールとして完全一致、プレフィックス一致、実装固有一致をサポートしています。Cilium は、実装固有マッチングルールとして正規表現をサポートしています。詳細については、Cilium のドキュメントの「[Ingress path types and precedence](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#ingress-path-types-and-precedence)」と「[Path types examples](https://docs.cilium.io/en/stable/network/servicemesh/path-types/)」、さらにこのページの「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」セクションの例を参照してください。

以下に、Cilium Ingress オブジェクトの例を示します。

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    service.beta.kuberentes.io/...
    service.kuberentes.io/...
spec:
  ingressClassName: cilium
  rules:
  ...
```

## Cilium Ingress をデプロイする
<a name="hybrid-nodes-ingress-cilium-ingress-deploy"></a>

1. サンプルアプリケーションを作成します。以下の例では、[Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) サンプルマイクロサービスアプリケーションを使用しています。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. アプリケーションが正常に動作していることを確認します。

   ```
   kubectl get pods
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   details-v1-766844796b-9965p       1/1     Running   0          81s
   productpage-v1-54bb874995-jmc8j   1/1     Running   0          80s
   ratings-v1-5dc79b6bcd-smzxz       1/1     Running   0          80s
   reviews-v1-598b896c9d-vj7gb       1/1     Running   0          80s
   reviews-v2-556d6457d-xbt8v        1/1     Running   0          80s
   reviews-v3-564544b4d6-cpmvq       1/1     Running   0          80s
   ```

1. 次の内容で、`my-ingress.yaml` という名前のファイルを作成します。以下の例では、`service.beta.kubernetes.io/aws-load-balancer-type: "external"` 注釈を使用して、Cilium が Ingress リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しないようにしています。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "external"
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. Ingress リソースをクラスターに適用します。

   ```
   kubectl apply -f my-ingress.yaml
   ```

1. Ingress リソースおよびその対応する Service が作成されたことを確認します。この段階では、Ingress リソースの `ADDRESS` フィールドに IP アドレスもホスト名も入力されておらず、Ingress リソースのタイプ LoadBalancer の共有または専用 Service にも同じく IP アドレスもホスト名も割り当てられていないはずです。

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS    HOSTS   ADDRESS   PORTS   AGE
   my-ingress   cilium   *                 80      8s
   ```

   ロードバランサーモード `shared` の場合 

   ```
   kubectl -n kube-system get svc cilium-ingress
   ```

   ```
   NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress   LoadBalancer   172.16.217.48   <pending>     80:32359/TCP,443:31090/TCP   10m
   ```

   ロードバランサーモード `dedicated` の場合 

   ```
   kubectl -n default get svc cilium-ingress-my-ingress
   ```

   ```
   NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress-my-ingress   LoadBalancer   172.16.193.15   <pending>     80:32088/TCP,443:30332/TCP   25s
   ```

1. [サービスタイプ LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer) に進み、Cilium Load Balancer IPAM によって割り当てられた IP アドレスを使用するように Ingress リソースを設定します。さらに、[サービスタイプ NodePort](#hybrid-nodes-ingress-cilium-nodeport) または [ホストネットワーク](#hybrid-nodes-ingress-cilium-host-network) に進み、NodePort またはホストネットワークアドレスを使用するように Ingress リソースを設定します。

## サービスタイプ LoadBalancer
<a name="hybrid-nodes-ingress-cilium-loadbalancer"></a>

### 既存のロードバランサーインフラストラクチャ
<a name="_existing_load_balancer_infrastructure"></a>

デフォルトでは、Cilium Ingress の場合も Cilium Gateway の場合も、Cilium は Ingress/Gateway リソース用にタイプ LoadBalancer の Kubernetes Service を作成します。Cilium が作成した Service の属性を設定するには、Ingress リソースと Gateway リソースを使用します。Ingress リソースまたは Gateway リソースを作成すると、Ingress または Gateway 用に外部公開された IP アドレスまたはホスト名がロードバランサーインフラストラクチャから割り当てられます。このインフラストラクチャは通常、Ingress コントローラーまたは Gateway コントローラーによってプロビジョニングされます。

Ingress コントローラーと Gateway コントローラーの多くが、ロードバランサーインフラストラクチャを検出および設定する際に注釈を使用します。Ingress コントローラーと Gateway コントローラーのこうした注釈は、上記の例に示すように、Ingress リソースまたは Gateway リソースに設定します。サポートされている注釈については、Ingress コントローラーまたは Gateway コントローラーのドキュメントを参照してください。また、よく使用されるコントローラーのリストについては、[Kubernetes Ingress のドキュメント](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)と [Kubernetes Gateway のドキュメント](https://gateway-api.sigs.k8s.io/implementations/)を参照してください。

**重要**  
EKS Hybrid Nodes では、Cilium Ingress と Gateway を AWS Load Balancer Controller および AWS Network Load Balancer (NLB) と共に使用することはできません。これらを一緒に使用しようとすると、ターゲットが未登録になります。NLB の `target-type` が `ip` に設定されている場合 (EKS Hybrid Nodes で実行されるワークロードで NLB を使用するための要件)、NLB はタイプ LoadBalancer の Service を支援する Pod IP に直接接続しようとするためです。

### ロードバランサーインフラストラクチャなし
<a name="_no_load_balancer_infrastructure"></a>

環境にロードバランサーインフラストラクチャおよびその対応する Ingress/Gateway コントローラーがない場合、Ingress/Gateway リソースおよびその対応するタイプ LoadBalancer の Service を設定するには、Cilium の [Load Balancer IP Address Management](https://docs.cilium.io/en/stable/network/lb-ipam/) (LB IPAM) によって割り当てられた IP アドレスを使用します。Cilium LB IPAM は、オンプレミス環境の既知の IP アドレス範囲と共に設定できます。また、Cilium に組み込みのボーダーゲートウェイプロトコル (BGP) サポートまたは L2 のお知らせを使用して、LoadBalancer IP アドレスをオンプレミスネットワークにアドバタイズできます。

以下の例では、Ingress/Gateway リソースに使用する IP アドレスと共に Cilium の LB IPAM を設定する方法と、オンプレミスネットワークで LoadBalancer IP アドレスをアドバタイズするように Cilium BGP コントロールプレーンを設定する方法を示します。Cilium の LB IPAM 機能は、デフォルトで有効になっていますが、`CiliumLoadBalancerIPPool` リソースが作成されるまではアクティブ化されません。

#### 前提条件
<a name="_prerequisites_4"></a>
+ 「[Cilium Ingress をインストールする](#hybrid-nodes-ingress-cilium-ingress-install)」または「[Cilium Gateway をインストールする](#hybrid-nodes-ingress-cilium-gateway-install)」の手順に従って Cilium Ingress または Gateway がインストールされていること。
+ 「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」または「[Cilium Gateway をデプロイする](#hybrid-nodes-ingress-cilium-gateway-deploy)」の手順に従って、Cilium Ingress リソースまたは Gateway リソースがサンプルアプリケーションと共にデプロイされていること。
+ 「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」の手順に従って Cilium BGP コントロールプレーンを有効にしていること。BGP を使用しない場合にはこの前提条件をスキップできますが、Cilium LB IPAM によって割り当てられた LoadBalancer IP アドレスがオンプレミスネットワークでルーティング可能になるまで、Ingress リソースと Gateway リソースにアクセスできなくなります。

#### 手順
<a name="_procedure_4"></a>

1. 必要に応じて、Ingress リソースまたは Gateway リソースにパッチを適用してタイプ LoadBalancer の Service に特定の IP アドレスを使用するようにリクエストしてください。特定の IP アドレスをリクエストしないと、Cilium は後続のステップで `CiliumLoadBalancerIPPool` リソースに設定する IP アドレス範囲から IP アドレスを割り当てます。以下のコマンドでは、`LB_IP_ADDRESS` をタイプ LoadBalancer の Service 用にリクエストする IP アドレスに置き換えます。

    **ゲートウェイ** 

   ```
   kubectl patch gateway -n default my-gateway --type=merge -p '{
     "spec": {
       "addresses": [{"type": "IPAddress", "value": "LB_IP_ADDRESS"}]
     }
   }'
   ```

    **Ingress** 

   ```
   kubectl patch ingress my-ingress --type=merge -p '{
     "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}}
   }'
   ```

1. `CiliumLoadBalancerIPPool` リソースを使用して Ingress/Gateway リソースの Load Balancer IP アドレス範囲を設定するファイルを `cilium-lbip-pool-ingress.yaml` という名前で作成します。
   + Cilium Ingress を使用している場合、Cilium は Ingress リソース用に作成する Service に `cilium.io/ingress: "true"` ラベルを自動的に適用します。`CiliumLoadBalancerIPPool` リソース定義の `serviceSelector` フィールドでこのラベルを使用すると、LB IPAM の対象となる Service を選択できます。
   + Cilium Gateway を使用している場合は、`CiliumLoadBalancerIPPool` リソース定義の `serviceSelector` フィールドで `gateway.networking.k8s.io/gateway-name` ラベルを使用して、LB IPAM の対象となる Gateway リソースを選択できます。
   + `LB_IP_CIDR` を Load Balancer の IP アドレスに使用する IP アドレス範囲に置き換えます。単一の IP アドレスを選択するには、`/32` CIDR を使用します。詳細については、Cilium のドキュメントの「[LoadBalancer IP Address Management](https://docs.cilium.io/en/stable/network/lb-ipam/)」を参照してください。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumLoadBalancerIPPool
     metadata:
       name: bookinfo-pool
     spec:
       blocks:
       - cidr: "LB_IP_CIDR"
       serviceSelector:
         # if using Cilium Gateway
         matchExpressions:
           - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] }
         # if using Cilium Ingress
         matchLabels:
           cilium.io/ingress: "true"
     ```

1. `CiliumLoadBalancerIPPool` リソースをクラスターに適用します。

   ```
   kubectl apply -f cilium-lbip-pool-ingress.yaml
   ```

1. Ingress/Gateway リソースの IP アドレスが Cilium LB IPAM から割り当てられたことを確認します。

    **ゲートウェイ** 

   ```
   kubectl get gateway my-gateway
   ```

   ```
   NAME         CLASS    ADDRESS        PROGRAMMED   AGE
   my-gateway   cilium   LB_IP_ADDRESS    True         6m41s
   ```

    **Ingress** 

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS    HOSTS   ADDRESS        PORTS   AGE
   my-ingress   cilium   *       LB_IP_ADDRESS   80      10m
   ```

1. `CiliumBGPAdvertisement` リソースを使用して Ingress/Gateway リソースの LoadBalancer IP アドレスをアドバタイズするファイルを `cilium-bgp-advertisement-ingress.yaml` という名前で作成します。Cilium BGP を使用していない場合は、このステップをスキップできます。Ingress/Gateway リソースに使用する LoadBalancer IP アドレスは、次のステップでサービスをクエリできるように、オンプレミスネットワークでルーティング可能である必要があります。

   ```
   apiVersion: cilium.io/v2alpha1
   kind: CiliumBGPAdvertisement
   metadata:
     name: bgp-advertisement-lb-ip
     labels:
       advertise: bgp
   spec:
     advertisements:
       - advertisementType: "Service"
         service:
           addresses:
             - LoadBalancerIP
         selector:
           # if using Cilium Gateway
           matchExpressions:
             - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] }
           # if using Cilium Ingress
           matchLabels:
             cilium.io/ingress: "true"
   ```

1. `CiliumBGPAdvertisement` リソースをクラスターに適用します。

   ```
   kubectl apply -f cilium-bgp-advertisement-ingress.yaml
   ```

1. Cilium LB IPAM から割り当てられた IP アドレスを使用して、サービスにアクセスします。

   ```
   curl -s http://LB_IP_ADDRESS:80/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

## サービスタイプ NodePort
<a name="hybrid-nodes-ingress-cilium-nodeport"></a>

環境にロードバランサーインフラストラクチャおよびその対応する Ingress コントローラーがない場合、ロードバランサーインフラストラクチャを自己管理している場合、または DNS ベースのロードバランシングを使用している場合は、Ingress リソース用にタイプ NodePort の Service を作成するように Cilium Ingress を設定できます。Cilium Ingress と共に NodePort を使用する場合、タイプ NodePort の Service は各ノード上でポート範囲 30000～32767 のポートに公開されます。このモードでは、トラフィックは NodePort 上のクラスター内にあるノードに到達すると、サービスを支援するポッドに転送されます。このポッドは、同じノードにあることもあれば、別のノードにあることもあります。

**注記**  
Cilium Gateway による NodePort サービスのサポートは、Cilium バージョン 1.18.x ([\$127273](https://github.com/cilium/cilium/pull/27273)) で予定されています

### 前提条件
<a name="_prerequisites_5"></a>
+ 「[Cilium Ingress をインストールする](#hybrid-nodes-ingress-cilium-ingress-install)」の手順に従って Cilium Ingress がインストールされていること。
+ 「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」の手順に従って、Cilium Ingress リソースがサンプルアプリケーションと共にデプロイされていること。

### 手順
<a name="_procedure_5"></a>

1. 既存の Ingress リソース `my-ingress` にパッチを適用して、そのリソースをタイプ LoadBalancer の Service から NodePort に変更します。

   ```
   kubectl patch ingress my-ingress --type=merge -p '{
       "metadata": {"annotations": {"ingress.cilium.io/service-type": "NodePort"}}
   }'
   ```

   Ingress リソースをまだ作成していない場合は、次の Ingress 定義をクラスターに適用することで作成できます。以下の Ingress 定義では、「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」で説明されている Istio Bookinfo サンプルアプリケーションを使用していることに注意してください。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "external"
       "ingress.cilium.io/service-type": "NodePort"
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. Ingress リソース用の Service が、タイプ NodePort の Service を使用するように更新されたことを確認します。出力にある HTTP プロトコルのポートを書き留めます。以下の例では `32353` がこの HTTP ポートであり、後続のステップではこのポートを使用して Service をクエリします。タイプ NodePort の Service と共に Cilium Ingress を使用する利点は、パスとホストベースのルーティングを適用できるだけでなく、Ingress トラフィック用のネットワークポリシーも適用できることです。これは、Ingress のないタイプ NodePort の標準の Service ではできないことです。

   ```
   kubectl -n default get svc cilium-ingress-my-ingress
   ```

   ```
   NAME                        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress-my-ingress   NodePort   172.16.47.153   <none>        80:32353/TCP,443:30253/TCP   27m
   ```

1. クラスター内のノードの IP アドレスを取得します。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. ノードの IP アドレスと上記でキャプチャした NodePort を使用して、タイプ NodePort の Service にアクセスします。以下の例では、使用されるノード IP アドレスは `10.80.146.32` で、NodePort は `32353` です。これらをお使いの環境の値で置き換えます。

   ```
   curl -s http://10.80.146.32:32353/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

## ホストネットワーク
<a name="hybrid-nodes-ingress-cilium-host-network"></a>

タイプ NodePort の Service と同様に、ロードバランサーインフラストラクチャと Ingress または Gateway コントローラーがない場合や、外部ロードバランサーでロードバランシングを自己管理している場合は、ホストネットワークに Ingress リソースと Gateway リソースを直接公開するように Cilium Ingress および Cilium Gateway を設定できます。ホストネットワークモードが Ingress リソースまたは Gateway リソースに対して有効になっている場合、タイプ LoadBalancer の Service とタイプ NodePort モードの Service は自動的に無効になり、ホストネットワークモードは Ingress リソースまたは Gateway リソースごとにこれらの代替モードと相互に排他的になります。タイプ NodePort モードの Service と比較して、ホストネットワークモードは使用できるポート範囲の柔軟性が高く (NodePort の 30000～32767 という範囲に制限されません)、ホストネットワーク上で Envoy プロキシが動作するノードのサブセットを設定できます。

### 前提条件
<a name="_prerequisites_6"></a>
+ 「[Cilium Ingress をインストールする](#hybrid-nodes-ingress-cilium-ingress-install)」または「[Cilium Gateway をインストールする](#hybrid-nodes-ingress-cilium-gateway-install)」の手順に従って Cilium Ingress または Gateway がインストールされていること。

### 手順
<a name="_procedure_6"></a>

#### ゲートウェイ
<a name="_gateway"></a>

1. `cilium-gateway-host-network.yaml` という名前のファイルを作成し、次の内容を記述します。

   ```
   gatewayAPI:
     enabled: true
     hostNetwork:
       enabled: true
       # uncomment to restrict nodes where Envoy proxies run on the host network
       # nodes:
       #   matchLabels:
       #     role: gateway
   ```

1. クラスターにホストネットワーク Cilium Gateway 設定を適用します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     -f cilium-gateway-host-network.yaml
   ```

   Gateway リソースをまだ作成していない場合は、次の Gateway 定義をクラスターに適用することで作成できます。以下の Gateway 定義では、「[Cilium Gateway をデプロイする](#hybrid-nodes-ingress-cilium-gateway-deploy)」で説明されている Istio Bookinfo サンプルアプリケーションを使用しています。以下の例では、Gateway リソースは HTTP リスナーに `8111` ポートを使用するように設定されています。ホストネットワークで動作する Envoy プロキシの共有リスナーポートです。Gateway リソースに特権ポート (1023 未満) を使用する場合は、その手順を [Cilium のドキュメント](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/#bind-to-privileged-port)で確認してください。

   ```
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
     name: my-gateway
   spec:
     gatewayClassName: cilium
     listeners:
     - protocol: HTTP
       port: 8111
       name: web-gw
       allowedRoutes:
         namespaces:
           from: Same
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute
   metadata:
     name: http-app-1
   spec:
     parentRefs:
     - name: my-gateway
       namespace: default
     rules:
     - matches:
       - path:
           type: PathPrefix
           value: /details
       backendRefs:
       - name: details
         port: 9080
   ```

   適用した Cilium Envoy 設定を確認するには、次のコマンドを使用します。

   ```
   kubectl get cec cilium-gateway-my-gateway -o yaml
   ```

   `cilium-gateway-my-gateway` Service の Envoy リスナーポートを取得するには、次のコマンドを使用します。この例では、`8111` が共有リスナーポートです。

   ```
   kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
   ```

1. クラスター内のノードの IP アドレスを取得します。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. ノードの IP アドレスと `cilium-gateway-my-gateway` リソースのリスナーポートを使用して、Service にアクセスします。以下の例では、使用されるノード IP アドレスは `10.80.146.32` であり、リスナーポートは `8111` です。これらをお使いの環境の値で置き換えます。

   ```
   curl -s http://10.80.146.32:8111/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

#### Ingress
<a name="_ingress"></a>

アップストリームの Cilium の問題 ([\$134028](https://github.com/cilium/cilium/issues/34028)) により、ホストネットワークモードの Cilium Ingress では `loadbalancerMode: shared` を使用する必要があります。これにより、クラスター内のすべての Ingress リソースに対してタイプ ClusterIP の Service が 1 つだけ作成されます。Ingress リソースに特権ポート (1023 未満) を使用する場合は、その手順を [Cilium のドキュメント](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#bind-to-privileged-port)で確認してください。

1. `cilium-ingress-host-network.yaml` という名前のファイルを作成し、次の内容を記述します。

   ```
   ingressController:
     enabled: true
     loadbalancerMode: shared
     # This is a workaround for the upstream Cilium issue
     service:
       externalTrafficPolicy: null
       type: ClusterIP
     hostNetwork:
       enabled: true
       # ensure the port does not conflict with other services on the node
       sharedListenerPort: 8111
       # uncomment to restrict nodes where Envoy proxies run on the host network
       # nodes:
       #   matchLabels:
       #     role: ingress
   ```

1. クラスターにホストネットワーク Cilium Ingress 設定を適用します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     -f cilium-ingress-host-network.yaml
   ```

   Ingress リソースをまだ作成していない場合は、次の Ingress 定義をクラスターに適用することで作成できます。以下の Ingress 定義では、「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」で説明されている Istio Bookinfo サンプルアプリケーションを使用しています。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

   適用した Cilium Envoy 設定を確認するには、次のコマンドを使用します。

   ```
   kubectl get cec -n kube-system cilium-ingress -o yaml
   ```

   `cilium-ingress` Service の Envoy リスナーポートを取得するには、次のコマンドを使用します。この例では、`8111` が共有リスナーポートです。

   ```
   kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
   ```

1. クラスター内のノードの IP アドレスを取得します。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. ノードの IP アドレスと `cilium-ingress` リソースの `sharedListenerPort` を使用して、Service にアクセスします。以下の例では、使用されるノード IP アドレスは `10.80.146.32` であり、リスナーポートは `8111` です。これらをお使いの環境の値で置き換えます。

   ```
   curl -s http://10.80.146.32:8111/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

# ハイブリッドノード用にタイプ LoadBalancer の Service を設定する
<a name="hybrid-nodes-load-balancing"></a>

このトピックでは、Amazon EKS Hybrid Nodes で動作するアプリケーションに対してレイヤー 4 (L4) ロードバランシングを設定する方法について説明します。タイプ LoadBalancer の Kubernetes Service は、クラスターの外部に Kubernetes アプリケーションを公開するために使用されます。タイプ LoadBalancer の Service は、ワークロードのトラフィックを処理するために、クラウド環境やオンプレミス環境の物理的なロードバランサーインフラストラクチャと共によく使用されます。このロードバランサーインフラストラクチャは通常、環境固有のコントローラーでプロビジョニングされます。

 AWS は、EKS Hybrid Nodes で実行されているタイプ LoadBalancer の Service 用に AWS Network Load Balancer (NLB) と Cilium をサポートしています。NLB を使用するか、Cilium を使用するかは、アプリケーショントラフィックのソースに基づきます。AWS では、アプリケーショントラフィックの発信元が AWS リージョンである場合には AWS NLB と AWS Load Balancer Controller を使用することを推奨しています。AWS では、アプリケーショントラフィックの発信元がローカルのオンプレミス環境またはエッジ環境である場合には Cilium に組み込みのロードバランシング機能を使用することを推奨しています。この機能は、お使いの環境にロードバランサーインフラストラクチャを搭載しているかどうかにかかわらず使用できます。

レイヤー 7 (L7) アプリケーショントラフィックのロードバランシングについては、「[ハイブリッドノード用に Kubernetes Ingress を設定する](hybrid-nodes-ingress.md)」を参照してください。EKS によるロードバランシングの全般的な情報については、「[Best Practices for Load Balancing](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html)」を参照してください。

## AWS Network Load Balancer
<a name="hybrid-nodes-service-lb-nlb"></a>

ハイブリッドノード上で実行されているワークロードのターゲットタイプが `ip` の場合、[AWS Load Balancer](aws-load-balancer-controller.md) および NLB を使用できます。ターゲットタイプ `ip` を使用している場合、NLB はトラフィックをポッドに直接転送して、Service レイヤーネットワークパスをバイパスします。NLB がハイブリッドノードのポッド IP ターゲットに到達するためには、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能である必要があります。また、AWS Load Balancer Controller はウェブフックを使用し、EKS コントロールプレーンからの直接通信が必要です。詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」を参照してください。
+ サブネット設定要件については「[Network Load Balancer を使用して TCP および UDP トラフィックをルーティングする](network-load-balancing.md)」を参照し、AWS Network Load Balancer と AWS Load Balancer Controller の詳細については「[Helm による AWS Load Balancer Controller のインストール](lbc-helm.md)」と「[Best Practices for Load Balancing](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html)」を参照してください。
+ AWS Network Load Balancer でタイプ `LoadBalancer` の Service に適用できる設定については、「[AWS Load Balancer Controller NLB configurations](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/nlb/)」を参照してください。

### 前提条件
<a name="_prerequisites"></a>
+ 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。
+ 「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」の手順に従って Cilium BGP コントロールプレーンを有効にしていること。BGP を使用しない場合は、別の方法を使用して、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にする必要があります。詳細については、「[ルーティング可能なリモートポッド CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)」を参照してください。
+ コマンドライン環境に Helm がインストールされていること。「[Setup Helm instructions](helm.md)」を参照してください。
+ コマンドライン環境に eksctl がインストールされていること。「[Setup eksctl instructions](install-kubectl.md#eksctl-install-update)」を参照してください。

### 手順
<a name="_procedure"></a>

1. ユーザーに代わって AWS API を呼び出すことを許可する、AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
   ```

1. 前のステップでダウンロードしたポリシー を使用して、IAM ポリシーを作成します。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```

1. クラスター名 (`CLUSTER_NAME`)、AWS リージョン (`AWS_REGION`)、AWS アカウント ID (`AWS_ACCOUNT_ID`) の各値を自分の設定値に置き換えて、次のコマンドを実行します。

   ```
   eksctl create iamserviceaccount \
       --cluster=CLUSTER_NAME \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region AWS_REGION \
       --approve
   ```

1. eks-charts Helm チャートリポジトリを追加します。AWS は、このリポジトリを GitHub で管理しています。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. ローカル Helm リポジトリを更新して、最新のチャートがあることを確認します。

   ```
   helm repo update eks
   ```

1. AWS Load Balancer コントローラをインストールします。クラスター名 (`CLUSTER_NAME`)、AWS リージョン (`AWS_REGION`)、VPC ID (`VPC_ID`)、AWS Load Balancer Controller Helm チャートバージョン (`AWS_LBC_HELM_VERSION`) の各値を自分の設定値に置き換えます。Helm チャートの最新バージョンを確認するには、`helm search repo eks/aws-load-balancer-controller --versions` を実行します。ハイブリッドノードと AWS クラウド内のノードの両方を使用して混合モードクラスターを実行している場合は、「[AWS ロードバランサーコントローラー](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-lbc)」の手順に従ってクラウドノード上で AWS Load Balancer Controller を実行できます。

   ```
   helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
     -n kube-system \
     --version AWS_LBC_HELM_VERSION \
     --set clusterName=CLUSTER_NAME \
     --set region=AWS_REGION \
     --set vpcId=VPC_ID \
     --set serviceAccount.create=false \
     --set serviceAccount.name=aws-load-balancer-controller
   ```

1. AWS Load Balancer Controller が正常にインストールされたことを確認します。

   ```
   kubectl get -n kube-system deployment aws-load-balancer-controller
   ```

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

1. `tcp-sample-app.yaml` という名前のファイルにサンプルアプリケーションを定義します。以下の例では、TCP ポートでシンプルな NGINX デプロイを使用しています。

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: tcp-sample-app
     namespace: default
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
           - name: nginx
             image: public.ecr.aws/nginx/nginx:1.23
             ports:
               - name: tcp
                 containerPort: 80
   ```

1. デプロイをクラスターに適用します。

   ```
   kubectl apply -f tcp-sample-app.yaml
   ```

1. `tcp-sample-service.yaml` という名前のファイルにデプロイ用のタイプ LoadBalancer の Service を定義します。

   ```
   apiVersion: v1
   kind: Service
   metadata:
     name: tcp-sample-service
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: external
       service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
       service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
   spec:
     ports:
       - port: 80
         targetPort: 80
         protocol: TCP
     type: LoadBalancer
     selector:
       app: nginx
   ```

1. サービス設定をクラスターに適用します。

   ```
   kubectl apply -f tcp-sample-service.yaml
   ```

1. Service 用に NLB をプロビジョニングするには、数分かかる場合があります。NLB がプロビジョニングされると、NLB デプロイの DNS 名に対応するアドレスが Service に割り当てられます。

   ```
   kubectl get svc tcp-sample-service
   ```

   ```
   NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP                                                                    PORT(S)        AGE
   tcp-sample-service   LoadBalancer   172.16.115.212   k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com   80:30396/TCP   8s
   ```

1. NLB のアドレスを使用して Service にアクセスします。

   ```
   curl k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com
   ```

   以下に、出力例を示します。

   ```
   <!DOCTYPE html>
   <html>
   <head>
   <title>Welcome to nginx!</title>
   [...]
   ```

1. 作成した リソースをクリーンアップします。

   ```
   kubectl delete -f tcp-sample-service.yaml
   kubectl delete -f tcp-sample-app.yaml
   ```

## Cilium クラスター内ロードバランシング
<a name="hybrid-nodes-service-lb-cilium"></a>

Cilium は、EKS Hybrid Nodes で実行されているワークロードのクラスター内ロードバランサーとして使用できます。お使いの環境にロードバランサーインフラストラクチャがない場合に便利です。Cilium のロードバランシング機能は、kube-proxy 置換、Load Balancer IP Address Management (IPAM)、BGP コントロールプレーンなどの Cilium 機能を組み合わせて構築されています。これらの機能が担当する作業は以下のとおりです。
+  **Cilium kube-proxy 置換**: バックエンドポッドへの Service トラフィックのルーティングを処理します。
+  **Cilium Load Balancer IPAM**: タイプ `LoadBalancer` の Service に割り当てることができる IP アドレスを管理します。
+  **Cilium BGP コントロールプレーン**: Load Balancer IPAM が割り当てた IP アドレスをオンプレミスネットワークにアドバタイズします。

Cilium の kube-proxy 置換を使用していない場合でも、Cilium Load Balancer IPAM と BGP コントロールプレーンを使用して、タイプ LoadBalancer の Service 用に IP アドレスを配分して割り当てることができます。Cilium の kube-proxy 置換を使用しない場合、バックエンドポッドへの Service のロードバランシングは、デフォルトでは EKS の kube-proxy ルールと iptables ルールによって処理されます。

### 前提条件
<a name="_prerequisites_2"></a>
+ kube-proxy 置換が有効かどうかにかかわらず、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。Cilium の kube-proxy 置換を使用するには、v4.19.57、v5.1.16、v5.2.0 以降の最新の Linux カーネルでオペレーティングシステムを実行している必要があります。ハイブリッドノード上での用途に対応した最新バージョンのオペレーティングシステムであれば、Red Hat Enterprise Linux (RHEL) 8.x を除き、すべてこの基準を満たしています。
+ 「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」の手順に従って Cilium BGP コントロールプレーンを有効にしていること。BGP を使用しない場合は、別の方法を使用して、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にする必要があります。詳細については、「[ルーティング可能なリモートポッド CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)」を参照してください。
+ コマンドライン環境に Helm がインストールされていること。「[Setup Helm instructions](helm.md)」を参照してください。

### 手順
<a name="_procedure_2"></a>

1. `CiliumLoadBalancerIPPool` リソースを使用してタイプ Load Balancer の Service 用に LoadBalancer IP アドレス範囲を設定するファイルを `cilium-lbip-pool-loadbalancer.yaml` という名前で作成します。
   + `LB_IP_CIDR` を Load Balancer の IP アドレスに使用する IP アドレス範囲に置き換えます。単一の IP アドレスを選択するには、`/32` CIDR を使用します。詳細については、Cilium のドキュメントの「[LoadBalancer IP Address Management](https://docs.cilium.io/en/stable/network/lb-ipam/)」を参照してください。
   + `serviceSelector` フィールドは、後続のステップで作成する Service の名前と一致するように設定されています。この設定の場合、このプールの IP は `tcp-sample-service` という名前の Service にのみ割り当てられます。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumLoadBalancerIPPool
     metadata:
       name: tcp-service-pool
     spec:
       blocks:
       - cidr: "LB_IP_CIDR"
       serviceSelector:
         matchLabels:
           io.kubernetes.service.name: tcp-sample-service
     ```

1. `CiliumLoadBalancerIPPool` リソースをクラスターに適用します。

   ```
   kubectl apply -f cilium-lbip-pool-loadbalancer.yaml
   ```

1. プール内に使用可能な IP アドレスが少なくとも 1 つあることを確認します。

   ```
   kubectl get ciliumloadbalancerippools.cilium.io
   ```

   ```
   NAME               DISABLED   CONFLICTING   IPS AVAILABLE   AGE
   tcp-service-pool   false      False         1               24m
   ```

1. `CiliumBGPAdvertisement` リソースを使用して、次のステップで作成する Service 用にロードバランサー IP アドレスをアドバタイズするファイルを `cilium-bgp-advertisement-loadbalancer.yaml` という名前で作成します。Cilium BGP を使用していない場合は、このステップをスキップできます。Service に使用するロードバランサー IP アドレスは、最終ステップでサービスをクエリできるように、オンプレミスネットワークでルーティング可能である必要があります。
   + `LoadBalancerIP` をタイプ `LoadBalancer` の Service 用にのみアドバタイズするように、`advertisementType` フィールドは `Service` に設定され、`service.addresses` は `LoadBalancerIP` に設定されます。
   + `selector` フィールドは、後続のステップで作成する Service の名前と一致するように設定されています。この設定の場合、`tcp-sample-service` という名前の Service 用に `LoadBalancerIP` のみがアドバタイズされます。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPAdvertisement
     metadata:
       name: bgp-advertisement-tcp-service
       labels:
         advertise: bgp
     spec:
       advertisements:
         - advertisementType: "Service"
           service:
             addresses:
               - LoadBalancerIP
           selector:
             matchLabels:
               io.kubernetes.service.name: tcp-sample-service
     ```

1. `CiliumBGPAdvertisement` リソースをクラスターに適用します。Cilium BGP を使用していない場合は、このステップをスキップできます。

   ```
   kubectl apply -f cilium-bgp-advertisement-loadbalancer.yaml
   ```

1. `tcp-sample-app.yaml` という名前のファイルにサンプルアプリケーションを定義します。以下の例では、TCP ポートでシンプルな NGINX デプロイを使用しています。

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: tcp-sample-app
     namespace: default
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
           - name: nginx
             image: public.ecr.aws/nginx/nginx:1.23
             ports:
               - name: tcp
                 containerPort: 80
   ```

1. デプロイをクラスターに適用します。

   ```
   kubectl apply -f tcp-sample-app.yaml
   ```

1. `tcp-sample-service.yaml` という名前のファイルにデプロイ用のタイプ LoadBalancer の Service を定義します。
   + Service オブジェクトの `lbipam.cilium.io/ips` 注釈を使用して、ロードバランサー IP プールから特定の IP アドレスをリクエストできます。Service 用に特定の IP アドレスをリクエストしない場合は、この注釈を削除してもかまいません。
   + レガシー AWS クラウドプロバイダーが Service の Classic Load Balancer を作成できないようにするには、`loadBalancerClass` 仕様フィールドが必要です。以下の例では、`io.cilium/bgp-control-plane` が Cilium の BGP コントロールプレーンをロードバランサークラスとして使用するように、このフィールドを設定しています。また、`io.cilium/l2-announcer` が Cilium の [L2 Announcements 機能](https://docs.cilium.io/en/latest/network/l2-announcements/)を使用するように、このフィールドを設定することもできます (現時点ではベータ版であり、AWS による正式なサポートはありません)。

     ```
     apiVersion: v1
     kind: Service
     metadata:
       name: tcp-sample-service
       namespace: default
       annotations:
         lbipam.cilium.io/ips: "LB_IP_ADDRESS"
     spec:
       loadBalancerClass: io.cilium/bgp-control-plane
       ports:
         - port: 80
           targetPort: 80
           protocol: TCP
       type: LoadBalancer
       selector:
         app: nginx
     ```

1. サービスをクラスターに適用します。Service は、アプリケーションへのアクセスに使用できる外部 IP アドレスと共に作成されます。

   ```
   kubectl apply -f tcp-sample-service.yaml
   ```

1. Service が正常に作成されて、前のステップで作成した `CiliumLoadBalancerIPPool` から IP が割り当てられていることを確認します。

   ```
   kubectl get svc tcp-sample-service
   ```

   ```
   NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
   tcp-sample-service   LoadBalancer   172.16.117.76   LB_IP_ADDRESS   80:31129/TCP   14m
   ```

1. kube-proxy 置換モードで Cilium を使用している場合は、次のコマンドを実行して、Cilium が Service のロードバランシングを処理していることを確認できます。以下の出力では、`10.86.2.x` アドレスは Service のバックエンドポッドのポッド IP アドレスです。

   ```
   kubectl -n kube-system exec ds/cilium -- cilium-dbg service list
   ```

   ```
   ID   Frontend               Service Type   Backend
   ...
   41   LB_IP_ADDRESS:80/TCP   LoadBalancer   1 => 10.86.2.76:80/TCP (active)
                                              2 => 10.86.2.130:80/TCP (active)
                                              3 => 10.86.2.141:80/TCP (active)
   ```

1. Cilium が BGP を介してオンプレミスネットワークに IP アドレスをアドバタイズしていることを確認します。以下の例では、ハイブリッドノードが 5 つあり、それぞれが `tcp-sample-service` Service の `LB_IP_ADDRESS` をオンプレミスネットワークにアドバタイズしています。

   ```
   Node                   VRouter      Prefix             NextHop   Age     Attrs
   mi-026d6a261e355fba7   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-082f73826a163626e   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-09183e8a3d755abf6   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0d78d815980ed202d   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0daa253999fe92daa   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   ```

1. 割り当てられたロードバランサー IP アドレスを使用して Service にアクセスします。

   ```
   curl LB_IP_ADDRESS
   ```

   以下に、出力例を示します。

   ```
   <!DOCTYPE html>
   <html>
   <head>
   <title>Welcome to nginx!</title>
   [...]
   ```

1. 作成した リソースをクリーンアップします。

   ```
   kubectl delete -f tcp-sample-service.yaml
   kubectl delete -f tcp-sample-app.yaml
   kubectl delete -f cilium-lb-ip-pool.yaml
   kubectl delete -f cilium-bgp-advertisement.yaml
   ```

# ハイブリッドノード用に Kubernetes ネットワークポリシーを設定する
<a name="hybrid-nodes-network-policies"></a>

 AWS は、EKS Hybrid Nodes と共に Cilium を CNI として使用する際に、ポッドの受信トラフィックと送信トラフィック用に Kubernetes ネットワークポリシー (レイヤー 3/レイヤー 4) をサポートします。AWS クラウド内のノードで EKS クラスターを実行している場合、AWS は [Kubernetes ネットワークポリシー用の Amazon VPC CNI](cni-network-policy.md) をサポートします。

このトピックでは、EKS Hybrid Nodes で Cilium および Kubernetes ネットワークポリシーを設定する方法について説明します。Kubernetes ネットワークポリシーの詳細については、Kubernetes のドキュメントの「[Kubernetes Network Policies](https://kubernetes.io/docs/concepts/services-networking/network-policies/)」を参照してください。

## ネットワークポリシーの設定
<a name="hybrid-nodes-configure-network-policies"></a>

### 考慮事項
<a name="_considerations"></a>
+  AWS は、ポッドの送受信に関するアップストリームの Kubernetes ネットワークポリシーと仕様をサポートしています。AWS は、現時点では `CiliumNetworkPolicy` や `CiliumClusterwideNetworkPolicy` をサポートしていません。
+ `policyEnforcementMode` Helm 値を使用すると、デフォルトの Cilium ポリシーの適用動作を制御できます。デフォルトの動作では、すべての送受信トラフィックが許可されます。ネットワークポリシーによってエンドポイントが選択されると、default-deny 状態に遷移して、明示的に許可したトラフィックのみが許可されます。[デフォルトポリシーモード](https://docs.cilium.io/en/stable/security/policy/intro/#policy-mode-default)と[ポリシー適用モード](https://docs.cilium.io/en/stable/security/policy/intro/#policy-enforcement-modes)の詳細については、Cilium のドキュメントを参照してください。
+ 既存の Cilium インストールで `policyEnforcementMode` を変更する場合は、Cilium エージェント DaemonSet を再起動して、変更後のポリシー適用モードを適用する必要があります。
+ `namespaceSelector` および `podSelector` を使用すると、ラベルが一致する名前空間およびポッドに対してトラフィックを許可または拒否できます。`namespaceSelector` および `podSelector` を `matchLabels` または `matchExpressions` と共に使用すると、それぞれのラベルに基づいて名前空間とポッドを選択できます。
+ `ingress.ports` および `egress.ports` を使用すると、ポートおよびプロトコルに対してトラフィックを許可または拒否できます。
+ `ipBlock` フィールドでは、ポッド IP アドレス ([\$19209](https://github.com/cilium/cilium/issues/9209)) に対してトラフィックを選択的に許可または拒否することはできません。ノード IP に `ipBlock` セレクターを使用する機能は、Cilium のベータ機能であり、AWS ではサポートされていません。
+ Kubernetes ネットワークポリシーに使用可能なフィールドの詳細については、Kubernetes のドキュメントの「[NetworkPolicy resource](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)」を参照してください。

### 前提条件
<a name="_prerequisites"></a>
+ 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。
+ コマンドライン環境に Helm がインストールされていること。「[Setup Helm instructions](helm.md)」を参照してください。

### 手順
<a name="_procedure"></a>

次の手順では、コンポーネントがアプリケーションの動作に必要な他のコンポーネントとのみ通信できるように、サンプルマイクロサービスアプリケーション用のネットワークポリシーを設定します。この手順では、[Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) サンプルマイクロサービスアプリケーションを使用します。

Bookinfo アプリケーションは、4 つの個別のマイクロサービスで構成されており、以下のような関係があります。
+  **productpage**。productpage マイクロサービスは、details マイクロサービスと reviews マイクロサービスを呼び出して、ページに値を入力します。
+  **details**。details マイクロサービスには、書籍情報が含まれています。
+  **reviews**。reviews マイクロサービスには、書籍レビューが含まれています。また、ratings マイクロサービスも呼び出します。
+  **ratings**。ratings マイクロサービスには、書籍レビューに伴う書籍ランキング情報が含まれています。

  1. サンプルアプリケーションを作成します。

     ```
     kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     ```

  1. サンプルアプリケーションが正常に動作していることを確認し、productpage マイクロサービスのポッド IP アドレスを書き留めます。後続のステップでは、このポッド IP アドレスを使用して、各マイクロサービスをクエリします。

     ```
     kubectl get pods -o wide
     ```

     ```
     NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE
     details-v1-766844796b-9wff2       1/1     Running   0          7s    10.86.3.7     mi-0daa253999fe92daa
     productpage-v1-54bb874995-lwfgg   1/1     Running   0          7s    10.86.2.193   mi-082f73826a163626e
     ratings-v1-5dc79b6bcd-59njm       1/1     Running   0          7s    10.86.2.232   mi-082f73826a163626e
     reviews-v1-598b896c9d-p2289       1/1     Running   0          7s    10.86.2.47    mi-026d6a261e355fba7
     reviews-v2-556d6457d-djktc        1/1     Running   0          7s    10.86.3.58    mi-0daa253999fe92daa
     reviews-v3-564544b4d6-g8hh4       1/1     Running   0          7s    10.86.2.69    mi-09183e8a3d755abf6
     ```

  1. ネットワークポリシーをテストするために全体を通して使用されるポッドを作成します。このポッドは、`access: true` というラベルが付けられて `default` 名前空間に作成されることに注意してください。

     ```
     kubectl run curl-pod --image=curlimages/curl -i --tty --labels=access=true --namespace=default --overrides='{"spec": { "nodeSelector": {"eks.amazonaws.com/compute-type": "hybrid"}}}' -- /bin/sh
     ```

  1. productpage マイクロサービスへのアクセスをテストします。以下の例では、productpage ポッド (`10.86.2.193`) のポッド IP アドレスを使用して、マイクロサービスをクエリしています。この IP アドレスをお使いの環境の productpage ポッドのポッド IP アドレスに置き換えます。

     ```
     curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
     ```

     ```
     <title>Simple Bookstore App</title>
     ```

  1. `exit` と入力してテスト用 curl ポッドを終了し、次のコマンドを実行してポッドに再アタッチできます。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

  1. 以降の手順でネットワークポリシーの効果を実証するには、まず BookInfo マイクロサービスに対するトラフィックをすべて拒否するネットワークポリシーを作成します。deny ネットワークポリシーを定義するファイルを `network-policy-deny-bookinfo.yaml` という名前で作成します。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: deny-bookinfo
       namespace: default
     spec:
       podSelector:
         matchExpressions:
         - key: app
           operator: In
           values: ["productpage", "details", "reviews", "ratings"]
       policyTypes:
       - Ingress
       - Egress
     ```

  1. クラスターに deny ネットワークポリシーを適用します。

     ```
     kubectl apply -f network-policy-default-deny-bookinfo.yaml
     ```

  1. BookInfo アプリケーションへのアクセスをテストします。以下の例では、productpage ポッド (`10.86.2.193`) のポッド IP アドレスを使用して、マイクロサービスをクエリしています。この IP アドレスをお使いの環境の productpage ポッドのポッド IP アドレスに置き換えます。

     ```
     curl http://10.86.2.193:9080/productpage --max-time 10
     ```

     ```
     curl: (28) Connection timed out after 10001 milliseconds
     ```

  1. productpage ネットワークポリシーを定義するファイルを `network-policy-productpage.yaml` という名前で作成します。このポリシーには、以下のルールがあります。
     + `access: true` というラベルが付いたポッド (前のステップで作成した curl ポッド) からの受信トラフィックを許可する
     + ポート `9080` で、details、reviews、ratings の各マイクロサービスに関する送信 TCP トラフィックを許可する
     + ポート `53` で、`kube-system` 名前空間内で動作する CoreDNS に関する送信 TCP/UDP トラフィックを許可する

       ```
       apiVersion: networking.k8s.io/v1
       kind: NetworkPolicy
       metadata:
         name: productpage-policy
         namespace: default
       spec:
         podSelector:
           matchLabels:
             app: productpage
         policyTypes:
         - Ingress
         - Egress
         ingress:
         - from:
           - podSelector:
               matchLabels:
                 access: "true"
         egress:
         - to:
           - podSelector:
               matchExpressions:
               - key: app
                 operator: In
                 values: ["details", "reviews", "ratings"]
           ports:
           - port: 9080
             protocol: TCP
         - to:
           - namespaceSelector:
               matchLabels:
                 kubernetes.io/metadata.name: kube-system
             podSelector:
               matchLabels:
                 k8s-app: kube-dns
           ports:
           - port: 53
             protocol: UDP
           - port: 53
             protocol: TCP
       ```

  1. クラスターに productpage ネットワークポリシーを適用します。

     ```
     kubectl apply -f network-policy-productpage.yaml
     ```

  1. curl ポッドに接続して、Bookinfo アプリケーションへのアクセスをテストします。productpage マイクロサービスへのアクセスが許可されるようになりましたが、他のマイクロサービスは依然として deny ネットワークポリシーの対象であるため、引き続き拒否されます。以下の例では、productpage ポッド (`10.86.2.193`) のポッド IP アドレスを使用して、マイクロサービスをクエリします。この IP アドレスをお使いの環境の productpage ポッドのポッド IP アドレスに置き換えます。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

     ```
     curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
     <title>Simple Bookstore App</title>
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1
     {"error": "Sorry, product details are currently unavailable for this book."}
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
     {"error": "Sorry, product reviews are currently unavailable for this book."}
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
     {"error": "Sorry, product ratings are currently unavailable for this book."}
     ```

  1. details ネットワークポリシーを定義するファイルを `network-policy-details.yaml` という名前で作成します。このポリシーは、productpage マイクロサービスからの受信トラフィックのみを許可します。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: details-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: details
       policyTypes:
       - Ingress
       ingress:
       - from:
         - podSelector:
             matchLabels:
               app: productpage
     ```

  1. reviews ネットワークポリシーを定義するファイルを `network-policy-reviews.yaml` という名前で作成します。このポリシーは、productpage マイクロサービスからの受信トラフィックと、ratings マイクロサービスと CoreDNS への送信トラフィックのみを許可します。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: reviews-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: reviews
       policyTypes:
       - Ingress
       - Egress
       ingress:
       - from:
         - podSelector:
             matchLabels:
               app: productpage
       egress:
       - to:
         - podSelector:
             matchLabels:
               app: ratings
       - to:
         - namespaceSelector:
             matchLabels:
               kubernetes.io/metadata.name: kube-system
           podSelector:
             matchLabels:
               k8s-app: kube-dns
         ports:
         - port: 53
           protocol: UDP
         - port: 53
           protocol: TCP
     ```

  1. ratings ネットワークポリシーを定義するファイルを `network-policy-ratings.yaml` という名前で作成します。このポリシーは、productpage マイクロサービスと reviews マイクロサービスからの受信トラフィックのみを許可します。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: ratings-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: ratings
       policyTypes:
       - Ingress
       ingress:
       - from:
         - podSelector:
             matchExpressions:
             - key: app
               operator: In
               values: ["productpage", "reviews"]
     ```

  1. クラスターに details、reviews、ratings の各ネットワークポリシーを適用します。

     ```
     kubectl apply -f network-policy-details.yaml
     kubectl apply -f network-policy-reviews.yaml
     kubectl apply -f network-policy-ratings.yaml
     ```

  1. curl ポッドに接続して、Bookinfo アプリケーションへのアクセスをテストします。以下の例では、productpage ポッド (`10.86.2.193`) のポッド IP アドレスを使用して、マイクロサービスをクエリします。この IP アドレスをお使いの環境の productpage ポッドのポッド IP アドレスに置き換えます。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

     details マイクロサービスをテストします。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1
     ```

     ```
     {"id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890"}
     ```

     reviews マイクロサービスをテストします。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
     ```

     ```
     {"id": "1", "podname": "reviews-v1-598b896c9d-p2289", "clustername": "null", "reviews": [{"reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!"}, {"reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."}]}
     ```

     ratings マイクロサービスをテストします。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
     ```

     ```
     {"id": 1, "ratings": {"Reviewer1": 5, "Reviewer2": 4}}
     ```

  1. この手順で作成したリソースをクリーンアップします。

     ```
     kubectl delete -f network-policy-deny-bookinfo.yaml
     kubectl delete -f network-policy-productpage.yaml
     kubectl delete -f network-policy-details.yaml
     kubectl delete -f network-policy-reviews.yaml
     kubectl delete -f network-policy-ratings.yaml
     kubectl delete -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     kubectl delete pod curl-pod
     ```

# ハイブリッドノードの概念
<a name="hybrid-nodes-concepts"></a>

*Amazon EKS Hybrid Nodes* を使用すると、オンプレミス環境またはエッジ環境で実行されている物理マシンまたは仮想マシンを、AWS クラウドで実行されている Amazon EKS クラスターに接続できます。このアプローチには多くの利点がありますが、単一のネットワーク環境で Kubernetes クラスターを運用することに慣れているユーザーにとっては、新しいネットワークの概念やアーキテクチャが導入されることにもなります。

以下のセクションでは、EKS Hybrid Nodes での Kubernetes とネットワーキングの概念、およびハイブリッドアーキテクチャにおけるトラフィックフローについて詳しく説明します。これらのセクションを理解するには、ポッド、ノード、サービス、Kubernetes コントロールプレーン、kubelet、kube-proxy の概念など、Kubernetes ネットワークに関する基本的な知識に精通している必要があります。

これらのページは、「[ハイブリッドノードにおけるネットワーキングの概念](hybrid-nodes-concepts-networking.md)」、「[ハイブリッドノードにおける Kubernetes の概念](hybrid-nodes-concepts-kubernetes.md)」、「[ハイブリッドノード向けネットワークトラフィックフロー](hybrid-nodes-concepts-traffic-flows.md)」の順に読むことをお勧めします。

**Topics**
+ [ハイブリッドノードにおけるネットワーキングの概念](hybrid-nodes-concepts-networking.md)
+ [ハイブリッドノードにおける Kubernetes の概念](hybrid-nodes-concepts-kubernetes.md)
+ [ハイブリッドノード向けネットワークトラフィックフロー](hybrid-nodes-concepts-traffic-flows.md)

# ハイブリッドノードにおけるネットワーキングの概念
<a name="hybrid-nodes-concepts-networking"></a>

このセクションでは、EKS Hybrid Nodes のネットワークトポロジー設計の際に考慮すべき、コアネットワーキングの概念と制約について詳しく説明します。

## EKS Hybrid Nodes におけるネットワーキングの概念
<a name="_networking_concepts_for_eks_hybrid_nodes"></a>

![\[ハイブリッドノードのネットワーク概要図\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-highlevel-network.png)


 **ネットワークハブとしての VPC** 

クラウドの境界を越えるすべてのトラフィックは VPC を経由しますが、これには、AWS で稼働する EKS コントロールプレーンまたはポッドや、ハイブリッドノードまたはそうしたノードで稼働しているポッド間のトラフィックも含まれます。クラスターの VPC はハイブリッドノードと残りのクラスター部分のネットワークハブとして機能している、と考えるとよいでしょう。このアーキテクチャによってトラフィックとそのルーティングを完全に制御できますが、これを導入するには、VPC のルート、セキュリティグループ、ファイアウォールを適切に設定する責任を負うことにもなります。

 **EKS コントロールプレーンから VPC に向かうトラフィック** 

EKS コントロールプレーンにより、**Elastic Network Interface (ENI)** が VPC にアタッチされ、これらの ENI によって、EKS API サーバーとの間でトラフィックが処理されます。EKS コントロールプレーンの ENI の配置は、クラスターを設定する際に制御します。なぜなら、クラスターの作成中に渡すサブネットに ENI がアタッチされるからです。

EKS では、セキュリティグループを、サブネットにアタッチする ENI に関連付けます。こうしたセキュリティグループにより、EKS コントロールプレーンとの間のトラフィックを、ENI を介して許可します。この点が EKS Hybrid Nodes では重要となります。ハイブリッドノードとそこで稼働しているポッドから EKS コントロールプレーン ENI へのトラフィックを許可する必要があるからです。

 **リモートノードネットワーク** 

リモートノードネットワーク、具体的にはリモートノード CIDR は、ハイブリッドノードとして使用するマシンに割り当てる IP アドレスの範囲を意味します。ハイブリッドノードをプロビジョニングすると、それらはオンプレミスのデータセンターやエッジロケーションに配置されます。これらのネットワークドメインは、EKS コントロールプレーンおよび VPC のドメインとは異なります。また、各ハイブリッドノードには、IP アドレスが 1 つまたは複数あり、VPC 内のサブネットとは異なるリモートノード CIDR に基づいて設定されています。

こうしたリモートノード CIDR を使用して EKS クラスターを構成すると、EKS でそれが認識され、ハイブリッドノードの IP アドレスを宛先としたすべてのトラフィック (kubelet API へのリクエストなど) をクラスターの VPC 経由でルーティングできるようになります。`kubelet` API への接続は、`kubectl attach`、`kubectl cp`、`kubectl exec`、`kubectl logs`、`kubectl port-forward` の各コマンドで使用されます。

 **リモートポッドネットワーク** 

ここでのリモートポッドネットワークとは、ハイブリッドノードで稼働するポッドに割り当てる IP アドレスの範囲を意味します。一般的には、これらの範囲で CNI を設定すると、CNI の IP Address Manager (IPAM) 機能によって、その範囲の一部が各ハイブリッドノードに割り当てられます。また、新規作成したポッドには、ポッドをスケジュールしたノードに割り当てた IP アドレスからアドレスが割り当てられます。

こうしたリモートポッド CIDR を使用して EKS クラスターを設定すると、EKS コントロールプレーンでそれが認識され、ハイブリッドノードで稼働しているポッドを宛先とするすべてのトラフィック (ウェブフックとの通信など) をクラスターの VPC 経由でルーティングできます。

![\[リモートポッドネットワーク\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-remote-pod-cidrs.png)


 **オンプレミスから VPC に向かうトラフィック** 

ハイブリッドノードに使用するオンプレミスネットワークのトラフィックは、EKS クラスターに使用する VPC にルーティングする必要があります。オンプレミスネットワークを VPC に接続する場合、複数用意されている [Network-to-Amazon VPC 接続オプション](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)を利用することも、独自の VPN ソリューションを使用することもできます。

ここで重要なのは、AWS クラウド側の VPC とオンプレミスネットワーク間のルーティングを正しく設定することで、両方のネットワークの接続点を介して、適切なトラフィックが相互にルーティングされるようにすることです。

VPC では、リモートノードおよびリモートポッドネットワークに向かうすべてのトラフィックを、オンプレミスネットワークとの接続点 (ゲートウェイ) 経由でルーティングする必要があります。サブネットの一部に異なるルートテーブルがある場合は、ハイブリッドノードとそこで稼働しているポッドのルートを各ルートテーブルに設定する必要があります。これは、EKS コントロールプレーンの ENI がアタッチされるサブネットや、ハイブリッドノードと通信する必要のある EC2 のノードまたはポッドが含まれるサブネットにも当てはまります。

オンプレミスネットワークでは、ネットワークの設定によって、EKS クラスターの VPC や、ハイブリッドノードに必要なその他の AWS サービスとの間で生じるトラフィックを許可する必要があります。EKS クラスターのトラフィックは、ゲートウェイを双方向に通過することになります。

## ネットワーキング上の制約
<a name="_networking_constraints"></a>

 **完全にルーティングされたネットワーク** 

ここでの主な制約は、EKS コントロールプレーンとすべてのノード (クラウドまたはハイブリッドのノード) で生じるトラフィックが**完全にルーティング**されるネットワークを形成する必要があることです。つまり、すべてのノードが IP アドレスを使用してレイヤー 3 で互いに到達可能でなければなりません。

EKS コントロールプレーンとクラウドノードはフラットなネットワーク (VPC) 内にあるため、相互に到達可能な状態にありますが、ハイブリッドノードは異なるネットワークドメインに存在しています。そのため、VPC とオンプレミスネットワークでルーティング設定を追加して、ハイブリッドノードと他のクラスター部分との間で生じるトラフィックをルーティングする必要があります。ハイブリッドノードが互いに到達可能で、VPC からも到達可能な場合、ハイブリッドノードは、単一のフラットネットワークに配置することも、セグメント化した複数のネットワークに配置することもできます。

 **ルーティング可能なリモートポッド CIDR** 

EKS コントロールプレーンがハイブリッドノードで稼働中のポッド (ウェブフックやメトリクスサーバーなど) と通信したり、クラウドノードで稼働中のポッドがハイブリッドノードで稼働中のポッドと通信 (ワークロードの East-West 通信) したりするには、リモートポッドの CIDR へのトラフィックが VPC からルーティング可能でなければなりません。つまり、VPC では、ポッドの CIDR に向かうトラフィックをゲートウェイ経由でオンプレミスネットワークにルーティングでき、オンプレミスネットワークでは、ポッドのトラフィックを適切なノードにルーティングできる必要があります。

ここで重要なのは、VPC とオンプレミスでポッドのルーティング要件に違いがあることです。VPC には、リモートポッドへのトラフィックがゲートウェイを通過する必要があることを認識させるだけで済み、リモートポッドの CIDR が 1 つしかない場合は、必要なルートも 1 つのみです。

この要件は、オンプレミスネットワーク内の、ハイブリッドノードと同じサブネットでローカルルーターに至るまでに生じるすべてのホップに当てはまります。このルーターは、各ノードに割り当てられたポッド CIDR スライスを認識する必要がある唯一のルーターです。これにより、特定のポッドに向かうトラフィックを、そのポッドがスケジュールされているノードに配信できます。

オンプレミスのポッド CIDR へのこうしたルートを、ローカルのオンプレミスルーターから VPC ルートテーブルに伝達することもできますが、これは必須ではありません。オンプレミスのポッド CIDR を頻繁に変更しているため、VPC ルートテーブルを更新してそれらの変更を反映する必要がある場合は、オンプレミスのポッド CIDR を VPC ルートテーブルに伝達することが推奨されます。しかし、こうしたケースはまれです。

オンプレミスのポッド CIDR へのルーティングは、必ずしも設定する必要はありません。ハイブリッドノードでウェブフックを実行する必要がない場合、またはクラウドノード上のポッドがハイブリッドノード上のポッドと通信する必要がない場合は、オンプレミスネットワークのポッド CIDR へのルーティングを設定しなくても済みます。

 *では、ハイブリッドノードを使用するときに、オンプレミスのポッド CIDR 宛てトラフィックをルーティング可能にする理由について説明します。*

VPC CNI を備えた EKS をクラウドノードに使用している場合、VPC CNI によって VPC からポッドに直接 IP が割り当てられます。つまり、クラウドポッドも EKS コントロールプレーンもポッド IP に直接到達できるため、特別なルーティングは必要ありません。

オンプレミスでポッドが稼働している場合 (クラウドで他の CNI を使用)、ポッドは、通常、分離されたオーバーレイネットワークで実行され、CNI によってポッド間のトラフィック配信が処理されます。これは通常、カプセル化によって行われます。つまり、ポッド間のトラフィックをノード間のトラフィックに変換し、両端でカプセル化とカプセル化解除を行います。そのため、ノードとルーターに設定をさらに追加する必要はありません。

ハイブリッドノードを使用したネットワークは、両方のトポロジーが組み合わさっているという点で独特なものです。つまり、EKS コントロールプレーンとクラウドノード (VPC CNI を使用) は、ノードとポッドが含まれるフラットなネットワークを想定して動作し、一方、ハイブリッドノードで稼働するポッドは、オーバーレイネットワーク内に存在し、カプセル化には VXLAN (Cilium のデフォルト) が使用されます。ハイブリッドノードで稼働するポッドは、オンプレミスネットワークと VPC 間のルーティングが可能であることを前提に、EKS コントロールプレーンとクラウドノードで稼働中のポッドに到達できます。ただし、オンプレミスネットワークのポッド CIDR 宛てトラフィックをルーティングしておらず、オーバーレイネットワークに到達したトラフィックを適切なノードに転送できない場合、オンプレミスのポッド IP に戻るトラフィックは、最終的にドロップされます。

# ハイブリッドノードにおける Kubernetes の概念
<a name="hybrid-nodes-concepts-kubernetes"></a>

このページでは、EKS Hybrid Nodes システムアーキテクチャを支える Kubernetes の主要な概念について詳しく説明します。

## VPC の EKS コントロールプレーン
<a name="hybrid-nodes-concepts-k8s-api"></a>

EKS コントロールプレーン ENI の IP は、`default` デフォルトの名前空間にある `kubernetes` `Endpoints` オブジェクトに保存されます。EKS では、ENI の新規作成や削除が行わると、このオブジェクトが更新され、IP リストが常に最新状態に保たれます。

これらのエンドポイントは、`kubernetes` サービスを通じて使用できます。このサービスも `default` の名前空間に存在します。この `ClusterIP` タイプのサービスには、クラスターのサービス CIDR に含まれる最初の IP が割り当てられます。例えば、サービス CIDR が `172.16.0.0/16` の場合、サービス IP は `172.16.0.1` になります。

通常、ポッドは (稼働がクラウドノード上かハイブリッドノード上かに関係なく) そのように EKS Kubernetes API サーバーにアクセスします。サービス IP を宛先 IP として使用し、これをいずれかの EKS コントロールプレーン ENI に設定されている実際の IP に変換します。こうした動作の主な例外として `kube-proxy` があります。これによって変換を設定するからです。

## EKS API サーバーエンドポイント
<a name="hybrid-nodes-concepts-k8s-eks-api"></a>

EKS API サーバーには `kubernetes` サービス IP 以外の方法でもアクセスできます。EKS では、クラスター作成時に Route53 DNS 名も作成されます。これが、EKS の `endpoint` API アクションを呼び出す際に、EKS クラスターの `DescribeCluster` フィールド値になります。

```
{
    "cluster": {
        "endpoint": "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com",
        "name": "my-cluster",
        "status": "ACTIVE"
    }
}
```

パブリックエンドポイントアクセスクラスター、もしくはパブリックおよびプライベートエンドポイントアクセスクラスターでは、ハイブリッドノードで、この DNS 名がインターネット経由でルーティング可能なパブリック IP に解決されます (デフォルトの場合)。プライベートエンドポイントアクセスクラスターの場合、DNS 名は、EKS コントロールプレーン ENI のプライベート IP に解決されます。

`kubelet` と `kube-proxy` は、そのように Kubernetes API サーバーにアクセスします。すべての Kubernetes クラスタートラフィックを VPC 経由にする場合、クラスターをプライベートアクセスモードで設定するか、オンプレミスの DNS サーバーを変更して EKS クラスターエンドポイントを EKS コントロールプレーン ENI のプライベート IP に解決する必要があります。

## `kubelet` エンドポイント
<a name="hybrid-nodes-concepts-k8s-kubelet-api"></a>

`kubelet` では複数の REST エンドポイントが公開されており、これによってシステムの他の要素は、kubelet と通信し、各ノードの情報を収集しています。ほとんどのクラスターにおいて、`kubelet` サーバーに向かうトラフィックの大部分は、コントロールプレーンで生じたものですが、特定のモニタリングエージェントも kubelet と通信する場合があります。

このインターフェイスを通じて、`kubelet` では、ログの取得 (`kubectl logs`)、コンテナ内でのコマンド実行 (`kubectl exec`)、トラフィックのポート転送 (`kubectl port-forward`) といった各種リクエストが処理されます。こうしたリクエストでは、基盤のコンテナランタイム環境との通信が `kubelet` を介して行われるため、クラスター管理者や開発者にとってシームレスなユーザー体験が実現します。

この API で最も一般的なコンシューマーとなるのは Kubernetes API サーバーです。上記の `kubectl` コマンドのいずれかを使用すると、`kubectl` が API サーバーに API リクエストを送信し、その後 API サーバーが、ポッドが稼働しているノードの `kubelet` API を呼び出します。そのため、多くの場合、ノード IP が EKS コントロールプレーンから到達可能である必要があります。また、ノードルートを誤って設定すると、ポッドが稼働中であっても、ログや `exec` コマンドを利用できません。

 **ノード IP** 

EKS コントロールプレーンは、ノードと通信する際に、`Node` オブジェクトのステータス (`status.addresses`) で報告されるアドレスの 1 つを使用します。

EKS クラウドノードでは、一般的に、ノード登録時に kubelet が EC2 インスタンスのプライベート IP を `InternalIP` として報告します。その後、Cloud Controller Manager (CCM) がこの IP を検証し、それが EC2 インスタンスに属していることを確認します。さらに、CCM は通常、インスタンスのパブリック IP (`ExternalIP`) と DNS 名 (`InternalDNS` と `ExternalDNS`) をノードステータスに追加します。

ただし、ハイブリッドノードには CCM はありません。EKS Hybrid Nodes CLI (`nodeadm`) を使用してハイブリッドノードを登録すると、CCM を介さずにノードのステータスでマシンの IP が直接報告されるように kubelet が設定されます。

```
apiVersion: v1
kind: Node
metadata:
  name: my-node-1
spec:
  providerID: eks-hybrid:///us-west-2/my-cluster/my-node-1
status:
  addresses:
  - address: 10.1.1.236
    type: InternalIP
  - address: my-node-1
    type: Hostname
```

マシンに複数の IP がある場合、kubelet は独自のロジックに従ってそれらの 1 つを選択します。選択される IP アドレスは `--node-ip` フラグで制御でき、このフラグは、`nodeadm` config の `spec.kubelet.flags` に渡すことが可能です。`Node` オブジェクトで報告された IP アドレスにのみ VPC からのルートが必要であり、マシンには、クラウドからアクセスできない他の IP アドレスを割り当てることができます。

## `kube-proxy`
<a name="hybrid-nodes-concepts-k8s-kube-proxy"></a>

 `kube-proxy` は、各ノードのネットワークレイヤーでサービス抽象化を実装する役割を果たし、Kubernetes サービスに向かうトラフィックのネットワークプロキシおよびロードバランサーとして機能します。また、`kube-proxy` は、Kubernetes API サーバーを監視し、サービスとエンドポイントに関連した変更を継続的に確認することで、基盤となるホストのネットワークルールを動的に更新し、適切なトラフィック転送を維持します。

`iptables` モードの `kube-proxy` は、複数の `netfilter` チェーンをプログラミングして、サービストラフィックを処理します。こうしたルールによって、以下の階層が形成されます。

1.  **KUBE-SERVICES チェーン**: すべてのサービストラフィックのエントリポイント。各サービスの `ClusterIP` とポートに一致するルールが定義されています。

1.  **KUBE-SVC-XXX チェーン**: サービス固有のチェーンに、各サービスの負荷分散ルールが定義されています。

1.  **KUBE-SEP-XXX チェーン**: エンドポイント固有のチェーンに、実際の `DNAT` ルールが定義されています。

次に示す `default` 名前空間内のサービス `test-server` の状況を確認してみましょう。\$1 サービス ClusterIP: `172.16.31.14` \$1 サービスポート: `80` \$1 バッキングポッド: `10.2.0.110`, `10.2.1.39`, `10.2.2.254` 

`iptables` ルールを検査するとき (`iptables-save 0 grep -A10 KUBE-SERVICES` を使用):

1. **KUBE-SERVICES** チェーンには、以下のように、サービスに一致するルールがあります。

   ```
   -A KUBE-SERVICES -d 172.16.31.14/32 -p tcp -m comment --comment "default/test-server cluster IP" -m tcp --dport 80 -j KUBE-SVC-XYZABC123456
   ```
   + このルールは、172.16.31.14:80 宛てのパケットに一致させる
   + コメントは、このルールの目的を示している: `default/test-server cluster IP` 
   + 一致するパケットは `KUBE-SVC-XYZABC123456` チェーンにジャンプさせる

1. **KUBE-SVC-XYZABC123456** チェーンには、確率ベースの負荷分散ルールが定義されています。

   ```
   -A KUBE-SVC-XYZABC123456 -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-POD1XYZABC
   -A KUBE-SVC-XYZABC123456 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-POD2XYZABC
   -A KUBE-SVC-XYZABC123456 -j KUBE-SEP-POD3XYZABC
   ```
   + 最初のルール: 33.3% の確率で `KUBE-SEP-POD1XYZABC` にジャンプさせる 
   + 2 番目のルール: 50% の確率で残りのトラフィック (全体の 33.3%) を `KUBE-SEP-POD2XYZABC` にジャンプさせる 
   + 最後のルール: 残りのすべてのトラフィック (合計の 33.3%) を `KUBE-SEP-POD3XYZABC` にジャンプさせる 

1. 個々の **KUBE-SEP-XXX** チェーンで、DNAT (宛先 NAT) を実行します。

   ```
   -A KUBE-SEP-POD1XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.0.110:80
   -A KUBE-SEP-POD2XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.1.39:80
   -A KUBE-SEP-POD3XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.2.254:80
   ```
   + これらの DNAT ルールでは、宛先 IP とポートを書き換えて、トラフィックを特定のポッドに転送します。
   + 各ルールによって、トラフィックの約 33.3% を処理し、`10.2.0.110`、`10.2.1.39`、`10.2.2.254` の間で均等な負荷分散を行います。

このマルチレベルチェーン構造により、`kube-proxy` では、データパスにプロキシプロセスを必要とせずに、カーネルレベルのパケット操作によってサービスの負荷分散およびリダイレクトを効率的に実装できます。

### Kubernetes 運用への影響
<a name="hybrid-nodes-concepts-k8s-operations"></a>

ノードで `kube-proxy` の機能が失われると、ノードはサービストラフィックを適切にルーティングできなくなり、クラスターサービスに依存するポッドのタイムアウトや接続の失敗が発生します。この問題が特に深刻になりうるのは、ノードが最初に登録されたときです。CNI では、ポッドネットワークを設定する前に、Kubernetes API サーバーと通信して、ノードのポッド CIDR などの情報を取得する必要があります。それを行うには、`kubernetes` サービス IP を使用します。ただし、`kube-proxy` が起動できなかったり、適切な `iptables` ルールを設定できなかったりした場合、`kubernetes` サービス IP へのリクエストは EKS コントロールプレーン ENI の実際の IP に変換されません。その結果、CNI がクラッシュループに陥り、どのポッドも正しく稼働しなくなります。

前述したように、ポッドは Kubernetes API サーバーとの通信に `kubernetes` のサービス IP を使用しますが、そのように動作させるには、最初に `kube-proxy` に `iptables` ルールを設定する必要があります。

`kube-proxy` は、どのように API サーバーと通信するのでしょうか?

`kube-proxy` は、Kubernetes API サーバーの実際の IP アドレス、またはそれらに解決される DNS 名を使用するように設定する必要があります。EKS の場合、デフォルトの `kube-proxy` が、クラスター作成時に EKS によって作成される Route53 DNS 名を指すように設定されます。この値は、`kube-system` 名前空間の `kube-proxy` ConfigMap で確認できます。この ConfigMap の内容は、`kube-proxy` ポッドに注入される `kubeconfig` であるため、`clusters0.cluster.server` フィールドを確認してください。この値は、EKS `DescribeCluster` API を呼び出した結果にある、EKS クラスターの `endpoint` フィールドと一致しています。

```
apiVersion: v1
data:
  kubeconfig: |-
    kind: Config
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        server: https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com
      name: default
    contexts:
    - context:
        cluster: default
        namespace: default
        user: default
      name: default
    current-context: default
    users:
    - name: default
      user:
        tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
kind: ConfigMap
metadata:
  name: kube-proxy
  namespace: kube-system
```

## ルーティング可能なリモートポッド CIDR
<a name="hybrid-nodes-concepts-k8s-pod-cidrs"></a>

この [ハイブリッドノードにおけるネットワーキングの概念](hybrid-nodes-concepts-networking.md) のページでは、ハイブリッドノードでウェブフックを実行したり、クラウドノードで稼働しているポッドがハイブリッドノードで稼働しているポッドと通信したりするための要件について詳しく説明します。ここでは重要な要件があります。特定のポッド IP を担当するノードを、オンプレミスルーターに認識させる必要があることです。これを実現する方法として、ボーダーゲートウェイプロトコル (BGP)、静的ルート、アドレス解決プロトコル (ARP) プロキシなどが挙げられます。以下のセクションでは、これらの方法について説明します。

 **ボーダーゲートウェイプロトコル (BGP)** 

CNI でサポートされている場合 (Cilium や Calico など)、CNI の BGP モードを使用して、ノードごとのポッド CIDR へのルートをノードからローカルルーターに伝達できます。CNI の BGP モードを使用する場合、CNI は仮想ルーターとして機能するため、ローカルルーターは、ポッド CIDR が別のサブネットに属し、ノードはそのサブネットへのゲートウェイであると認識します。

![\[ハイブリッドノード BGP ルーティング\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-bgp.png)


 **静的ルート** 

または、ローカルルーターで静的ルートを設定することもできます。この方法を取ると、オンプレミスポッド CIDR を VPC に非常に簡単にルーティングできますが、最もエラーが発生しやすく、保守も困難になります。ルートが既存のノードと割り当てられたポッド CIDR で、常に最新の状態であることを確認しなければなりません。ノードの数が少なく、インフラストラクチャが静的である場合、これは実行可能なオプションであり、ルーターでの BGP 対応も不要になります。この方法を取る場合は、アドレスを IPAM によって決定せず、各ノードに割り当てるポッド CIDR スライスを使用して CNI を設定することをお勧めします。

![\[ハイブリッドノードの静的ルーティング\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-static-routes.png)


 **アドレス解決プロトコル (ARP) プロキシ** 

ARP プロキシは、オンプレミスのポッド IP をルーティング可能にするもう 1 つのアプローチであり、特に、ハイブリッドノードがローカルルーターと同じレイヤー 2 ネットワークにある場合に便利です。ARP プロキシを有効にすると、ノードは、その IP が別のサブネットに属している場合でも、ホストするポッド IP の ARP リクエストに応答します。

ローカルネットワーク上のデバイスがポッド IP に到達を試みる場合、最初に「この IP を持っているなら応答せよ」という ARP リクエストを送信します。該当するポッドをホストしているハイブリッドノードは、自分の MAC アドレスで応答し、「その IP のトラフィックを処理できます」と伝えます。これによって、ルーター設定を必要とせずに、ローカルネットワーク上のデバイスとポッドの間に直接のパスが作成されます。

これを機能させるには、CNI がプロキシ ARP 機能に対応している必要があります。Cilium は、設定によってプロキシ ARP を有効化できるように設計されています。ここで特に考慮すべき点は、ポッド CIDR が環境内の他のネットワークと重複しないようにすることです。重複すると、ルーティングの競合が生じる可能性があるからです。

このアプローチには、次のような利点があります。\$1 BGP でルーターを設定する必要はなく、静的ルートを維持する必要もない。\$1 ルーター設定を制御できない環境でも効果的に機能する。

![\[ハイブリッドノード ARP プロキシ\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-arp-proxy.png)


## ポッド間でのカプセル化
<a name="hybrid-nodes-concepts-k8s-pod-encapsulation"></a>

オンプレミス環境の CNI では、通常、カプセル化プロトコルによって、物理ネットワーク上で動作するオーバーレイネットワークが作成されます。この場合、再設定が不要になります。このセクションでは、このカプセル化の仕組みについて説明します。使用している CNI によっては、一部の詳細情報が異なる場合があります。

カプセル化では、元のポッドネットワークパケットを、基盤の物理ネットワークを介してルーティング可能な別のネットワークパケット内にラップします。これによって、ポッドの CIDR のルーティング方法が物理ネットワークで認識されていなくても、同じ CNI を実行しているノード間でポッドが通信できます。

Kubernetes で使用される最も一般的なカプセル化プロトコルは Virtual Extensible LAN (VXLAN) ですが、CNI に応じて、他のプロトコル (`Geneve` など) も利用できます。

### VXLAN カプセル化
<a name="_vxlan_encapsulation"></a>

VXLAN では、UDP パケット内にレイヤー 2 イーサネットフレームをカプセル化します。ポッドが別のノードにある別のポッドにトラフィックを送信すると、CNI では、以下が実行されます。

1. ポッド A からのパケットをインターセプトする

1. 元のパケットを VXLAN ヘッダーにラップする

1. ラップしたパケットを、ノードの通常のネットワークスタックを介して宛先ノードに送信する

1. 宛先ノードの CNI が、パケットをラップ解除し、ポッド B に配信する

VXLAN カプセル化中のパケット構造の変化を次に示します。

元のポッド間パケット

```
+-----------------+---------------+-------------+-----------------+
| Ethernet Header | IP Header     | TCP/UDP     | Payload         |
| Src: Pod A MAC  | Src: Pod A IP | Src Port    |                 |
| Dst: Pod B MAC  | Dst: Pod B IP | Dst Port    |                 |
+-----------------+---------------+-------------+-----------------+
```

VXLAN カプセル化後

```
+-----------------+-------------+--------------+------------+---------------------------+
| Outer Ethernet  | Outer IP    | Outer UDP    | VXLAN      | Original Pod-to-Pod       |
| Src: Node A MAC | Src: Node A | Src: Random  | VNI: xx    | Packet (unchanged         |
| Dst: Node B MAC | Dst: Node B | Dst: 4789    |            | from above)               |
+-----------------+-------------+--------------+------------+---------------------------+
```

この VXLAN ネットワーク識別子 (VNI) によって、異なるオーバーレイネットワークが区別されます。

### ポッド通信のシナリオ
<a name="_pod_communication_scenarios"></a>

 **同じハイブリッドノード上のポッド** 

同じハイブリッドノード上のポッドが通信する場合、通常はカプセル化は必要ありません。CNI では、ローカルルートが設定されます。これにより、ノードの内部仮想インターフェイスを介してポッド間のトラフィックを転送します。

```
Pod A -> veth0 -> node's bridge/routing table -> veth1 -> Pod B
```

パケットはノードから出ることはなく、カプセル化を必要としません。

 **異なるハイブリッドノード上のポッド** 

異なるハイブリッドノード上のポッド間で通信するには、カプセル化が必要です。

```
Pod A -> CNI -> [VXLAN encapsulation] -> Node A network -> router or gateway -> Node B network -> [VXLAN decapsulation] -> CNI -> Pod B
```

これにより、物理ネットワークでポッド IP のルーティングが認識されていなくても、ポッドトラフィックは、物理ネットワークインフラストラクチャを通過できます。

# ハイブリッドノード向けネットワークトラフィックフロー
<a name="hybrid-nodes-concepts-traffic-flows"></a>

このページでは、EKS ハイブリッドノード向けネットワークトラフィックフローについて、いくつかのトラフィックタイプ別にエンドツーエンドでネットワークパスの図を示しながら詳しく説明します。

以下のトラフィックフローを取り上げます。
+  [ハイブリッドノード `kubelet` から EKS コントロールプレーンまでのフロー](#hybrid-nodes-concepts-traffic-flows-kubelet-to-cp) 
+  [EKS コントロールプレーンからハイブリッドノード (`kubelet` サーバー) までのフロー](#hybrid-nodes-concepts-traffic-flows-cp-to-kubelet) 
+  [ハイブリッドノードで実行されているポッドから EKS コントロールプレーンまでのフロー](#hybrid-nodes-concepts-traffic-flows-pods-to-cp) 
+  [EKS コントロールプレーンからハイブリッドノードで実行されているポッドまでのフロー (ウェブフック)](#hybrid-nodes-concepts-traffic-flows-cp-to-pod) 
+  [ハイブリッドノードで実行されているポッド間](#hybrid-nodes-concepts-traffic-flows-pod-to-pod) 
+  [クラウドノード上のポッドからハイブリッドノード上のポッドまでのフロー (東西トラフィック)](#hybrid-nodes-concepts-traffic-flows-east-west) 

## ハイブリッドノード `kubelet` から EKS コントロールプレーンまでのフロー
<a name="hybrid-nodes-concepts-traffic-flows-kubelet-to-cp"></a>

![\[ハイブリッドノード kubelet から EKS コントロールプレーンまでのフロー\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-kubelet-to-cp-public.png)


### リクエスト
<a name="_request"></a>

 **1`kubelet`. がリクエストを開始する** 

ハイブリッドノード上の `kubelet` が EKS コントロールプレーンと通信する必要がある場合 (例えば、ノードステータスを報告するため、あるいはポッドの仕様を取得するため) には、ノード登録時に提供された `kubeconfig` ファイルが使用されます。この `kubeconfig` には、ダイレクト IP アドレスではなく、API サーバーエンドポイント URL (Route53 DNS 名) が記載されています。

`kubelet` がエンドポイントに対して DNS ルックアップを実行します (例: `https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com`)。パブリックアクセスクラスターでは、これは AWS で実行中の EKS サービスに属するパブリック IP アドレス (例: `54.239.118.52`) に解決されます。次に `kubelet` は、このエンドポイントへの安全な HTTPS リクエストを作成します。初期パケットは以下のようになります。

```
+--------------------+---------------------+-----------------+
| IP Header          | TCP Header          | Payload         |
| Src: 10.80.0.2     | Src: 52390 (random) |                 |
| Dst: 54.239.118.52 | Dst: 443            |                 |
+--------------------+---------------------+-----------------+
```

 **2. ローカルルーターのルーティング** 

宛先 IP はパブリック IP アドレスであり、ローカルネットワークの一部ではないため、`kubelet` はこのパケットをそのデフォルトゲートウェイ (ローカルオンプレミスルーター) に送信します。ルーターは、宛先 IP を確認して、パブリック IP アドレスであると判断します。

パブリックトラフィックの場合、ルーターは通常、パケットをインターネットゲートウェイ、つまりインターネットへのアウトバウンドトラフィックを処理するボーダールーターに転送します。図では、これを省略しています。実際の転送は、オンプレミスネットワークがどのように設定されているかによって異なります。パケットは、オンプレミスのネットワークインフラストラクチャを通っていき、最終的にインターネットサービスプロバイダーのネットワークに到達します。

 **3. EKS コントロールプレーンまでの配信** 

パケットは、パブリックインターネットとトランジットネットワークを横断していき、AWS のネットワークに到達します。AWS のネットワークは、パケットを適切なリージョンの EKS サービスエンドポイントにルーティングします。EKS サービスに到達したパケットは、クラスターの実際の EKS コントロールプレーンに転送されます。

これはパブリックインターネットを通るルーティングであり、他のトラフィックフローで見られるようなプライベート VPC をルーティングされていくパスとは異なります。その主な違いは、パブリックアクセスモードを使用した場合、ポッドからではなくオンプレミスの `kubelet` から EKS コントロールプレーンへのトラフィックが VPC を経由せず、代わりにグローバルインターネットインフラストラクチャを使用することです。

### 応答
<a name="_response"></a>

EKS コントロールプレーンは、`kubelet` リクエストを処理してレスポンスを返します。

 **3. EKS コントロールプレーンがレスポンスを送信する** 

EKS コントロールプレーンはレスポンスパケットを作成します。このパケットには、ソースとしてパブリック IP、送信先としてハイブリッドノードの IP が含まれています。

```
+--------------------+---------------------+-----------------+
| IP Header          | TCP Header          | Payload         |
| Src: 54.239.118.52 | Src: 443            |                 |
| Dst: 10.80.0.2     | Dst: 52390          |                 |
+--------------------+---------------------+-----------------+
```

 **2. インターネットでのルーティング** 

レスポンスパケットは、インターネットサービスプロバイダーが決定したルーティングパスをたどってインターネット経由で戻り、オンプレミスネットワークのエッジルーターに到達します。

 **1. ローカルでの配信** 

オンプレミスのルーターは、パケットを受信し、宛先 IP (`10.80.0.2`) がローカルネットワークに属していると認識します。次に、受信したパケットをローカルネットワークインフラストラクチャ経由で転送します。パケットがターゲットのハイブリッドノードに到達すると、`kubelet` がレスポンスを受信して処理します。

## ハイブリッドノード `kube-proxy` から EKS コントロールプレーンまでのフロー
<a name="_hybrid_node_kube_proxy_to_eks_control_plane"></a>

クラスターのパブリックエンドポイントアクセスを有効にすると、戻りのトラフィックはパブリックインターネットを使用します。このトラフィックは、ハイブリッドノードの `kube-proxy` から EKS コントロールプレーンへと進み、`kubelet` から EKS コントロールプレーンへのトラフィックと同じパスを通ります。

## EKS コントロールプレーンからハイブリッドノード (`kubelet` サーバー) までのフロー
<a name="hybrid-nodes-concepts-traffic-flows-cp-to-kubelet"></a>

![\[EKS コントロールプレーンからハイブリッドノードまでのフロー\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-cp-to-kubelet.png)


### リクエスト
<a name="_request_2"></a>

 **1. EKS Kubernetes API サーバーがリクエストを開始する** 

EKS Kubernetes API サーバーは、ノードオブジェクトのステータスからノードの IP アドレス (`10.80.0.2`) を取得します。次に、送信先 IP が設定済みのリモートノード CIDR (`10.80.0.0/16`) に属しているため、このリクエストを VPC 内の ENI 経由でルーティングします。初期パケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 67493 (random) |                 |
| Dst: 10.80.0.2  | Dst: 10250          |                 |
+-----------------+---------------------+-----------------+
```

 **2. VPC ネットワークでの処理** 

パケットは、ENI を出て VPC ネットワーキングレイヤーに入り、さらにルーティングするためにサブネットのゲートウェイ宛てに送信されます。

 **3. VPC ルートテーブルのルックアップ** 

EKS コントロールプレーン ENI が含まれているサブネット用の VPC ルートテーブルには、リモートノード CIDR に固有のルート (図の 2 番目のルート) が登録されています。このルーティングルールに基づいて、パケットが VPC-to-onprem ゲートウェイに向けて送信されます。

 **4. 境界を越えて移動する** 

ゲートウェイは、確立済みの接続 (Direct Connect や VPN など) 経由でクラウド境界を越えてオンプレミスネットワークにパケットを転送します。

 **5. オンプレミスネットワークでの受信** 

パケットは、ハイブリッドノードが配置されているサブネット宛てのトラフィックを処理するローカルオンプレミスルーターに到達します。

 **6. 最後の配信** 

ローカルルーターは、宛先 IP (`10.80.0.2`) アドレスが自身に直接接続されているネットワークに属しているかどうかを識別して、ターゲットのハイブリッドノードに直接パケットを転送し、そこで `kubelet` がリクエストを受信して処理します。

### 応答
<a name="_response_2"></a>

ハイブリッドノードの `kubelet` は、リクエストを処理してレスポンスを返します。レスポンスは、同じパスを逆方向にたどります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 10250          |                 |
| Dst: 10.0.0.132 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **6. `kubelet` レスポンスを送信する** 

ハイブリッドノード (`10.80.0.2`) 上の `kubelet` は、送信元の IP を宛先としてレスポンスパケットを作成します。その宛先はローカルネットワークに属していないため、パケットはホストのデフォルトゲートウェイ、つまりローカルルーターに送信されます。

 **5. ローカルルーターのルーティング** 

ルーターは、宛先 IP (`10.0.0.132`) が `10.0.0.0/16` に属していると判断します。ここには、AWS に接続しているゲートウェイを指すルートがあります。

 **4. 境界を越えて戻る** 

パケットは、同じオンプレミスを通って VPC 接続 (Direct Connect や VPN など) まで戻り、クラウド境界を逆方向に横断します。

 **3. VPC でのルーティング** 

パケットが VPC に到達すると、ルートテーブルは宛先 IP が VPC CIDR に属しているかどうかを識別します。パケットは VPC 内にルーティングされます。

 **2. VPC ネットワークでの配信** 

VPC ネットワーキングレイヤーは、EKS コントロールプレーン ENI (`10.0.0.132`) を備えたサブネットにパケットを転送します。

 **1. ENI での受信** 

パケットは、Kubernetes API サーバーにアタッチされている EKS コントロールプレーン ENI に到達します。これでラウンドトリップは完了です。

## ハイブリッドノードで実行されているポッドから EKS コントロールプレーンまでのフロー
<a name="hybrid-nodes-concepts-traffic-flows-pods-to-cp"></a>

![\[ハイブリッドノードで実行されているポッドから EKS コントロールプレーンまでのフロー\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-pod-to-cp.png)


### CNI NAT なし
<a name="_without_cni_nat"></a>

### リクエスト
<a name="_request_3"></a>

ポッドは一般に、`kubernetes` サービスを介して Kubernetes API サーバーと対話します。サービス IP がクラスターのサービス CIDR の最初の IP となります。この規約により、CoreDNS が使用可能になる前に稼働する必要があるポッドが API サーバー (例えば、CNI) に到達できるようになります。リクエストは、サービス IP を宛先としてポッドを出ていきます。例えば、サービス CIDR が `172.16.0.0/16` である場合、サービス IP は `172.16.0.1` になります。

 **1. ポッドがリクエストを開始する** 

ポッドは、ランダムな送信元ポートから API サーバーポート (443) 上の `kubernetes` サービス IP (`172.16.0.1`) にリクエストを送信します。パケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

 **2. CNI での処理** 

CNI は、宛先 IP が自身の管理するポッド CIDR に属していないことを検出します。**送信 NAT が無効になっている**ため、CNI はパケットを変更せずにホストネットワークスタックに渡します。

 **3. ノードネットワークでの処理** 

パケットはノードのネットワークスタックに入り、そこで `netfilter` フックが kube-proxy によって設定された `iptables` ルールをトリガーします。以下の順序でルールがいくつか適用されます。

1. パケットはまず `KUBE-SERVICES` チェーンをヒットします。ここには、各サービスの ClusterIP とポートに対応するルールが含まれています。

1. その対応するルールは、`kubernetes` サービスの `KUBE-SVC-XXX` チェーンにジャンプします (`172.16.0.1:443` 宛てのパケット)。ここには、ロードバランシングルールが含まれています。

1. ロードバランシングルールは、コントロールプレーン ENI IP (`10.0.0.132` または `10.0.1.23`) 用に `KUBE-SEP-XXX` チェーンのいずれかをランダムに選択します。

1. 選択した `KUBE-SEP-XXX` チェーンには実際のルールがあり、それにより宛先 IP はサービス IP から選択されている IP に変更されます。これは、Destination Network Address Translation (宛先ネットワークアドレス変換、DNAT) と呼ばれます。

選択されている EKS コントロールプレーン ENI の IP を `10.0.0.132` とした場合、これらのルールが適用されると、パケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 10.0.0.132 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

宛先 IP がローカルネットワーク内にないため、ノードはパケットをデフォルトゲートウェイに転送します。

 **4. ローカルルーターのルーティング** 

ローカルルーターは、宛先 IP (`10.0.0.132`) が VPC CIDR (`10.0.0.0/16`) に属していると判断して、AWS に接続しているゲートウェイに転送します。

 **5. 境界を越えて移動する** 

パケットは、確立済みの接続 (Direct Connect や VPN など) 経由でクラウド境界を越えて VPC に移動します。

 **6. VPC ネットワークでの配信** 

VPC ネットワーキングレイヤーは、EKS コントロールプレーン ENI (`10.0.0.132`) が存在する適切なサブネットにパケットをルーティングします。

 **7. ENI での受信** 

パケットは、Kubernetes API サーバーにアタッチされている EKS コントロールプレーン ENI に到達します。

### 応答
<a name="_response_3"></a>

EKS コントロールプレーンは、リクエストを処理してポッドにレスポンスを返します。

 **7. API サーバーがレスポンスを送信する** 

EKS Kubernetes API サーバーは、送信元の IP を宛先としてレスポンスパケットを作成します。パケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

宛先 IP が設定済みのリモートポッド CIDR (`10.85.0.0/16`) に属しているため、パケットはサブネットのルーターを次のホップとして VPC 内の ENI 経由で送信されます。

 **6. VPC でのルーティング** 

VPC ルートテーブルにはリモートポッド CIDR (`10.85.0.0/16`) のエントリがあるため、このトラフィックは VPC-to-onprem ゲートウェイ宛てに送信されます。

 **5. 境界を越えて移動する** 

ゲートウェイは、確立済みの接続 (Direct Connect や VPN など) 経由でクラウド境界を越えてオンプレミスネットワークにパケットを転送します。

 **4. オンプレミスネットワークでの受信** 

パケットは、ローカルオンプレミスルーターに到達します。

 **3. ノードへの配信** 

ルーターのテーブルには `10.80.0.2` を次のホップとした `10.85.1.0/24` のエントリがあるため、パケットはノードに配信されます。

 **2. ノードネットワークでの処理** 

パケットがノードのネットワークスタックによって処理されると、`conntrack` (`netfilter` の一部) はポッドが最初に確立した接続とパケットを照合します。DNAT が最初に適用されたため、`conntrack` はソース IP を EKS コントロールプレーン ENI の IP から `kubernetes` サービス IP に書き換えることで DNAT を元に戻します。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **1. CNI での処理** 

CNI は、宛先 IP が自身のネットワーク内のポッドに属しているかどうかを識別して、適切なポッドネットワーク名前空間にパケットを配信します。

このフローは、なぜリモートポッド CIDR を VPC から各ポッドをホストする特定のノードに至るまで正しくルーティングできなければならないかを示しています。戻りパス全体は、クラウドとオンプレミスの両方のネットワーク全体にわたってポッド IP が適切にルーティングされるかどうかによって異なります。

### CNI NAT あり
<a name="_with_cni_nat"></a>

このフローは、*CNI NAT がない*ものと非常によく似ていますが、重要な違いが 1 つあります。CNI は、パケットに送信元 NAT (SNAT) を適用してから、ノードのネットワークスタックにパケットを送信します。これにより、パケットの送信元 IP がノードの IP に変更されるため、追加でルーティングを設定することなく、ノードにパケットをルーティングできます。

### リクエスト
<a name="_request_4"></a>

 **1. ポッドがリクエストを開始する** 

ポッドは、ランダムな送信元ポートから EKS Kubernetes API サーバーポート (443) 上の `kubernetes` サービス IP (`172.16.0.1`) にリクエストを送信します。パケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

 **2. CNI での処理** 

CNI は、宛先 IP が自身の管理するポッド CIDR に属していないことを検出します。**送信 NAT が有効になっている**ため、CNI は SNAT をパケットに適用して送信元 IP をノードの IP に変更してから、パケットをノードのネットワークスタックに渡します。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

注: この例ではわかりやすくするために CNI と `iptables` をそれぞれ別のブロックに分けていますが、実際には `iptables` を使用して NAT を適用する CNI もあります。

 **3. ノードネットワークでの処理** 

ここでは、`kube-proxy` によって設定された `iptables` ルールが前の例と同じように動作して、パケットを EKS コントロールプレーン ENI のいずれかに負荷分散します。これでパケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 67493 (random) |                 |
| Dst: 10.0.0.132 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

宛先 IP がローカルネットワーク内にないため、ノードはパケットをデフォルトゲートウェイに転送します。

 **4. ローカルルーターのルーティング** 

ローカルルーターは、宛先 IP (`10.0.0.132`) が VPC CIDR (`10.0.0.0/16`) に属していると判断して、AWS に接続しているゲートウェイに転送します。

 **5. 境界を越えて移動する** 

パケットは、確立済みの接続 (Direct Connect や VPN など) 経由でクラウド境界を越えて VPC に移動します。

 **6. VPC ネットワークでの配信** 

VPC ネットワーキングレイヤーは、EKS コントロールプレーン ENI (`10.0.0.132`) が存在する適切なサブネットにパケットをルーティングします。

 **7. ENI での受信** 

パケットは、Kubernetes API サーバーにアタッチされている EKS コントロールプレーン ENI に到達します。

### 応答
<a name="_response_4"></a>

EKS コントロールプレーンは、リクエストを処理してポッドにレスポンスを返します。

 **7. API サーバーがレスポンスを送信する** 

EKS Kubernetes API サーバーは、送信元の IP を宛先としてレスポンスパケットを作成します。パケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 443            |                 |
| Dst: 10.80.0.2  | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

宛先 IP が設定済みのリモートノード CIDR (`10.80.0.0/16`) に属しているため、パケットはサブネットのルーターを次のホップとして VPC 内の ENI 経由で送信されます。

 **6. VPC でのルーティング** 

VPC ルートテーブルにはリモートノード CIDR (`10.80.0.0/16`) のエントリがあるため、このトラフィックは VPC-to-onprem ゲートウェイ宛てに送信されます。

 **5. 境界を越えて移動する** 

ゲートウェイは、確立済みの接続 (Direct Connect や VPN など) 経由でクラウド境界を越えてオンプレミスネットワークにパケットを転送します。

 **4. オンプレミスネットワークでの受信** 

パケットは、ローカルオンプレミスルーターに到達します。

 **3. ノードへの配信** 

ローカルルーターは、宛先 IP (`10.80.0.2`) アドレスが自身に直接接続されているネットワークに属しているかどうかを識別して、ターゲットのハイブリッドノードに直接パケットを転送します。

 **2. ノードネットワークでの処理** 

パケットがノードのネットワークスタックによって処理されると、`conntrack` (`netfilter` の一部) はパケットをポッドが最初に確立した接続と照合します。元々 DNAT が適用されていたため、送信元 IP を EKS コントロールプレーン ENI の IP から `kubernetes` サービス IP に書き換えることで元に戻します。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.80.0.2  | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **1. CNI での処理** 

CNI は、このパケットが以前に SNAT が適用された接続に属しているかどうかを識別します。これにより、SNAT が逆方向に適用されるため、宛先 IP がポッドの IP に戻ります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

CNI は、宛先 IP が自身のネットワーク内のポッドに属していることを検出して、適切なポッドネットワーク名前空間にパケットを配信します。

このフローは、CNI NAT の適用により、追加でポッド CIDR のルーティングを行うことなくパケットをノードにルーティングできるようにすることで、設定をどのように簡素化できるかを示しています。

## EKS コントロールプレーンからハイブリッドノードで実行されているポッドまでのフロー (ウェブフック)
<a name="hybrid-nodes-concepts-traffic-flows-cp-to-pod"></a>

![\[EKS コントロールプレーンからハイブリッドノードで実行されているポッドまでのフロー\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-cp-to-pod.png)


このトラフィックパターンはウェブフックで最もよく見られるものであり、ウェブフックではハイブリッドノード上のポッドで実行されているウェブフックサーバーへの接続を EKS コントロールプレーンが直接開始する必要があります。例えば、アドミッションウェブフックを検証して変更するといった場合、このウェブフックはリソースの検証と変更のプロセス中に API サーバーによって呼び出されます。

### リクエスト
<a name="_request_5"></a>

 **1. EKS Kubernetes API サーバーがリクエストを開始する** 

クラスターに設定されたウェブフックが関連する API オペレーションによってトリガーされた場合、EKS Kubernetes API サーバーはそのウェブフックサーバーポッドに直接接続する必要があります。API サーバーはまず、そのウェブフックに関連付けられているサービスリソースまたはエンドポイントリソースでポッドの IP アドレスを検索します。

IP が `10.85.1.23` のハイブリッドノード上でウェブフックポッドが実行されている場合、EKS Kubernetes API サーバーはウェブフックエンドポイントへの HTTPS リクエストを作成します。`10.85.1.23` という宛先 IP は設定済みのリモートポッド CIDR (`10.85.0.0/16`) に属しているため、初期パケットは VPC の EKS コントロールプレーン ENI を介して送信されます。パケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 41892 (random) |                 |
| Dst: 10.85.1.23 | Dst: 8443           |                 |
+-----------------+---------------------+-----------------+
```

 **2. VPC ネットワークでの処理** 

パケットは、EKS コントロールプレーン ENI を出て、サブネットのルーターを次のホップとする VPC ネットワーキングレイヤーに入ります。

 **3. VPC ルートテーブルのルックアップ** 

EKS コントロールプレーン ENI が含まれているサブネット用の VPC ルートテーブルには、リモートポッド CIDR (`10.85.0.0/16`) に固有のルートが登録されています。このルーティングルールにより、パケットは VPC-to-onprem ゲートウェイ (例えば、Direct Connect や VPN 接続の場合は仮想プライベートゲートウェイ) 宛てに送信されます。

```
Destination     Target
10.0.0.0/16     local
10.85.0.0/16    vgw-id (VPC-to-onprem gateway)
```

 **4. 境界を越えて移動する** 

ゲートウェイは、確立済みの接続 (Direct Connect や VPN など) 経由でクラウド境界を越えてオンプレミスネットワークにパケットを転送します。パケットがこの接続を通過するとき、パケットの送信元 IP アドレスと宛先 IP アドレスは元のまま維持されます。

 **5. オンプレミスネットワークでの受信** 

パケットは、ローカルオンプレミスルーターに到達します。ルーターは、自身のルーティングテーブルに問い合わせて、10.85.1.23 アドレスに到達する方法を決定します。そのためにオンプレミスネットワークには、適切なハイブリッドノード宛てにトラフィックを送信するポッド CIDR へのルートが必要です。

この例の場合、ルーターのルートテーブルには IP が `10.80.0.2` のハイブリッドノード経由で `10.85.1.0/24` サブネットに到達できることを示すエントリが登録されています。

```
Destination     Next Hop
10.85.1.0/24    10.80.0.2
```

 **6. ノードへの配信** 

ルーターは、ルーティングテーブルのエントリに基づいて、パケットをハイブリッドノード (`10.80.0.2`) に転送します。ノードに到達したとき、パケットは EKS Kubernetes API サーバーから送信されたときと同じままで、宛先 IP は依然としてポッドの IP です。

 **7. CNI での処理** 

ノードのネットワークスタックは、パケットを受信し、宛先 IP がノード自体の IP でないことを確認して、さらに処理するために CNI に渡します。CNI は、宛先 IP がこのノードでローカルに実行されているポッドに属しているかどうかを識別し、適切な仮想インターフェイス経由で適切なポッドにパケットを転送します。

```
Original packet -> node routing -> CNI -> Pod's network namespace
```

ポッド内のウェブフックサーバーは、リクエストを受信して処理します。

### 応答
<a name="_response_5"></a>

ウェブフックポッドは、リクエストを処理してレスポンスを返します。レスポンスは、同じパスを逆方向にたどります。

 **7. ポッドがレスポンスを送信する** 

ウェブフックポッドは、自身の IP を送信元とし、元のリクエスタ (EKS コントロールプレーン ENI) を宛先として、レスポンスパケットを作成します。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.23 | Src: 8443           |                 |
| Dst: 10.0.0.132 | Dst: 41892          |                 |
+-----------------+---------------------+-----------------+
```

CNI は、このパケットが外部ネットワーク (ローカルポッドではない) に送信され、パケットが、元のソース IP を保持したままノードのネットワークスタックに渡されたことを確認します。

 **6. ノードネットワークでの処理** 

ノードは、宛先 IP (`10.0.0.132`) がローカルネットワーク内にないと判断して、自身のデフォルトゲートウェイ (ローカルルーター) にパケットを転送します。

 **5. ローカルルーターのルーティング** 

ローカルルーターは、自身のルーティングテーブルに問い合わせて、宛先 IP (`10.0.0.132`) が VPC CIDR (`10.0.0.0/16`) に属していると判断します。次に、AWS に接続しているゲートウェイにパケットを転送します。

 **4. 境界を越えて移動する** 

パケットは、同じオンプレミスを通って VPC 接続まで戻り、クラウド境界を逆方向に横断します。

 **3. VPC でのルーティング** 

パケットが VPC に到達すると、ルートテーブルは宛先 IP が VPC 内のサブネットに属しているかどうかを識別します。それに応じて、パケットは VPC 内にルーティングされます。

 **2. と 1. EKS コントロールプレーン ENI での受信** 

パケットは、Kubernetes API サーバーにアタッチされている ENI に到達します。これでラウンドトリップは完了です。API サーバーは、ウェブフックレスポンスを受信し、このレスポンスに基づいて元の API リクエストの処理を続行します。

このトラフィックフローは、なぜリモートポッド CIDR を正しく設定してルーティングする必要があるかを示しています。
+ VPC には、オンプレミスゲートウェイを指すリモートポッド CIDR のルートが登録されている必要があります。
+ オンプレミスネットワークには、そうしたポッドをホストしている特定のノード宛てにトラフィックを送信するポッド CIDR のルートが登録されている必要があります。
+ このルーティング設定がないと、ハイブリッドノード上のポッドで実行されているウェブフックやその他の同じようなサービスに EKS コントロールプレーンから到達できなくなります。

## ハイブリッドノードで実行されているポッド間
<a name="hybrid-nodes-concepts-traffic-flows-pod-to-pod"></a>

![\[ハイブリッドノードで実行されているポッド間\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-pod-to-pod.png)


このセクションでは、異なるハイブリッドノード上で実行されているポッド同士がどのように通信しているかについて説明します。この例では、CNI がカプセル化に VXLAN を使用しているものとします。これは、Cilium や Calico などの CNI でよく見られることです。プロセス全体は、Geneve や IP-in-IP など、他のカプセル化プロトコルに似ています。

### リクエスト
<a name="_request_6"></a>

 **1. ポッド A が通信を開始する** 

ノード 1 上のポッド A (`10.85.1.56`) が、ノード 2 上のポッド B (`10.85.2.67`) にトラフィックを送信しようとしています。初期パケットは以下のようになります。

```
+------------------+-----------------+-------------+-----------------+
| Ethernet Header  | IP Header       | TCP/UDP     | Payload         |
| Src: Pod A MAC   | Src: 10.85.1.56 | Src: 43721  |                 |
| Dst: Gateway MAC | Dst: 10.85.2.67 | Dst: 8080   |                 |
+------------------+-----------------+-------------+-----------------+
```

 **2. CNI がパケットをインターセプトして処理する** 

ポッド A のパケットが自身のネットワーク名前空間を出ると、CNI がそのパケットをインターセプトします。CNI は自身のルーティングテーブルに問い合わせて、宛先 IP (`10.85.2.67`) はポッド CIDR に属している、この IP はローカルノードではなくノード 2 (`10.80.0.3`) に属している、パケットは VXLAN でカプセル化する必要がある、と判断します。

カプセル化するという判断は重要です。基盤となる物理ネットワークが、ノード IP 間のトラフィックをルーティングする方法は認識しているものの、ポッド CIDR を直接ルーティングする方法は認識していないためです。

CNI は、元のパケット全体を VXLAN フレーム内にカプセル化します。これにより、「パケット内のパケット」が次のような新しいヘッダー付きで効果的に作成されます。

```
+-----------------+----------------+--------------+------------+---------------------------+
| Outer Ethernet  | Outer IP       | Outer UDP    | VXLAN      | Original Pod-to-Pod       |
| Src: Node1 MAC  | Src: 10.80.0.2 | Src: Random  | VNI: 42    | Packet (unchanged         |
| Dst: Router MAC | Dst: 10.80.0.3 | Dst: 8472    |            | from above)               |
+-----------------+----------------+--------------+------------+---------------------------+
```

このカプセル化の重要なポイントは、外側のパケットにはノード 1 (`10.80.0.2`) からノード 2 (`10.80.0.3`) までのアドレスが指定されること、UDP ポート `8472` は Cilium がデフォルトで使用する VXLAN ポートであること、VXLAN Network Identifier (VNI) はこのパケットが属するオーバーレイネットワークを識別すること、元のパケット (ポッド A の IP を送信元とし、ポッド B の IP を宛先とする) 全体が内側でもそのまま保持されることです。

これで、カプセル化されたパケットは、ノード 1 の通常のネットワークスタックに入って、他のパケットと同じ方法で処理されます。

1.  **ノードネットワークでの処理**: ノード 1 のネットワークスタックは、宛先 (`10.80.0.3`) に基づいてパケットをルーティングします。

1.  **ローカルネットワークでの配信**:
   + 両方のノードが同じレイヤー 2 ネットワークにある場合、パケットはノード 2 に直接送信されます。
   + それぞれ別のサブネットにある場合、パケットはまずローカルルーターに転送されます。

1.  **ルーターでの処理**: ルーターは、自身のルーティングテーブルに基づいてパケットを転送して、ノード 2 に配信します。

 **3. 受信側のノードでの処理** 

カプセル化されたパケットがノード 2 (`10.80.0.3`) に到達すると、次のようになります。

1. ノードのネットワークスタックは、パケットを受信し、VXLAN パケット (UDP ポート `4789`) であると識別します。

1. パケットは、さらに処理するために CNI の VXLAN インターフェイスに渡されます。

 **4. VXLAN カプセル化解除** 

ノード 2 上の CNI は、次のように VXLAN パケットを処理します。

1. 外側のヘッダー (イーサネット、IP、UDP、VXLAN) を取り除きます。

1. 内側の元のパケットを抽出します。

1. これで、パケットは元の形式に戻ります。

```
+------------------+-----------------+-------------+-----------------+
| Ethernet Header  | IP Header       | TCP/UDP     | Payload         |
| Src: Pod A MAC   | Src: 10.85.1.56 | Src: 43721  |                 |
| Dst: Gateway MAC | Dst: 10.85.2.67 | Dst: 8080   |                 |
+------------------+-----------------+-------------+-----------------+
```

ノード 2 上の CNI は、宛先 IP (`10.85.2.67`) を確認して、次の処理を行います。

1. この IP がローカルポッドに属しているかどうかを識別します。

1. 適切な仮想インターフェイス経由でパケットをルーティングします。

1. ポッド B のネットワーク名前空間にパケットを配信します。

### 応答
<a name="_response_6"></a>

ポッド B がポッド A に応答するときは、プロセス全体が逆方向になります。

1. ポッド B がポッド A (`10.85.1.56`) にパケットを送信します。

1. ノード 2 の CNI は、そのパケットを VXLAN でカプセル化し、宛先をノード 1 (`10.80.0.2`) に設定します。

1. カプセル化されたパケットがノード 1 に配信されます。

1. ノード 1 の CNI は、パケットをカプセル化解除し、元のレスポンスをポッド A に配信します。

## クラウドノード上のポッドからハイブリッドノード上のポッドまでのフロー (東西トラフィック)
<a name="hybrid-nodes-concepts-traffic-flows-east-west"></a>

![\[クラウドノード上のポッドからハイブリッドノード上のポッドまでのフロー\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-east-west.png)


### リクエスト
<a name="_request_7"></a>

 **1. ポッド A が通信を開始する** 

EC2 ノード上のポッド A (`10.0.0.56`) がハイブリッドノード上のポッド B (`10.85.1.56`) にトラフィックを送信しようとしています。初期パケットは以下のようになります。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.56  | Src: 52390 (random) |                 |
| Dst: 10.85.1.56 | Dst: 8080           |                 |
+-----------------+---------------------+-----------------+
```

VPC CNI では、ポッド A に VPC CIDR からの IP があるため、ポッド A は EC2 インスタンス上の ENI に直接アタッチされます。ポッドのネットワーク名前空間は VPC ネットワークに接続されているため、パケットは VPC ルーティングインフラストラクチャに直接入ります。

 **2. VPC でのルーティング** 

VPC ルートテーブルにはリモートポッド CIDR (`10.85.0.0/16`) に固有のルートが登録されているため、このトラフィックは VPC-to-onprem ゲートウェイ宛てに送信されます。

```
Destination     Target
10.0.0.0/16     local
10.85.0.0/16    vgw-id (VPC-to-onprem gateway)
```

このルーティングルールに基づいて、パケットはオンプレミスネットワークに接続しているゲートウェイに向けて送信されます。

 **3. 境界を越えて移動する** 

ゲートウェイは、確立済みの接続 (Direct Connect や VPN など) 経由でクラウド境界を越えてオンプレミスネットワークにパケットを転送します。このトランジットを全体を通して、パケットの送信元 IP アドレスと宛先 IP アドレスは元のまま維持されます。

 **4. オンプレミスネットワークでの受信** 

パケットは、ローカルオンプレミスルーターに到達します。ルーターは、自身のルーティングテーブルに問い合わせて、10.85.1.56 アドレスに到達するための次のホップを決定します。オンプレミスルーターには、適切なハイブリッドノード宛てにトラフィックを送信するポッド CIDR へのルートが必要です。

ルーターのルートテーブルには IP `10.80.0.2` のハイブリッドノード経由で `10.85.1.0/24` サブネットに到達できることを示すエントリが登録されています。

```
Destination     Next Hop
10.85.1.0/24    10.80.0.2
```

 **5. ノードネットワークでの処理** 

ルーターは、パケットをハイブリッドノード (`10.80.0.2`) に転送します。パケットがノードに到達したとき、パケットのポッド A の IP は送信元のまま、ポッド B の IP は宛先のままです。

 **6. CNI での処理** 

ノードのネットワークスタックは、パケットを受信し、宛先 IP が自身のものでないことを確認して、さらに処理するために CNI に渡します。CNI は、宛先 IP がこのノードでローカルに実行されているポッドに属しているかどうかを識別し、適切な仮想インターフェイス経由で適切なポッドにパケットを転送します。

```
Original packet -> node routing -> CNI -> Pod B's network namespace
```

ポッド B は、パケットを受信し、必要に応じて処理します。

### 応答
<a name="_response_7"></a>

 **6. ポッド B がレスポンスを送信する** 

ポッド B は、自身の IP を送信元、ポッド A の IP を宛先として、レスポンスパケットを作成します。

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 8080           |                 |
| Dst: 10.0.0.56  | Dst: 52390          |                 |
+-----------------+---------------------+-----------------+
```

CNI は、このパケットが外部ネットワーク宛てかどうかを識別して、ノードのネットワークスタックに渡します。

 **5. ノードネットワークでの処理** 

ノードは、宛先 IP (`10.0.0.56`) がローカルネットワークに属していないと判断し、自身のデフォルトゲートウェイ (ローカルルーター) にパケットを転送します。

 **4. ローカルルーターのルーティング** 

ローカルルーターは、自身のルーティングテーブルに問い合わせて、宛先 IP (`10.0.0.56`) が VPC CIDR (`10.0.0.0/16`) に属していると判断します。次に、AWS に接続しているゲートウェイにパケットを転送します。

 **3. 境界を越えて移動する** 

パケットは、同じオンプレミスを通って VPC 接続まで戻り、クラウド境界を逆方向に横断します。

 **2. VPC でのルーティング** 

パケットが VPC に到達すると、ルーティングシステムは宛先 IP が VPC 内のサブネットに属しているかどうかを識別します。パケットは、ポッド A をホストしている EC2 インスタンスに向けて、VPC ネットワーク経由でルーティングされます。

 **1. ポッド A がレスポンスを受信する** 

パケットは、EC2 インスタンスに到達し、そこにアタッチされている ENI 経由でポッド A に直接配信されます。VPC CNI は VPC 内のポッドにオーバーレイネットワーキングを使用しないため、別途カプセル化解除は必要なく、パケットは元のヘッダーのまま届きます。

この東西トラフィックフローは、なぜリモートポッド CIDR を正しく設定して、両方向からルーティング可能にする必要があるかを示しています。
+ VPC には、オンプレミスゲートウェイを指すリモートポッド CIDR のルートが登録されている必要があります。
+ オンプレミスネットワークには、そうしたポッドをホストしている特定のノード宛てにトラフィックを送信するルートがポッド CIDR で登録されている必要があります。

# ハイブリッドノード `nodeadm` 参照
<a name="hybrid-nodes-nodeadm"></a>

Amazon EKS Hybrid Nodes CLI (`nodeadm`) は、ハイブリッドノードコンポーネントのインストール、設定、登録、アンインストールを簡素化します。オペレーティングシステムイメージに `nodeadm` を含めると、ハイブリッドノードのブートストラップを自動化できます。詳細については、「[ハイブリッドノード用のオペレーティングシステムを準備する](hybrid-nodes-os.md)」を参照してください。

ハイブリッドノードの `nodeadm` バージョンは、Amazon EKS クラスター内のノードとして Amazon EC2 インスタンスをブートストラップするために使用される `nodeadm` バージョンとは異なります。適切な `nodeadm` バージョンのドキュメントとリファレンスに従ってください。このドキュメントページは、ハイブリッドノードの `nodeadm` バージョンを対象としています。

ハイブリッドノード `nodeadm` のソースコードは、https://github.com/aws/eks-hybrid GitHub リポジトリで公開されています。

**重要**  
root/sudo 権限を持つユーザーで `nodeadm` を実行する必要があります。

## `nodeadm` のダウンロード
<a name="_download_nodeadm"></a>

`nodeadm` のハイブリッドノード版は Amazon CloudFront をフロントに置いた Amazon S3 でホストされます。各オンプレミスホストに `nodeadm` をインストールするにはオンプレミスホストから以下のコマンドを実行してください。

 **x86\$164 ホストの場合** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/amd64/nodeadm'
```

 **ARM ホストの場合** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/arm64/nodeadm'
```

各ホストでダウンロードしたバイナリに実行可能ファイルのアクセス許可を追加します。

```
chmod +x nodeadm
```

## `nodeadm install`
<a name="_nodeadm_install"></a>

`nodeadm install` コマンドはハイブリッドノードを実行して Amazon EKS クラスターに結合するために必要なアーティファクトと依存関係をインストールするために使用されます。`nodeadm install` コマンドは各ハイブリッドノードで個別に実行することも、イメージビルドパイプライン中に実行して、オペレーティングシステムイメージにハイブリッドノードの依存関係をプリインストールすることもできます。

 **使用方法** 

```
nodeadm install [KUBERNETES_VERSION] [flags]
```

 **位置引数** 

(必須 `KUBERNETES_VERSION` インストールする EKS Kubernetes のメジャーバージョンとマイナーバージョン (例: `1.32`) 

 **Flags** 


| 名前 | 必要 | 説明 | 
| --- | --- | --- | 
|   `-p`,  `--credential-provider`   |  正  |  インストールする認証情報プロバイダー。サポートされている値は`iam-ra` および `ssm` です。詳細については「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。  | 
|   `-s`,  `--containerd-source`   |  誤  |  `containerd` のソース。`nodeadm` はOS ディストリビューション、Docker パッケージからの `containerd` のインストール、および `containerd` のインストールのスキップをサポートしています。  **[値]**   `distro` - これはデフォルト値です。`nodeadm` は、EKS Kubernetes バージョンと互換性のある、ノード OS によって配布される最新の `containerd` パッケージをインストールします。`distro` は Red Hat Enterprise Linux (RHEL) オペレーティングシステムでサポートされる値ではありません。  `docker` — `nodeadm` は、EKS Kubernetes バージョンと互換性のある、Docker によって構築および配布された最新の `containerd` パッケージをインストールします。`docker` は Amazon Linux 2023 でサポートされる値ではありません。  `none` — `nodeadm` は `containerd` パッケージをインストールしません。`nodeadm init` を実行する前に、`containerd` を手動でインストールする必要があります。  | 
|   `-r`,  `--region`   |  FALSE  |  SSM エージェントといったアーティファクトをダウンロードするための AWS リージョンを指定します。デフォルトは `us-west-2` です。  | 
|   `-t`,  `--timeout`   |  FALSE  |  install コマンドの最大実行時間。入力は時間形式に従います。例: `1h23m`。install コマンドのデフォルトのダウンロードタイムアウトは 20 分に設定されています。  | 
|   `-h`, `--help`   |  誤  |  使用可能なフラグ、サブコマンド、位置値パラメータを含むヘルプメッセージを表示します。  | 

 **例** 

認証情報プロバイダーとして AWS システムマネージャー (SSM 使用して Kubernetes バージョン `1.32` をインストールする

```
nodeadm install 1.32 --credential-provider ssm
```

AWS システムマネージャー (SSM 認証情報プロバイダーとして、Docker を containerd のソースとして、ダウンロードタイムアウトを 20 分にして Kubernetes バージョン `1.32` をインストールします。

```
nodeadm install 1.32 --credential-provider ssm --containerd-source docker --timeout 20m
```

認証情報プロバイダーとして AWS IAM Roles Anywhere を使用して Kubernetes バージョン `1.32` をインストールする

```
nodeadm install 1.32 --credential-provider iam-ra
```

## `nodeadm config check`
<a name="_nodeadm_config_check"></a>

`nodeadm config check` コマンドは提供されたノード設定にエラーがないか確認します。このコマンドはハイブリッドノード設定ファイルの正確性を検証するために使用できます。

 **使用方法** 

```
nodeadm config check [flags]
```

 **Flags** 


| 名前 | 必要 | 説明 | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  正  |  nodeadm 設定のソース。ハイブリッドノードの場合、入力は file スキームを使用する URI に従う必要があります。  | 
|   `-h`, `--help`   |  誤  |  使用可能なフラグ、サブコマンド、位置値パラメータを含むヘルプメッセージを表示します。  | 

 **例** 

```
nodeadm config check -c file://nodeConfig.yaml
```

## `nodeadm init`
<a name="_nodeadm_init"></a>

`nodeadm init` コマンドはハイブリッドノードを起動し、設定された Amazon EKS クラスターに接続します。`nodeConfig.yaml` ファイルの設定方法の詳細については、「[SSM ハイブリッドアクティベーション用のノード設定](#hybrid-nodes-node-config-ssm)」または「[IAM Roles Anywhere 用のノード設定](#hybrid-nodes-node-config-iamra)」を参照してください。

 **使用方法** 

```
nodeadm init [flags]
```

 **Flags** 


| 名前 | 必要 | 説明 | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  正  |  `nodeadm` 設定のソース。ハイブリッドノードの場合、入力は file スキームを使用する URI に従う必要があります。  | 
|   `-s`,  `--skip`   |  誤  |  スキップする `init` のフェーズ。問題の修正に役立つ場合を除き、どのフェーズもスキップすることはお勧めしません。  **[値]**   `install-validation` は、先行する install コマンドが正常に実行されたかどうかの確認をスキップします。  ノードでファイアウォールが有効になっている場合、`cni-validation` は Cilium または Calico CNI の VXLAN ポートが開かれているかどうかの確認をスキップします。  `node-ip-validation` は、ノード IP がリモートノードネットワークの CIDR 内に含まれているかどうかのチェックをスキップします。  | 
|   `-h`, `--help`   |  FALSE  |  使用可能なフラグ、サブコマンド、位置値パラメータを含むヘルプメッセージを表示します。  | 

 **例** 

```
nodeadm init -c file://nodeConfig.yaml
```

## `nodeadm upgrade`
<a name="_nodeadm_upgrade"></a>

`nodeadm upgrade` コマンドはインストールされているすべてのアーティファクトを最新バージョンにアップグレードし、ノードをブートストラップしてアップグレードされたアーティファクトを設定し、AWS の EKS クラスターに参加させます。アップグレードはノードで実行されているワークロードに対する破壊的なコマンドです。アップグレードを実行する前にはワークロードを別のノードに移動してください。

 **使用方法** 

```
nodeadm upgrade [KUBERNETES_VERSION] [flags]
```

 **位置引数** 

(必須 `KUBERNETES_VERSION` インストールする EKS Kubernetes のメジャーバージョンとマイナーバージョン (例: `1.32`) 

 **Flags** 


| 名前 | 必要 | 説明 | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  正  |  `nodeadm` 設定のソース。ハイブリッドノードの場合、入力は file スキームを使用する URI に従う必要があります。  | 
|   `-t`,  `--timeout`   |  誤  |  アーティファクトのダウンロードのタイムアウト。入力は時間形式に従います。たとえば、1h23m です。upgrade コマンドのデフォルトのダウンロードタイムアウトは 10 分に設定されています。  | 
|   `-s`,  `--skip`   |  誤  |  スキップするアップグレードフェーズ。問題の修正に役立つ場合を除き、どのフェーズもスキップすることはお勧めしません。  **[値]**   `pod-validation` はデーモンセットと静的ポッドを除くすべてのポッドがノード上で実行されていないことのチェックをスキップします。  `node-validation` はノードが隔離されているかどうかの確認をスキップします。  `init-validation` はアップグレードを実行する前にノードが正常に初期化されたかどうかの確認をスキップします。  `containerd-major-version-upgrade` は、ノードのアップグレード時に containerd のメジャーバージョンがアップグレードされないようにします。  | 
|   `-h`, `--help`   |  FALSE  |  使用可能なフラグ、サブコマンド、位置値パラメータを含むヘルプメッセージを表示します。  | 

 **例** 

```
nodeadm upgrade 1.32 -c file://nodeConfig.yaml
```

```
nodeadm upgrade 1.32 -c file://nodeConfig.yaml --timeout 20m
```

## `nodeadm uninstall`
<a name="_nodeadm_uninstall"></a>

`nodeadm uninstall` コマンドはkubelet や containerd など、`nodeadm install` の実行中に `nodeadm` がインストールしたアーティファクトを停止および削除してください。uninstall コマンドはクラスターからハイブリッドノードをドレインまたは削除しないことに注意してください。ドレインと削除の操作は個別に実行する必要があります。詳細については「[ハイブリッドノードを削除する](hybrid-nodes-remove.md)」を参照してください。デフォルトではノードにポッドが残っている場合、`nodeadm uninstall` は続行されません。同様に、`nodeadm uninstall` は CNI 依存関係や、クラスターで実行している他の Kubernetes アドオンの依存関係を削除しません。ホストから CNI インストールを完全に削除するには「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順を参照してください。オンプレミス認証情報プロバイダーとして AWS SSM ハイブリッドアクティベーションを使用している場合、`nodeadm uninstall` コマンドはホストを AWS SSM マネージドインスタンスから登録解除します。

 **使用方法** 

```
nodeadm uninstall [flags]
```

 **Flags** 


| 名前 | 必要 | 説明 | 
| --- | --- | --- | 
|   `-s`,  `--skip`   |  誤  |  アンインストール時にスキップするフェーズ。問題の修正に役立つ場合を除き、どのフェーズもスキップすることはお勧めしません。  **[値]**   `pod-validation` はデーモンセットと静的ポッドを除くすべてのポッドがノード上で実行されていないことのチェックをスキップします。  `node-validation` はノードが隔離されているかどうかの確認をスキップします。  `init-validation` はアンインストールを実行する前にノードが正常に初期化されたかどうかの確認をスキップします。  | 
|   `-h`,  `--help`   |  FALSE  |  使用可能なフラグ、サブコマンド、位置値パラメータを含むヘルプメッセージを表示します。  | 
|   `-f`,  `--force`   |  FALSE  |  Kubernetes および CNI コンポーネントからの残存ファイルを含む可能性のある追加のディレクトリを強制的に削除します。  **警告**  これにより、デフォルトの Kubernetes および CNI ディレクトリのすべてのコンテンツ (`/var/lib/cni`、`/etc/cni/net.d` など) が削除されます。これらの場所に独自のデータを保存する場合は、このフラグを使用しないでください。 nodeadm `v1.0.9` 以降、`./nodeadm uninstall --skip node-validation,pod-validation --force` コマンドは `/var/lib/kubelet` ディレクトリを削除しなくなりました。これは、マウントされたノードファイルシステムを含むことがある Pod ボリュームと volume-subpath ディレクトリが含まれている可能性があるためです。  **安全な処理のヒント**  - マウントされたパスを削除すると、実際にマウントされたノードファイルシステムが誤って削除される可能性があります。`/var/lib/kubelet` ディレクトリを手動で削除する前に、すべてのアクティブなマウントを慎重に検査し、ボリュームを安全にマウント解除して、データ損失を回避します。  | 

 **例** 

```
nodeadm uninstall
```

```
nodeadm uninstall --skip node-validation,pod-validation
```

## `nodeadm debug`
<a name="_nodeadm_debug"></a>

`nodeadm debug` コマンドは異常または誤設定のハイブリッドノードのトラブルシューティングに使用できます。以下の要件が満たされていることを検証します。
+ ノードが認証情報を取得するために必要な AWS API へのネットワークアクセスがあること
+ ノードが設定されたハイブリッドノードの IAM ロールに対し AWS 認証情報を取得できること
+ ノードに EKS Kubernetes API エンドポイントへのネットワークアクセスがあり、EKS Kubernetes API エンドポイント証明書が有効であること
+ ノードが EKS クラスターに対し認証でき、クラスター内での ID が有効で、EKS クラスター用に設定された VPC を介して EKS クラスターにアクセスできること。

エラーが見つかった場合、コマンドの出力はトラブルシューティングのステップを提示します。特定の検証ステップは子プロセスを示しています。これらが失敗した場合、出力は検証エラーの下の stderr セクションに表示されます。

 **使用方法** 

```
nodeadm debug [flags]
```

 **Flags** 


| 名前 | 必要 | 説明 | 
| --- | --- | --- | 
|   `-c`, `--config-source`   |  正  |  `nodeadm` 設定のソース。ハイブリッドノードの場合、入力は file スキームを使用する URI に従う必要があります。  | 
|   `--no-color`   |  FALSE  |  色の出力を無効にします。自動化に役立ちます。  | 
|   `-h`, `--help`   |  FALSE  |  使用可能なフラグ、サブコマンド、位置値パラメータを含むヘルプメッセージを表示します。  | 

 **例** 

```
nodeadm debug -c file://nodeConfig.yaml
```

## Nodeadm ファイルの場所
<a name="_nodeadm_file_locations"></a>

### nodeadm のインストール
<a name="_nodeadm_install_2"></a>

`nodeadm install` を実行すると、以下のファイルおよびファイルの場所が設定されます。


| アーティファクト | パス | 
| --- | --- | 
|  IAM Roles Anywhere  |  /usr/local/bin/aws\$1signing\$1helper  | 
|  Kubelet binary  |  /usr/bin/kubelet  | 
|  Kubectl binary  |  usr/local/bin/kubectl  | 
|  ECR Credentials Provider  |  /etc/eks/image-credential-provider/ecr-credential-provider  | 
|   AWS IAM オーセンティケーター  |  /usr/local/bin/aws-iam-authenticator  | 
|  SSM Setup CLI  |  /opt/ssm/ssm-setup-cli  | 
|  SSM Agent  |  Ubuntu の場合 - /snap/amazon-ssm-agent/current/amazon-ssm-agent RHEL および AL2023 の場合 - /usr/bin/amazon-ssm-agent  | 
|  Containerd  |  Ubuntu および AL2023 の場合 - /usr/bin/containerd RHEL の場合 - /bin/containerd  | 
|  Iptables  |  Ubuntu および AL2023 の場合 - /usr/sbin/iptables RHEL の場合 - /sbin/iptables  | 
|  CNI プラグイン  |  /opt/cni/bin  | 
|  インストール済みアーティファクトトラッカー  |  /opt/nodeadm/tracker  | 

### nodeadm init
<a name="_nodeadm_init_2"></a>

`nodeadm init` を実行すると、以下のファイルおよびファイルの場所が設定されます。


| 名前 | パス | 
| --- | --- | 
|  Kubelet kubeconfig  |  /var/lib/kubelet/kubeconfig  | 
|  Kubelet 設定  |  /etc/kubernetes/kubelet/config.json  | 
|  Kubelet systemd ユニット  |  /etc/systemd/system/kubelet.service  | 
|  イメージ認証情報プロバイダー設定  |  /etc/eks/image-credential-provider/config.json  | 
|  Kubelet 環境ファイル  |  /etc/eks/kubelet/environment  | 
|  Kubelet 証明書  |  /etc/kubernetes/pki/ca.crt  | 
|  Containerd 設定  |  /etc/containerd/config.toml  | 
|  Containerd カーネルモジュール設定  |  /etc/modules-load.d/contianerd.conf  | 
|   AWS 設定ファイル  |  /etc/aws/hybrid/config  | 
|   AWS 認証情報ファイル (認証情報ファイルを有効にする場合)  |  /eks-hybrid/.aws/credentials  | 
|   AWS 署名ヘルパーシステムユニット  |  /etc/systemd/system/aws\$1signing\$1helper\$1update.service  | 
|  Sysctl 設定ファイル  |  /etc/sysctl.d/99-nodeadm.conf  | 
|  Ca-certificates  |  /etc/ssl/certs/ca-certificates.crt  | 
|  Gpg キーファイル  |  /etc/apt/keyrings/docker.asc  | 
|  Docker リポジトリソースファイル  |  /etc/apt/sources.list.d/docker.list  | 

## SSM ハイブリッドアクティベーション用のノード設定
<a name="hybrid-nodes-node-config-ssm"></a>

ハイブリッドノードの認証情報に AWS SSM ハイブリッドアクティベーションを使用する場合の `nodeConfig.yaml` の例を以下に示します。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

## IAM Roles Anywhere 用のノード設定
<a name="hybrid-nodes-node-config-iamra"></a>

ハイブリッドノードの認証情報用の AWS IAM Roles Anywhere の `nodeConfig.yaml` の例を以下に示します。

AWS IAM Roles Anywhere をオンプレミス認証情報プロバイダーとして使用する場合、`nodeadm` 設定で使用する `nodeName` はハイブリッドノードの IAM ロールを対象としたアクセス許可と一致する必要があります。たとえば、ハイブリッドノードの IAM ロールのアクセス許可ではロールセッション名がホスト証明書の CN と一致する場合しか AWS IAM Roles Anywhere がロールを引き受けることは許可されない場合、`nodeadm` 設定の `nodeName` は証明書の CN と同じである必要があります。使用する `nodeName` は 64 文字以下にする必要があります。詳細については、「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:              # Name of the EKS cluster
    region:            # AWS Region where the EKS cluster resides
  hybrid:
    iamRolesAnywhere:
      nodeName:        # Name of the node
      trustAnchorArn:  # ARN of the IAM Roles Anywhere trust anchor
      profileArn:      # ARN of the IAM Roles Anywhere profile
      roleArn:         # ARN of the Hybrid Nodes IAM role
      certificatePath: # Path to the certificate file to authenticate with the IAM Roles Anywhere trust anchor
      privateKeyPath:  # Path to the private key file for the certificate
```

## kubelet をカスタマイズするためのノード設定 (オプション)
<a name="hybrid-nodes-nodeadm-kubelet"></a>

`nodeadm` 設定で kubelet 設定とフラグを渡すことができます。追加のノードラベル `abc.amazonaws.com/test-label` を追加する方法と、`shutdownGracePeriod` を 30 秒に設定するための設定については以下の例を参照してください。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  kubelet:
    config:           # Map of kubelet config and values
       shutdownGracePeriod: 30s
    flags:            # List of kubelet flags
       - --node-labels=abc.company.com/test-label=true
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

## containerd をカスタマイズするためのノード設定 (オプション)
<a name="_node_config_for_customizing_containerd_optional"></a>

`nodeadm` 設定でカスタム containerd 設定を渡すことができます。`nodeadm` の containerd 設定はインライン TOML を受け入れます。containerd コンテンツストアで解凍されたイメージレイヤーの削除を無効にするための containerd の設定方法については以下の例を参照してください。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  containerd:
    config: |         # Inline TOML containerd additional configuration
       [plugins."io.containerd.grpc.v1.cri".containerd]
       discard_unpacked_layers = false
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

**注記**  
containerd のバージョン 1.x と 2.x では、異なる設定形式が使用されます。containerd 1.x は設定バージョン 2 を使用し、containerd 2.x は設定バージョン 3 を使用します。containerd 2.x は設定バージョン 2 と下位互換性がありますが、最適なパフォーマンスを得るには設定バージョン 3 をお勧めします。`containerd --version` を使用して containerd バージョンを確認するか、`nodeadm` のインストールログを確認します。設定のバージョニングの詳細については、https://containerd.io/releases/ を参照してください。

containerd 設定を使用して SELinux サポートを有効にすることもできます。containerd で SELinux が有効になっている場合はノードでスケジュールされたポッドで適切な securityContext と seLinuxOptions が有効になっていることを確認してください。セキュリティコンテキストの設定の詳細については[Kubernetes ドキュメント](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)を参照してください。

**注記**  
Red Hat Enterprise Linux (RHEL 8 および RHEL 9 では SELinux がデフォルトで有効になっており、ホスト上で strict に設定されています。Amazon Linux 2023 はデフォルトで SELinux が有効になっており、許可モードに設定されています。SELinux がホストで許可モードに設定されている場合、containerd で有効にしてもリクエストはブロックされませんが、ホストの SELinux 設定に従ってログに記録されます。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  containerd:
    config: |         # Inline TOML containerd additional configuration
       [plugins."io.containerd.grpc.v1.cri"]
       enable_selinux = true
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

# ハイブリッドノードのトラブルシューティング
<a name="hybrid-nodes-troubleshooting"></a>

このトピックでは、Amazon EKS Hybrid Nodes の使用中に表示される一般的なエラーとその修復方法について説明します。その他のトラブルシューティング情報については、「[Amazon EKS クラスターとノードに関する問題をトラブルシューティングする](troubleshooting.md)」および * AWS re:Post* の「[Amazon EKS のナレッジセンタータグ](https://repost.aws/tags/knowledge-center/TA4IvCeWI1TE66q4jEj4Z9zg/amazon-elastic-kubernetes-service)」を参照してください。問題を解決できない場合は、AWS サポートにお問い合わせください。

 **`nodeadm debug` を使用したノードのトラブルシューティング** ハイブリッドノードから `nodeadm debug` コマンドを実行して、ネットワークと認証情報の要件が満たされていることを検証できます。`nodeadm debug` コマンドの詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

 **クラスターインサイトを使用してハイブリッドノードの問題を検出する** Amazon EKS クラスターインサイトには、クラスター内の EKS Hybrid Nodes の設定に関する一般的な問題を検出する*インサイトチェック*が含まれます。すべてのインサイトチェックの結果は AWS マネジメントコンソール、AWS CLI、および AWS SDK から表示できます。クラスターインサイトの詳細については、「[Kubernetes バージョンアップグレードの準備およびクラスターインサイトでの設定ミスのトラブルシューティング](cluster-insights.md)」を参照してください。

## ハイブリッドノードのインストールに関するトラブルシューティング
<a name="hybrid-nodes-troubleshooting-install"></a>

以下のトラブルシューティングのトピックは、`nodeadm install` コマンドを使用してホストにハイブリッドノードの依存関係をインストールすることに関連しています。

 ** `nodeadm` コマンドが `must run as root` に失敗した** 

`nodeadm install` コマンドは、ホストに対して root または `sudo` 権限を持つユーザーに実行させる必要があります。root または `sudo` 権限を持たないユーザーに `nodeadm install` を実行させると、`nodeadm` 出力に次のエラーが表示されます。

```
"msg":"Command failed","error":"must run as root"
```

 **依存関係に接続できない** 

`nodeadm install` コマンドは、ハイブリッドノードに必要な依存関係をインストールします。ハイブリッドノードの依存関係には、`containerd`、`kubelet`、`kubectl`、および AWS SSM または AWS IAM Roles Anywhere コンポーネントがあります。これらの依存関係をダウンロードするには、`nodeadm install` を実行している場所からアクセスする必要があります。アクセスする必要があるロケーションのリストの詳細については、「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。アクセス権限がない場合は、次のようなエラーが `nodeadm install` 出力に表示されます。

```
"msg":"Command failed","error":"failed reading file from url: ...: max retries achieved for http request"
```

 **パッケージマネージャーの更新に失敗しました** 

`nodeadm install` コマンドは、ハイブリッドノードの依存関係をインストールする前に、`apt update`、`yum update`、`dnf update` のいずれかを実行します。このステップが失敗すると、次のようなエラーが表示される可能性があります。これを修正するには、`apt update`、`yum update`、`dnf update` のいずれかを実行してから `nodeadm install` を実行するか、`nodeadm install` を再実行します。

```
failed to run update using package manager
```

 **タイムアウトまたはコンテキストの期限を超過しました** 

`nodeadm install` を実行するときに、インストールプロセスのさまざまな段階でタイムアウトまたはコンテキストの期限を超過したことを示すエラーの問題が発生した場合、接続が遅くなり、タイムアウトが完了する前にハイブリッドノードの依存関係がインストールされない可能性があります。これらの問題を回避するには、`nodeadm` の `--timeout` フラグを使用して、依存関係のダウンロードのタイムアウト期間を延長できます。

```
nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER --timeout 20m0s
```

## ハイブリッドノードの接続のトラブルシューティング
<a name="hybrid-nodes-troubleshooting-connect"></a>

このセクションのトラブルシューティングトピックは、`nodeadm init` コマンドを使用してハイブリッドノードを EKS クラスターに接続するプロセスに関連しています。

 **オペレーションエラーまたはサポートされていないスキーム** 

`nodeadm init` を実行するときに、`operation error` または `unsupported scheme` に関連するエラーが表示された場合は、`nodeConfig.yaml` が正しくフォーマットされ、`nodeadm` に渡されているか確認します。`nodeConfig.yaml` のフォーマットのオプションの詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

```
"msg":"Command failed","error":"operation error ec2imds: GetRegion, request canceled, context deadline exceeded"
```

 **ハイブリッドノード IAM ロールに `eks:DescribeCluster` アクションのアクセス許可がありません** 

`nodeadm init` を実行すると、`nodeadm` は EKS `DescribeCluster` アクションを呼び出して EKS クラスターに関する情報の収集を試みます。ハイブリッドノード IAM ロールに `eks:DescribeCluster` アクションのアクセス許可がない場合は、`nodeadm init` init の実行時に `nodeadm` に渡すノード設定で、Kubernetes API エンドポイント、クラスター CA バンドル、およびサービス IPv4 CIDR を渡す必要があります。ハイブリッドノード IAM ロールに必須のアクセス許可の詳細については、「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。

```
"msg":"Command failed","error":"operation error EKS: DescribeCluster, https response error StatusCode: 403 ... AccessDeniedException"
```

 **ハイブリッドノード IAM ロールに `eks:ListAccessEntries` アクションのアクセス許可がありません** 

`nodeadm init` を実行すると、`nodeadm` は EKS `ListAccessEntries`アクションを呼び出して、ハイブリッドノード IAM ロールに関連付けられた `HYBRID_LINUX` タイプのアクセスエントリが EKS クラスターにあるかどうかを検証しようとします。ハイブリッドノード IAM ロールに `eks:ListAccessEntries` アクションのアクセス許可がない場合は、`nodeadm init` コマンドの実行時に `--skip cluster-access-validation` フラグを渡す必要があります。ハイブリッドノード IAM ロールに必須のアクセス許可の詳細については、「[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md)」を参照してください。

```
"msg":"Command failed","error":"operation error EKS: ListAccessEntries, https response error StatusCode: 403 ... AccessDeniedException"
```

 **リモートノードネットワークの CIDR にないノード IP** 

`nodeadm init` を実行するときに、指定されたリモートノードネットワークの CIDR の中にノードの IP アドレスがない場合、エラーが発生することがあります。エラーは次の例のような見た目になります。

```
node IP 10.18.0.1 is not in any of the remote network CIDR blocks [10.0.0.0/16 192.168.0.0/16]
```

こちらの例では、IP 10.18.0.1 のノードが、リモートネットワークの CIDR 10.0.0.0/16 と 192.168.0.0/16 でクラスターを結合しようとしています。10.18.0.1 がいずれの範囲にもないため、エラーが発生しています。

`RemoteNodeNetworks` が正しく設定され、すべてのノード IP アドレスが含まれていることを確認します。ネットワーク設定の詳細については、「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。
+ お使いのクラスターが配置されているリージョンで次のコマンドを実行し、`RemoteNodeNetwork` 設定をチェックします。出力に表示された CIDR ブロックに、ご自身のノードの IP 範囲が含まれ、エラーメッセージに表示された CIDR ブロックと同一であることを確認します。同じでない場合は、クラスター名と `nodeConfig.yaml` のリージョンが、対象となるクラスターと一致していることを確認します。

```
aws eks describe-cluster --name CLUSTER_NAME --region REGION_NAME --query cluster.remoteNetworkConfig.remoteNodeNetworks
```
+ 対象のノードで作業していることを確認します。
  + ホスト名と IP アドレスが、クラスターに登録しようとしているものと一致することを確認して、正しいノードで作業していることを確認します。
  + このノードが正しいオンプレミスネットワーク (クラスターのセットアップ中に CIDR 範囲が `RemoteNodeNetwork` として登録されたネットワーク) にあることを確認します。

それでもやはりノード IP が想定されるものと異なる場合は、以下を確認します。
+ IAM Roles Anywhere を使用している場合、`kubelet` が DNS ルックアップを IAM Roles Anywhere で実行し、`nodeName` がノード名 (使用できる場合) に関連付けられた IP を使用している。ノードの DNS エントリを維持している場合、これらのエントリがリモートノードネットワークの CIDR 内の IP を指していることを確認する。
+ ノードに複数のネットワークインターフェイスがある場合、`kubelet` は、リモートノードネットワークの CIDR の、範囲外の IP アドレスを持つインターフェイスをデフォルトとして選択することがあります。別のインターフェイスを使用するには、ご自身の `nodeConfig.yaml` の `--node-ip` `kubelet` フラグを使用して、その IP アドレスを指定します。詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。ノードで次のコマンドを実行すると、ノードのネットワークインターフェイスとその IP アドレスを確認できます。

```
ip addr show
```

 **ハイブリッドノードが EKS クラスターに表示されない** 

`nodeadm init` を実行して完了しても、ハイブリッドノードがクラスターに表示されない場合、ハイブリッドノードと EKS コントロールプレーン間のネットワーク接続に問題があるか、必要なセキュリティグループのアクセス許可が設定されていないか、Kubernetes ロールベースアクセスコントロール (RBAC) へのハイブリッドノード IAM ロールの必要なマッピングがない可能性があります。次のコマンドを使用して `kubelet` と `kubelet` ログのステータスを確認することで、デバッグプロセスを開始できます。クラスターに参加できなかったハイブリッドノードから次のコマンドを実行します。

```
systemctl status kubelet
```

```
journalctl -u kubelet -f
```

 **クラスターと通信できません** 

ハイブリッドノードがクラスターコントロールプレーンと通信できなかった場合は、次のようなログが表示されることがあります。

```
"Failed to ensure lease exists, will retry" err="Get ..."
```

```
"Unable to register node with API server" err="Post ..."
```

```
Failed to contact API server when waiting for CSINode publishing ... dial tcp <ip address>: i/o timeout
```

これらのメッセージが表示された場合は、以下をチェックして、[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md) で説明されているハイブリッドノード要件を満たしていることを確認します。
+ EKS クラスターに渡される VPC に、オンプレミスノードとオプションでポッド CIDR の Transit Gateway (TGW) または仮想プライベートゲートウェイ (VGW) へのルートがあることを確認します。
+ EKS クラスターに追加のセキュリティグループがあり、オンプレミスノード CIDR とオプションでポッド CIDR のインバウンドルールがあることを確認します。
+ EKS コントロールプレーンとの間のトラフィックを許可するようにオンプレミスルーターが設定されていることを確認します。

 **Unauthorized** 

ハイブリッドノードが EKS コントロールプレーンと通信できたが、登録できなかった場合、次のようなログが表示されることがあります。以下のログメッセージの主な違いは `Unauthorized` エラーであることに注意してください。これは、必要なアクセス許可がないため、ノードがタスクを実行できなかったことを示します。

```
"Failed to ensure lease exists, will retry" err="Unauthorized"
```

```
"Unable to register node with API server" err="Unauthorized"
```

```
Failed to contact API server when waiting for CSINode publishing: Unauthorized
```

これらのメッセージが表示された場合は、以下をチェックして、[ハイブリッドノードの認証情報を準備する](hybrid-nodes-creds.md) および [ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md) のハイブリッドノードの要件の詳細を満たしていることを確認します。
+ ハイブリッドノードのアイデンティティが、想定のハイブリッドノードの IAM ロールと一致することを確認します。これを行うには、ハイブリッドノードから `sudo aws sts get-caller-identity` を実行します。
+ ハイブリッドノード IAM ロールに必要なアクセス許可があることを確認します。
+ クラスターにハイブリッドノード IAM ロールの EKS アクセスエントリがあることを確認するか、`aws-auth` ConfigMap にハイブリッドノード IAM ロールのエントリがあることを確認します。EKS アクセスエントリを使用している場合は、ハイブリッドノード IAM ロールのアクセスエントリが `HYBRID_LINUX` アクセスタイプであることを確認します。`aws-auth` ConfigMap を使用している場合は、ハイブリッドノード IAM ロールのエントリが、「[ハイブリッドノードのクラスターアクセスを準備する](hybrid-nodes-cluster-prep.md)」で説明されている要件と形式を満たしていることを確認します。

### ハイブリッドノードが EKS クラスターに登録されているのにステータス `Not Ready` が表示される
<a name="hybrid-nodes-troubleshooting-not-ready"></a>

ハイブリッドノードが EKS クラスターに正常に登録されたが、ハイブリッドノードのステータスが `Not Ready` である場合、最初に確認すべきことは、コンテナネットワークインターフェイス (CNI) のステータスです。CNI をインストールしていない場合は、ハイブリッドノードのステータスが `Not Ready` であることが予想されます。CNI が正常にインストールされ実行されると、ノードのステータスは `Ready` に移行します。CNI をインストールしようとしたが、正常に実行されていない場合は、このページの「[ハイブリッドノード CNI のトラブルシューティング](#hybrid-nodes-troubleshooting-cni)」を参照してください。

 **証明書署名リクエスト (CSR) が保留中のままである** 

ハイブリッドノードを EKS クラスターに接続した後、ハイブリッドノードの保留中の CSR がある場合、ハイブリッドノードは自動承認の要件を満たしていません。ハイブリッドノードの CSR は、ハイブリッドノードの CSR が `eks.amazonaws.com/compute-type: hybrid` ラベル付きノードによって作成され、CSR に次のサブジェクト代替名 (SAN) がある場合、自動的に承認および発行されます: 少なくとも 1 つの DNS SAN はノード名と等しく、IP SAN はリモートノードネットワークの CIDR に属するものです。

 **ハイブリッドプロファイルは既に存在します** 

`nodeadm` 設定を変更し、ノードを新しい設定に再登録しようとすると、ハイブリッドプロファイルが既に存在するが、その内容が変更されたことを示すエラーが表示されることがあります。設定変更の合間に `nodeadm init` を実行する代わりに、`nodeadm uninstall` を実行し、その後に `nodeadm install` と `nodeadm init` を実行します。これにより、設定の変更に伴う適切なクリーンアップが保証されます。

```
"msg":"Command failed","error":"hybrid profile already exists at /etc/aws/hybrid/config but its contents do not align with the expected configuration"
```

 **ハイブリッドノードがプライベート API の解決に失敗しました** 

`nodeadm init` 実行後、`no such host` が存在するために EKS Kubernetes API サーバーへの接続に失敗したことを示すエラーが `kubelet` ログに表示された場合は、オンプレミスネットワークまたはホストレベルで EKS Kubernetes API エンドポイントの DNS エントリを変更する必要がある場合があります。「* AWS Route53 documentation*」の「[Forwarding inbound DNS queries to your VPC](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-forwarding-inbound-queries.html)」を参照してください。

```
Failed to contact API server when waiting for CSINode publishing: Get ... no such host
```

 **EKS コンソールでハイブリッドノードを表示できない** 

ハイブリッドノードが登録されているのに、EKS コンソールで表示できない場合は、コンソールの表示に使用している IAM プリンシパルのアクセス許可を確認してください。使用している IAM プリンシパルには、コンソールでリソースを表示するための特定の最小の IAM および Kubernetes アクセス許可が必要です。詳細については、「[AWS マネジメントコンソール に Kubernetes リソースを表示する](view-kubernetes-resources.md)」を参照してください。

## ハイブリッドノードのトラブルシューティングの実行
<a name="_running_hybrid_nodes_troubleshooting"></a>

EKS クラスターに登録されたハイブリッドノードのステータスが `Ready` で、その後ステータスが `Not Ready` に移行した場合、ノードに CPU、メモリ、使用可能なディスク容量の十分なリソースがない、ノードが EKS コントロールプレーンから切断されているなど、さまざまな問題が異常なステータスの原因となった可能性があります。以下のステップを使用してノードのトラブルシューティングを行うことができます。問題を解決できない場合は、AWS サポートにお問い合わせください。

ハイブリッドノードから `nodeadm debug` を実行して、ネットワークと認証情報の要件が満たされていることを確認します。`nodeadm debug` コマンドの詳細については、「[ハイブリッドノード `nodeadm` 参照](hybrid-nodes-nodeadm.md)」を参照してください。

 **ノードのステータスを取得する** 

```
kubectl get nodes -o wide
```

 **ノードの条件とイベントを確認する** 

```
kubectl describe node NODE_NAME
```

 **ポッドのステータスを取得する** 

```
kubectl get pods -A -o wide
```

 **ポッドの条件とイベントを確認する** 

```
kubectl describe pod POD_NAME
```

 **ポッドログを確認する** 

```
kubectl logs POD_NAME
```

 **`kubectl` ログを確認する** 

```
systemctl status kubelet
```

```
journalctl -u kubelet -f
```

 **ポッドのライブネスプローブが失敗しているか、ウェブフックが機能していない** 

ハイブリッドノードで動作しているアプリケーション、アドオン、またはウェブフックが正しく起動しない場合、ポッドへの通信をブロックするネットワークの問題が発生する可能性があります。EKS コントロールプレーンがハイブリッドノードで動作しているウェブフックに接続するには、リモートポッドネットワークで EKS クラスターを設定し、VPC ルーティングテーブルにオンプレミスポッド CIDR のルートを設定し、ターゲットを Transit Gateway (TGW)、仮想プライベートゲートウェイ (VPW)、または VPC をオンプレミスネットワークに接続するために使用するその他のゲートウェイとして設定する必要があります。ハイブリッドノードのネットワーク要件の詳細については、「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。さらに、オンプレミスのファイアウォールでこのトラフィックを許可し、ルーターがポッドに適切にルーティングできることを確認する必要があります。ハイブリッドノードでウェブフックを実行するための要件の詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」を参照してください。

このシナリオの一般的なポッドログメッセージを以下に示します。ここでは、ip-address は Kubernetes サービスのクラスター IP です。

```
dial tcp <ip-address>:443: connect: no route to host
```

 **`kubectl logs` または `kubectl exec` コマンドが機能していない (`kubelet` API コマンド)** 

他の `kubectl` コマンドは正常に実行されているのに、`kubectl attach`、`kubectl cp`、`kubectl exec`、`kubectl logs`、`kubectl port-forward` コマンドがタイムアウトした場合は、リモートネットワークの設定に問題がある可能性があります。これらのコマンドはクラスターを介してノードの `kubelet` エンドポイントに接続しています。詳細については、「[`kubelet` エンドポイント](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-kubelet-api)」を参照してください。

ノード IP とポッド IP が、ご自身のクラスター向けに設定したリモートノードネットワークおよびリモートポッドネットワーク CIDR の範囲に含まれていることを確認します。以下のコマンドを使用して IP の割り当てを調べます。

```
kubectl get nodes -o wide
```

```
kubectl get pods -A -o wide
```

これらの IP を、設定したリモートネットワークの CIDR と比較して、適切にルーティングされていることを確認します。ネットワークの設定要件については、「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。

## ハイブリッドノード CNI のトラブルシューティング
<a name="hybrid-nodes-troubleshooting-cni"></a>

ハイブリッドノードで最初に Cilium または Calico を起動する際に問題が発生した場合は、多くの場合、ハイブリッドノードまたはハイブリッドノードで稼働する CNI ポッドと EKS コントロールプレーン間のネットワークの問題が原因です。環境が「ハイブリッドノードのネットワークを準備する」の要件を満たしていることを確認します。問題を分割すると分かりやすくなります。

EKS クラスター設定  
RemoteNodeNetwork と RemotePodNetwork の設定は正しいですか?

VPC の設定  
VPC ルーティングテーブルに、Transit Gateway または Virtual Private Gateway のターゲットを持つ RemoteNodeNetwork と RemotePodNetwork のルートはありますか?

セキュリティグループの構成  
RemoteNodeNetwork および RemotePodNetwork のインバウンドルールとアウトバウンドルールはありますか?

オンプレミスのネットワーク  
EKS コントロールプレーンとハイブリッドノード、およびハイブリッドノードで実行されているポッドとの間のルートとアクセスはありますか?

CNI の設定  
オーバーレイネットワークを使用している場合、CNI の IP プール設定は、ウェブフックを使用している場合に EKS クラスター用に設定された RemotePodNetwork と一致していますか?

 **CNI がインストールされていないハイブリッドノードのステータス `Ready`** 

ハイブリッドノードのステータスが `Ready` と表示されているが、クラスターに CNI をインストールしていない場合は、ハイブリッドノードに古い CNI アーティファクトが存在する可能性があります。デフォルトでは、Helm などのツールを使用して Cilium と Calico をアンインストールしても、ディスク上のリソースは物理マシンや仮想マシンからは削除されません。さらに、これらの CNI のカスタムリソース定義 (CRD) は、古いインストールからクラスターにまだ存在する場合があります。詳細については、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の「Cilium と Calico の削除」セクションを参照してください。

 **Cilium のトラブルシューティング** 

ハイブリッドノードで Cilium の実行に問題がある場合は、Cilium ドキュメントの「[トラブルシューティング手順](https://docs.cilium.io/en/stable/operations/troubleshooting/)」を参照してください。以下のセクションでは、ハイブリッドノードへの Cilium のデプロイに固有の問題について説明します。

 **Cilium が起動しない** 

各ハイブリッドノードで実行されている Cilium エージェントが開始されていない場合は、Cilium エージェントポッドのログにエラーがないか確認します。Cilium エージェントを起動するには、EKS Kubernetes API エンドポイントへの接続が必要です。この接続が正しく設定されていない場合、Cilium エージェントの起動は失敗します。この場合、Cilium エージェントポッドログに次のようなログメッセージが表示されます。

```
msg="Unable to contact k8s api-server"
level=fatal msg="failed to start: Get \"https://<k8s-cluster-ip>:443/api/v1/namespaces/kube-system\": dial tcp <k8s-cluster-ip>:443: i/o timeout"
```

Cilium エージェントはホストネットワークで実行されます。EKS クラスターは、Cilium 接続用に `RemoteNodeNetwork` で設定する必要があります。EKS クラスターに `RemoteNodeNetwork` のインバウンドルールを持つ追加のセキュリティグループがあり、VPC に`RemoteNodeNetwork` のルートがあり、EKS コントロールプレーンへの接続を許可するようにオンプレミスネットワークが正しく設定されていることを確認します。

Cilium オペレータが実行されていて、一部の Cilium エージェントが動作しているが、すべてが動作していない場合は、クラスター内のすべてのノードに割り当てるポッド IP があることを確認します。Cilium 設定で `clusterPoolIPv4PodCIDRList` でクラスタープール IPAM を使用するときに、割り当て可能なポッド CIDR のサイズを設定します。ノードごとの CIDR サイズは、Cilium 設定の `clusterPoolIPv4MaskSize` 設定で設定されます。詳細については、Cilium ドキュメントの「[Expanding the cluster pool](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/#expanding-the-cluster-pool)」を参照してください。

 **Cilium BGP が機能しない** 

Cilium BGP コントロールプレーンを使用して、ポッドまたはサービスアドレスをオンプレミスネットワークにアドバタイズする場合は、次の Cilium CLI コマンドを使用して、BGP がリソースへのルートをアドバタイズしているかどうかを確認できます。Cilium CLI をインストールする手順については、Cilium ドキュメントの「[Cilium CLI のインストール](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli)」を参照してください。

BGP が正しく動作している場合は、ハイブリッドノードの出力に Session State `established` が含まれている必要があります。場合によっては、ネットワークチームと協力して、環境のローカル AS、ピア AS、ピアアドレスの正しい値を特定する必要があります。

```
cilium bgp peers
```

```
cilium bgp routes
```

Cilium BGP を使用してタイプ `LoadBalancer` のサービスの IP をアドバタイズする場合は、`CiliumLoadBalancerIPPool` と Service の両方に同じラベルが必要です。ラベルは、`CiliumBGPAdvertisement` のセレクタで使用する必要があります。次に例を示します。Cilium BGP を使用して LoadBalancer タイプのサービスの IP をアドバタイズしている場合、Cilium エージェントの再起動中に BGP ルートが中断される可能性があります。詳細については、「Cilium documentation」の「[Failure Scenarios](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane-operation/#failure-scenarios)」を参照してください。

 **サービス** 

```
kind: Service
apiVersion: v1
metadata:
  name: guestbook
  labels:
    app: guestbook
spec:
  ports:
  - port: 3000
    targetPort: http-server
  selector:
    app: guestbook
  type: LoadBalancer
```

 **CiliumLoadBalancerIPPool** 

```
apiVersion: cilium.io/v2alpha1
kind: CiliumLoadBalancerIPPool
metadata:
  name: guestbook-pool
  labels:
    app: guestbook
spec:
  blocks:
  - cidr: <CIDR to advertise>
  serviceSelector:
    matchExpressions:
      - { key: app, operator: In, values: [ guestbook ] }
```

 **CiliumBGPAdvertisement** 

```
apiVersion: cilium.io/v2alpha1
kind: CiliumBGPAdvertisement
metadata:
  name: bgp-advertisements-guestbook
  labels:
    advertise: bgp
spec:
  advertisements:
    - advertisementType: "Service"
      service:
        addresses:
          - ExternalIP
          - LoadBalancerIP
      selector:
        matchExpressions:
          - { key: app, operator: In, values: [ guestbook ] }
```

 **Calico のトラブルシューティング** 

ハイブリッドノードで Calico の実行に問題がある場合は、Calico ドキュメントの「[トラブルシューティング手順](https://docs.tigera.io/calico/latest/operations/troubleshoot/)」を参照してください。以下のセクションでは、Calico をハイブリッドノードにデプロイする際に特有の問題について説明します。

次の表は、Calico コンポーネントと、それらがデフォルトでノードネットワークまたはポッドネットワークで実行されているかどうかをまとめたものです。ポッドの送信トラフィックに NAT を使用するように Calico を設定した場合、オンプレミスネットワークはオンプレミスノード CIDR にトラフィックをルーティングするように設定する必要があり、VPC ルーティングテーブルはトランジットゲートウェイ (TGW) または仮想プライベートゲートウェイ (VGW) をターゲットとするオンプレミスノード CIDR のルートで設定する必要があります。ポッドの送信トラフィックに NAT を使用するように Calico を設定していない場合は、オンプレミスネットワークがオンプレミスポッド CIDR にトラフィックをルーティングするように設定し、VPC ルーティングテーブルをトランジットゲートウェイ (TGW) または仮想プライベートゲートウェイ (VGW) をターゲットとするオンプレミスポッド CIDR のルートで設定する必要があります。


| コンポーネント | Network | 
| --- | --- | 
|  Calico API サーバー  |  ノード  | 
|  Kubernetes 用の Calico コントローラー  |  ポッド  | 
|  Calico ノードエージェント  |  ノード  | 
|  Calico `typha`   |  ノード  | 
|  Calico CSI ノードドライバー  |  ポッド  | 
|  Calico 演算子  |  ノード  | 

 **Calico リソースは、遮断されたノードでスケジュールまたは実行されています** 

DaemonSet として実行されない Calico リソースには、デフォルトで柔軟な許容範囲があり、ポッドのスケジュールや実行の準備が整っていない遮断されたノードでスケジュールできます。以下を含めるようにオペレータのインストールを変更することで、DaemonSet Calico 以外のリソースの許容範囲を厳しくすることができます。

```
installation:
  ...
  controlPlaneTolerations:
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  calicoKubeControllersDeployment:
    spec:
      template:
        spec:
          tolerations:
          - effect: NoExecute
            key: node.kubernetes.io/unreachable
            operator: Exists
            tolerationSeconds: 300
          - effect: NoExecute
            key: node.kubernetes.io/not-ready
            operator: Exists
            tolerationSeconds: 300
  typhaDeployment:
    spec:
      template:
        spec:
          tolerations:
          - effect: NoExecute
            key: node.kubernetes.io/unreachable
            operator: Exists
            tolerationSeconds: 300
          - effect: NoExecute
            key: node.kubernetes.io/not-ready
            operator: Exists
            tolerationSeconds: 300
```

## 認証情報のトラブルシューティング
<a name="hybrid-nodes-troubleshooting-creds"></a>

AWS SSM ハイブリッドアクティベーションと AWS IAM Roles Anywhere の両方で、ハイブリッドノードから次のコマンドを実行して、ハイブリッドノード IAM ロールの認証情報がハイブリッドノードで正しく設定されていることを検証できます。ノード名とハイブリッドノード IAM ロール名が想定どおりであることを確認します。

```
sudo aws sts get-caller-identity
```

```
{
    "UserId": "ABCDEFGHIJKLM12345678910:<node-name>",
    "Account": "<aws-account-id>",
    "Arn": "arn:aws:sts::<aws-account-id>:assumed-role/<hybrid-nodes-iam-role/<node-name>"
}
```

 ** AWSSystems Manager (SSM) のトラブルシューティング** 

ハイブリッドノードの認証情報に AWS SSM ハイブリッドアクティベーションを使用している場合は、`nodeadm` によってハイブリッドノードにインストールされている次の SSM ディレクトリとアーティファクトに注意してください。SSM エージェントの詳細については、「*AWS Systems Manager ユーザーガイド*」の「[SSM Agent の使用](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html)」を参照してください。


| 説明 | 場所 | 
| --- | --- | 
|  SSM エージェント  |  Ubuntu - `/snap/amazon-ssm-agent/current/amazon-ssm-agent` RHEL & AL2023 - `/usr/bin/amazon-ssm-agent`   | 
|  SSM エージェントログ  |   `/var/log/amazon/ssm`   | 
|   AWS 認証情報  |   `/root/.aws/credentials`   | 
|  SSM Setup CLI  |   `/opt/ssm/ssm-setup-cli`   | 

 **SSM エージェントを再起動する** 

SSM エージェントを再起動することで解決できる問題もあります。以下のコマンドを使用して再起動できます。

 **AL2023 およびその他のオペレーティングシステム** 

```
systemctl restart amazon-ssm-agent
```

 **Ubuntu** - 

```
systemctl restart snap.amazon-ssm-agent.amazon-ssm-agent
```

 **SSM エンドポイントへの接続を確認する** 

ハイブリッドノードから SSM エンドポイントに接続できることを確認します。SSM エンドポイントのリストについては、「[AWS Systems Manager endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/ssm.html)」を参照してください。以下のコマンドの `us-west-2` を、AWS SSM ハイブリッドアクティベーションの AWS リージョンに置き換えます。

```
ping ssm.us-west-2.amazonaws.com
```

 **登録された SSM インスタンスの接続ステータスを表示する** 

次の AWS CLI コマンドを使用して、SSM ハイブリッドアクティベーションに登録されているインスタンスの接続ステータスを確認できます。マシン ID をインスタンスのマシン ID に置き換えます。

```
aws ssm get-connection-status --target mi-012345678abcdefgh
```

 **SSM セットアップ CLI チェックサムの不一致** 

`nodeadm install` の実行時に、`ssm-setup-cli` チェックサムの不一致に問題がある場合は、ホストに古い既存の SSM インストールがないことを確認する必要があります。ホストに古い SSM インストールがある場合は、それらを削除して `nodeadm install` を再実行し、問題を解決します。

```
Failed to perform agent-installation/on-prem registration: error while verifying installed ssm-setup-cli checksum: checksum mismatch with latest ssm-setup-cli.
```

 **SSM `InvalidActivation`** 

インスタンスを AWS SSM に登録する際にエラーが表示された場合は、`nodeConfig.yaml` の `region`、`activationCode`、および `activationId` が正しいことを確認します。EKS クラスターの AWS リージョンは、SSM ハイブリッドアクティベーションのリージョンと一致する必要があります。これらの値が誤って設定されている場合は、次のようなエラーが表示されることがあります。

```
ERROR Registration failed due to error registering the instance with AWS SSM. InvalidActivation
```

 **SSM `ExpiredTokenException`: リクエストに含まれているセキュリティトークンが有効期限切れです** 

SSM エージェントが認証情報を更新できない場合は、「`ExpiredTokenException`」が表示されることがあります。このシナリオでは、ハイブリッドノードから SSM エンドポイントに接続できる場合、認証情報の更新を強制するために SSM エージェントを再起動する必要がある場合があります。

```
"msg":"Command failed","error":"operation error SSM: DescribeInstanceInformation, https response error StatusCode: 400, RequestID: eee03a9e-f7cc-470a-9647-73d47e4cf0be, api error ExpiredTokenException: The security token included in the request is expired"
```

 **register machine コマンドの実行中の SSM エラー** 

マシンを SSM に登録する際にエラーが発生した場合は、`nodeadm install` を再実行して、すべての SSM 依存関係が正しくインストールされていることを確認する必要があります。

```
"error":"running register machine command: , error: fork/exec /opt/aws/ssm-setup-cli: no such file or directory"
```

 **SSM `ActivationExpired`** 

`nodeadm init` の実行時に、アクティベーションの有効期限が切れたために SSM へのインスタンスの登録がエラーになった場合は、新しい SSM ハイブリッドアクティベーションを作成し、新しい SSM ハイブリッドアクティベーションの `activationCode` と `activationId` で `nodeConfig.yaml` を更新して、`nodeadm init` を再実行する必要があります。

```
"msg":"Command failed","error":"SSM activation expired. Please use a valid activation"
```

```
ERROR Registration failed due to error registering the instance with AWS SSM. ActivationExpired
```

 **SSM がキャッシュされた認証情報を更新できませんでした** 

キャッシュされた認証情報の更新に失敗した場合、`/root/.aws/credentials` ファイルはホストで削除されている可能性があります。まず、SSM ハイブリッドアクティベーションをチェックして、アクティブであること、およびアクティベーションを使用するようにハイブリッドノードが正しく設定されていることを確認します。`/var/log/amazon/ssm` で SSM エージェントログを確認し、SSM 側で問題を解決したら `nodeadm init` コマンドを再実行します。

```
"Command failed","error":"operation error SSM: DescribeInstanceInformation, get identity: get credentials: failed to refresh cached credentials"
```

 **SSM のクリーンアップ** 

ホストから SSM エージェントを削除するには、次のコマンドを実行します。

```
dnf remove -y amazon-ssm-agent
sudo apt remove --purge amazon-ssm-agent
snap remove amazon-ssm-agent
rm -rf /var/lib/amazon/ssm/Vault/Store/RegistrationKey
```

 ** AWSIAM Roles Anywhere のトラブルシューティング** 

ハイブリッドノードの認証情報に AWS IAM Roles Anywhere を使用している場合は、`nodeadm` によってハイブリッドノードにインストールされている次のディレクトリとアーティファクトに注意してください。IAM Roles Anywhere のトラブルシューティングの詳細については、「*AWS IAM Roles Anywhere User Guide*」の「[Troubleshooting AWS IAM Roles Anywhere identity and access](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/security_iam_troubleshoot.html)」を参照してください。


| 説明 | 場所 | 
| --- | --- | 
|  IAM Roles Anywhere CLI  |   `/usr/local/bin/aws_signing_helper`   | 
|  デフォルトの証明書の場所と名前  |   `/etc/iam/pki/server.pem`   | 
|  デフォルトのキーの場所と名前  |   `/etc/iam/pki/server.key`   | 

 **IAM Roles Anywhere がキャッシュされた認証情報の更新に失敗しました** 

キャッシュされた認証情報の更新に失敗した場合は、`/etc/aws/hybrid/config` の内容を確認し、`nodeadm` 設定で IAM Roles Anywhere が正しく設定されていることを確認します。`/etc/iam/pki` が存在することを確認します。各ノードには一意の証明書とキーが必要です。デフォルトでは、認証情報プロバイダーとして IAM Roles Anywhere を使用する場合、`nodeadm` は証明書の場所と名前に `/etc/iam/pki/server.pem` を使用し、プライベートキーに `/etc/iam/pki/server.key` を使用します。`sudo mkdir -p /etc/iam/pki` を使用してディレクトリに証明書とキーを配置する前に、ディレクトリの作成が必要になる場合があります。証明書の内容は、以下のコマンドで確認できます。

```
openssl x509 -text -noout -in server.pem
```

```
open /etc/iam/pki/server.pem: no such file or directory
could not parse PEM data
Command failed {"error": "... get identity: get credentials: failed to refresh cached credentials, process provider error: error in credential_process: exit status 1"}
```

 ** の実行が許可されていない IAM Roles Anywhere`sts:AssumeRole`** 

`kubelet` ログで、IAM Roles Anywhere の使用時に `sts:AssumeRole` オペレーションに対するアクセス拒否の問題が表示された場合は、ハイブリッドノード IAM ロールの信頼ポリシーをチェックして、IAM Roles Anywhere サービスプリンシパルがハイブリッドノード IAM ロールを引き受けることができることを確認します。さらに、ハイブリッドノード IAM ロールの信頼ポリシーでトラストアンカー ARN が正しく設定されていること、およびハイブリッドノード IAM ロールが IAM Roles Anywhere プロファイルに追加されていることを確認します。

```
could not get token: AccessDenied: User: ... is not authorized to perform: sts:AssumeRole on resource: ...
```

 ** を設定することが許可されていない IAM Roles Anywhere`roleSessionName`** 

`kubelet` ログで、`roleSessionName` の設定にアクセス拒否の問題が発生した場合は、IAM Roles Anywhere プロファイルで `acceptRoleSessionName` を true に設定していることを確認します。

```
AccessDeniedException: Not authorized to set roleSessionName
```

## オペレーティングシステムのトラブルシューティング
<a name="hybrid-nodes-troubleshooting-os"></a>

### RHEL
<a name="_rhel"></a>

 **使用権限管理者またはサブスクリプションマネージャーの登録失敗** 

`nodeadm install` を実行中で、使用権限登録の問題によりハイブリッドノードの依存関係のインストールに失敗した場合、ホストに Red Hat ユーザー名とパスワードを適切に設定していることを確認してください。

```
This system is not registered with an entitlement server
```

### Ubuntu
<a name="_ubuntu"></a>

 **GLIBC が見つかりません** 

オペレーティングシステムに Ubuntu を使用し、ハイブリッドノードを持つ認証情報プロバイダーに IAM Roles Anywhere を使用していて、GLIBC が見つからない問題がある場合は、その依存関係を手動でインストールすることで問題を解決できます。

```
GLIBC_2.32 not found (required by /usr/local/bin/aws_signing_helper)
```

次のコマンドを実行して依存関係をインストールします。

```
ldd --version
sudo apt update && apt install libc6
sudo apt install glibc-source
```

### Bottlerocket
<a name="_bottlerocket"></a>

Bottlerocket 管理コンテナを有効にしている場合、SSH を使用してこれにアクセスし、昇格された権限を使って高度なデバッグとトラブルシューティングを行うことができます。以下のセクションでは、Bottlerocket ホストのコンテキストで実行する必要があるコマンドを記載しています。管理コンテナにアクセスすると、`sheltie` を実行すれば Bottlerocket ホストで完全なルートシェルを取得することができます。

```
sheltie
```

以下のセクションにあるコマンドは、各コマンドの前に `sudo chroot /.bottlerocket/rootfs` を付けることで管理者コンテナシェルから実行することもできます。

```
sudo chroot /.bottlerocket/rootfs <command>
```

 **ログ収集に logdog を使用する** 

Bottlerocket には、トラブルシューティングを目的に、ログとシステム情報とを効率的に収集する `logdog` ユーティリティがあります。

```
logdog
```

`logdog` ユーティリティは、Bottlerocket ホストのさまざまな場所からログを収集し、それらを tarball と組み合わせます。デフォルトでは、tarball は `/var/log/support/bottlerocket-logs.tar.gz` で作成され、`/.bottlerocket/support/bottlerocket-logs.tar.gz` にあるホストコンテナからアクセスすることができます。

 **journalctl を使用したシステムログへのアクセス** 

次のコマンドを使用することで、`kubelet`、`containerd` などのさまざまなシステムサービスのステータスをチェックしたりログを表示したりできます。`-f` フラグは、ログをリアルタイムでフォローします。

`kubelet` サービスのステータスを確認し `kubelet` ログを取得するときは、以下を実行します。

```
systemctl status kubelet
journalctl -u kubelet -f
```

`containerd` サービスのステータスを確認し、オーケストレーションされた `containerd` インスタンスのログを取得するときは、以下を実行します。

```
systemctl status containerd
journalctl -u containerd -f
```

`host-containerd` サービスのステータスを確認し、ホスト `containerd` インスタンスのログを取得するときは、以下を実行します。

```
systemctl status host-containerd
journalctl -u host-containerd -f
```

ブートストラップコンテナとホストコンテナのログを取得するときは、以下を実行します。

```
journalctl _COMM=host-ctr -f
```