View a markdown version of this page

コントロールプレーンエグレスルーティングの設定 - Amazon EKS

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

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

コントロールプレーンエグレスルーティングの設定

デフォルトでは、Amazon EKS は Kubernetes コントロールプレーンから VPC 内のリソースへのエグレスネットワーキングを管理します。コントロールプレーンエグレスルーティングを使用して、この動作を変更し、ネットワークパスを自分で管理します。これにより、コントロールプレーンの Elastic Network Interface (ENI) からのトラフィックが VPC リソースに到達する方法を完全に制御できます。独自の NAT ゲートウェイ、ファイアウォール、または検査アプライアンスを介してルーティングできます。

kube-apiserver がカスタマー VPC サブネットのクロスアカウント ENI を介して NAT ゲートウェイなどのルートテーブルとエグレスデバイスにトラフィックを送信し、その後インターネットに出力してウェブフックと OIDC エンドポイントに到達することを示すアーキテクチャ図

エグレスルーティングモード

Amazon EKS は、次のコントロールプレーンエグレスルーティングモードをサポートしています。

モード 説明

AWS_MANAGED

デフォルトの動作。Amazon EKS は、コントロールプレーン ENI からのエグレスパスを管理します。コントロールプレーントラフィック用に NAT ゲートウェイやその他のルーティングインフラストラクチャを設定する必要はありません。

CUSTOMER_ROUTED

VPC サブネットのコントロールプレーンからのエグレスパスを管理します。ユーザーは、コントロールプレーンが必要なエンドポイント (ウェブフックサーバー、OIDC プロバイダー、その他のリソースなど) に到達できることを確認する責任があります。NAT ゲートウェイ、NAT インスタンス、トランジットゲートウェイ、ファイアウォールアプライアンスなどのエグレスパスを指定します。このトラフィックを許可するルートテーブル、ネットワーク ACL、およびセキュリティグループルールも設定します。

重要

CUSTOMER_ROUTED モードでは、ユーザーは、コントロールプレーンからの適切なネットワーク接続を確保する責任があります。VPC ネットワークの設定ミスにより、コントロールプレーンオペレーションが失敗する可能性があります。これらの設定ミスには、欠落したエグレスパス、制限的なネットワーク ACL、または誤ったセキュリティグループが含まれます。影響を受けるオペレーションには、アドミッションウェブフック呼び出しと OIDC 認証が含まれます。

前提条件

VPC とサブネットは、標準の Amazon EKS ネットワーキング要件を満たしている必要があります。詳細については、「VPC とサブネットの Amazon EKS ネットワーキング要件を表示する」を参照してください。

CUSTOMER_ROUTED モードでは、Kubernetes API サーバーは、クロスアカウントネットワークインターフェイスを介して顧客向けトラフィックをアウトバウンドに送信します。Amazon EKS は、コントロールプレーンからノードへの通信用にこれらのインターフェイスをサブネットに既に作成しています。このトラフィックには、アドミッションウェブフックと OIDC プロバイダーへの呼び出しが含まれます。Amazon EKS は、個別のエグレスネットワークインターフェイスを作成しません。このモードでは、既存のインターフェイスの使用方法が変更されます。これらのインターフェイスを保持するサブネットは、次の要件を満たしている必要があります。

  • サブネットには、コントロールプレーンが到達する必要があるエンドポイント (ウェブフックサーバーや OIDC プロバイダーなど) へのルートがある必要があります。VPC 外のエンドポイントでは、これは通常、エグレスデバイスへのデフォルトルートを意味します。デフォルトルートは、IPv4 では 0.0.0.0/0 で、IPv6 では ::/0 です。エグレスデバイスは、NAT ゲートウェイ、NAT インスタンス、ファイアウォール、または一元化された出力 VPC へのトランジットゲートウェイである場合があります。エグレスデバイスの選択はユーザーが行います。Amazon EKS では、パスが機能することのみが必要です。

  • クロスアカウントネットワークインターフェイス上のセキュリティグループは、ワークロードに必要なポート (ウェブフックや OIDC プロバイダーのポート 443 など) でのアウトバウンドトラフィックを許可する必要があります。

  • サブネット上のネットワーク ACL は、アウトバウンドトラフィックと、リターントラフィックに対応するインバウンドエフェメラルポート範囲を許可する必要があります。

CUSTOMER_ROUTED モードでは、コントロールプレーンは VPC の DNS 設定を使用してホスト名を解決します。これにより、コントロールプレーンは Route 53 プライベートホストゾーンと Route 53 Resolver エンドポイントを介して転送されるオンプレミス DNS のエンドポイントに到達できます。

  • VPC DHCP オプションセットでは、ドメインネームサーバーリストに AmazonProvidedDNS が含まれる必要があります。これは、コントロールプレーンが VPC 内の DNS 名を解決するために必要です。クラスターが外部ウェブフックエンドポイントまたはパブリック DNS 名を持つ OIDC プロバイダーを使用している場合、リゾルバーはパブリックホスト名も解決する必要があります。リゾルバーが VPC 解決とパブリック DNS 解決の両方を処理できることを確認します。

次の表は、コントロールプレーンが CUSTOMER_ROUTED モードで VPC 経由で送信するトラフィックをまとめたものです。

トラフィック 送信先 ポート 注意事項

アドミッションウェブフック

ウェブフックエンドポイント (顧客定義の URL)

443 (通常)

ウェブフックが設定されている場合のみ。エンドポイントが外部の場合、エグレスデバイスを介して VPC から離れます。

OIDC 検出

OIDC 発行者 URL

443

OIDC プロバイダーが設定されている場合のみ。発行者が外部の場合、エグレスデバイスを介して VPC から離れます。

集約 API サーバー

カスタマー API サーバーエンドポイント

443

設定されている場合にのみ。エンドポイントが外部の場合、エグレスデバイスを介して VPC から離れます。

Kubelet API

ワーカーノードの IP アドレス

10250

これはクラスター ENI を介したコントロールプレーンとノード間のトラフィックであり、エグレスデバイスを通過しません。これには、ルートテーブル、セキュリティグループ、ネットワーク ACL が、コントロールプレーンとノード間のクラスター ENI を介したトラフィックを許可する必要があります。

注記

このテーブルにリストされているトラフィックのみがエグレス設定の影響を受けます。EKS マネージドコントロールプレーントラフィック (etcd、CloudWatch Logs、および内部 EKS サービスとの通信など) は AWS マネージドネットワークパスを経由し、VPC 設定の影響を受けません。

顧客ルーティングエグレスでクラスターを作成する

新しいクラスターを作成するときに、コントロールプレーンのエグレスモードを指定できます。

AWS CLI

以下のコマンドを実行してください。プレースホルダーの値を、独自の値に置き換えます。

aws eks create-cluster \ --name my-cluster \ --role-arn arn:aws:iam::111122223333:role/myAmazonEKSClusterRole \ --resources-vpc-config "subnetIds=subnet-ExampleID1,subnet-ExampleID2,securityGroupIds=sg-ExampleID1,controlPlaneEgressMode=CUSTOMER_ROUTED" \ --kubernetes-network-config "ipFamily=ipv4" \ --region region-code

IPv6 クラスターには ipFamily=ipv6 を使用できます。CUSTOMER_ROUTED モードで IPv6 を使用する場合は、IPv4 トラフィック用の NAT ゲートウェイに加えて、IPv6 トラフィック用のエグレス専用インターネットゲートウェイがサブネットにあることを確認します。

AWS マネジメントコンソール
  1. Amazon EKS コンソール を開きます。

  2. [クラスターを追加][作成] の順に選択します。

  3. [ネットワーク] ページの [コントロールプレーンエグレス] で、[顧客ルーティング] を選択します。

  4. 残りのクラスター設定を完了し、[作成] を選択します。

AWS CloudFormation では、ResourcesVpcConfigControlPlaneEgressMode: CUSTOMER_ROUTED を設定します。このフィールドの Terraform サポートは、AWS プロバイダーの今後のリリースで利用可能になります。

注記

CUSTOMER_ROUTED への切り替えは一方向操作です。クラスターで顧客ルーティングエグレスを有効にした後は、AWS_MANAGED に戻すことはできません。

既存のクラスターの更新

update-cluster-config コマンドを使用して、既存のクラスターのコントロールプレーンエグレスモードを変更できます。

aws eks update-cluster-config \ --name my-cluster \ --resources-vpc-config "controlPlaneEgressMode=CUSTOMER_ROUTED" \ --region region-code

更新のステータスを監視します。

aws eks describe-update \ --name my-cluster \ --update-id update-id \ --region region-code

ステータスが Successful を示すと更新が完了します。更新タイプは ControlPlaneEgressUpdate です。更新は通常、10 分以内に完了します。

重要

CUSTOMER_ROUTED への切り替えは一方向操作です。クラスターで顧客ルーティングエグレスを有効にした後は、AWS_MANAGED に戻すことはできません。

切り替える前に、VPC が 前提条件 の要件を満たしていることを確認します。更新後にコントロールプレーンが必要なエンドポイントへの接続が失われると、アドミッションウェブフック呼び出しや OIDC 認証などのオペレーションが失敗する可能性があります。

IPv6 に関する考慮事項

顧客ルーティングエグレスで IPv6 クラスターを実行する場合は、IPv4 と IPv6 の両方のエグレスパスを設定する必要があります。

CUSTOMER_ROUTED エグレスで IPv6 クラスター (ipFamily=ipv6) を実行する場合:

  • コントロールプレーン ENI には、IPv4 アドレスと IPv6 アドレスの両方が割り当てられます。

  • IPv4 と IPv6 の両方のエグレスパスを設定する必要があります。

    • IPv4: エグレスデバイス (NAT ゲートウェイなど) へのデフォルトルート (0.0.0.0/0)。

    • IPv6: IPv6 エグレスデバイス (エグレス専用インターネットゲートウェイなど) への ::/0 ルート。

  • セキュリティグループと NACL は、両方の IP バージョンでトラフィックを許可する必要があります。

  • OIDC プロバイダーまたはウェブフックエンドポイントが IPv4 専用である場合は、IPv4 NAT が機能していることを確認します。

考慮事項

顧客ルーティングコントロールプレーンエグレスを使用する場合は、次の点に注意してください。

  • ユーザーの責任: CUSTOMER_ROUTED モードでは、コントロールプレーンから外部エンドポイントへのネットワークパスはユーザーが管理します。そのパスが破損した場合、そのパスに依存するコントロールプレーンオペレーション (アドミッションウェブフック呼び出しや OIDC 認証など) は、接続を復元するまで失敗する可能性があります。

  • VPC 内部トラフィックは影響を受けない: クラスター ENI を介したコントロールプレーンとノード (ポート 10250 の kubelet API など) 間のトラフィックは、エグレスデバイスに依存しません。

  • EKS Auto Mode: コントロールプレーンのエグレスルーティングは、コントロールプレーンアーキテクチャが同一であるため、標準クラスターと自動モードクラスターの両方で同じように機能します。

  • EKS 機能: EKS 機能 (ArgoCD、ACK、KRO など) は、個別の AWS マネージドインフラストラクチャで実行されます。EKS 機能コントローラーからのトラフィックは、この機能によって VPC 経由でルーティングされません。

  • オブザーバビリティ: VPC またはクラスターサブネットで VPC フローログを有効にすると、VPC を経由する送信トラフィックを監視できます。これには、ウェブフックと OIDC エンドポイントへの呼び出しが含まれます。VPC フローログが有効になっていない場合、このトラフィックはログに記録されません。

IAM 条件キー

Amazon EKS は eks:controlPlaneEgressMode 条件キーをサポートしています。このキーを IAM ポリシーまたはサービスコントロールポリシー (SCP) で使用して、発信者がクラスターを作成または更新するときに指定できるエグレスモードを制御できます。

条件キーは、次のアクションに適用されます。

  • eks:CreateCluster

  • eks:UpdateClusterConfig

例えば、次の SCP は、発信者が CUSTOMER_ROUTED を指定しない限り、クラスターの作成と設定の更新を拒否します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireCustomerRoutedControlPlane", "Effect": "Deny", "Action": [ "eks:CreateCluster", "eks:UpdateClusterConfig" ], "Resource": "*", "Condition": { "StringNotEquals": { "eks:controlPlaneEgressMode": "CUSTOMER_ROUTED" } } } ] }

このポリシーを使用して、組織内のすべての新規および更新されたクラスターが CUSTOMER_ROUTED エグレスモードを使用するように適用します。

OIDC プロバイダー設定

クラスターが OIDC ID プロバイダーを使用している場合、コントロールプレーンは HTTPS (ポート 443) 経由で OIDC 検出エンドポイントに到達できる必要があります。これは、サービスアカウントの IAM ロール、またはクラスター認証に関連付ける OIDC ID プロバイダーに適用されます。OIDC 固有の設定はありません。前提条件で設定したのと同じ出力パスを使用します。これを許可するには:

  1. コントロールプレーンサブネットに OIDC エンドポイントをカバーするルート (通常は NAT ゲートウェイなどのエグレスデバイスへのデフォルトルート) があることを確認します。

  2. クラスターセキュリティグループがアウトバウンド TCP 443 を許可していることを確認します。

  3. サブネット NACL がアウトバウンド TCP 443 およびインバウンドエフェメラルリターントラフィック (ポート 1024~65535) を許可していることを確認します。

エンドポイントはプロバイダーによって異なります。

  • Amazon EKS OIDC プロバイダー (デフォルト): oidc.eks.region-code.amazonaws.com

  • カスタム OIDC プロバイダー: 設定した発行者 URL。

OIDC 認証が失敗した場合のトラブルシューティング手順については、「OIDC プロバイダーにアクセスできない」を参照してください。

接続を確認する

CUSTOMER_ROUTED エグレスを設定したら、コントロールプレーンが VPC リソースに到達できることを確認します。

  1. 現在のエグレスモードをチェックする: クラスターが想定どおりのモードを使用していることを確認します。

    aws eks describe-cluster --name my-cluster \ --query "cluster.resourcesVpcConfig.controlPlaneEgressMode" \ --region region-code
  2. クラスターのステータスをチェックする: クラスターは ACTIVE 状態になっている必要があります。

    aws eks describe-cluster --name my-cluster --query "cluster.status" --region region-code
  3. ウェブフック接続をテストする: アドミッションウェブフックを設定している場合は、ウェブフックをトリガーするリソースを作成し、成功することを確認します。

  4. ノード登録を確認する: ノードを起動し、クラスターを正常に結合することを確認します。

    kubectl get nodes
  5. OIDC をチェックする: サービスアカウント (IRSA) に IAM ロールを使用する場合は、ポッドが IAM ロールを引き受けることができることを確認します。

一般的な問題のトラブルシューティングについては、コントロールプレーンのエグレスに関する問題のトラブルシューティング を参照してください。

📝 GitHub でこのページを編集する