View a markdown version of this page

コントロールプレーンのエグレスに関する問題のトラブルシューティング - Amazon EKS

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

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

コントロールプレーンのエグレスに関する問題のトラブルシューティング

CUSTOMER_ROUTED コントロールプレーンエグレスモードを使用する場合、コントロールプレーン ENI からのネットワーク接続はユーザーの責任になります。このページでは、一般的な問題とその解決策について説明します。

失敗したウェブフックを検出する

コントロールプレーンがウェブフックサーバーまたは OIDC プロバイダーに到達できない場合、通常、症状はウェブフックタイムアウトとして表れます。確認するには、ウェブフックをトリガーするリソースを作成または変更し、エラーを確認します。

kubectl apply -f my-resource.yaml

接続または DNS 障害では通常、次のようなエラーを返します:

Error from server (InternalError): error when creating "my-resource.yaml": Internal error occurred: failed calling webhook "my-webhook.example.com": failed to call webhook: Post "https://my-webhook.example.com/validate?timeout=10s": context deadline exceeded

クラスター全体のウェブフックエラーの最近のイベントを確認することもできます:

kubectl get events --all-namespaces --field-selector reason=FailedCreate

必要なエンドポイントへのエグレスルートがない

症状:

  • アドミッションウェブフックがタイムアウトする。

  • OIDC プロバイダーの検出が失敗する。

  • クラスターの作成または更新が停止する。

原因:

コントロールプレーンのネットワークインターフェイスサブネットには、コントロールプレーンが到達する必要があるエンドポイントへの有効なルートがありません。通常、サブネットルートテーブルには、エグレスデバイスへのデフォルトルートがありません。または、そのデバイスが誤って設定されています。通常、エグレスデバイスは NAT ゲートウェイです。ただし、それを NAT インスタンス、ファイアウォールまたはプロキシアプライアンス、または一元化されたエグレス VPC へのトランジットゲートウェイにすることもできます。

解決策:

  1. クラスターがコントロールプレーンネットワークインターフェイスに使用するサブネットを特定します:

    aws eks describe-cluster --name my-cluster \ --query "cluster.resourcesVpcConfig.subnetIds"
  2. サブネットごとに、関連付けられたルートテーブルをチェックします:

    aws ec2 describe-route-tables \ --filters "Name=association.subnet-id,Values=subnet-ExampleID1"
  3. エグレスデバイスを指す 0.0.0.0/0 のルート (またはエンドポイントをカバーするルート) が存在することを確認します。見つからない場合は、ルートを追加します。次の例では、NAT ゲートウェイルートを追加します。独自のエグレスターゲット (トランジットゲートウェイやネットワークインターフェイスなど) に置き換えてください:

    aws ec2 create-route \ --route-table-id rtb-ExampleID \ --destination-cidr-block 0.0.0.0/0 \ --nat-gateway-id nat-ExampleID

ウェブフックまたはコントロールプレーントラフィックをブロックする NACL

症状:

  • アドミッションウェブフック呼び出しがタイムアウトする (エラー: failed calling webhook)。

  • ミューテーティングウェブフックまたは検証ウェブフックを使用する Kubernetes リソースを作成または変更する際の断続的な障害。

原因:

コントロールプレーン ENI サブネット上のネットワーク ACL が、ウェブフックエンドポイントへのアウトバウンドトラフィックをブロックするか、インバウンドエフェメラルポートのリターントラフィックをブロックします。

解決策:

  1. コントロールプレーンサブネットに関連付けられている NACL を特定します。

    aws ec2 describe-network-acls \ --filters "Name=association.subnet-id,Values=subnet-ExampleID1"
  2. 次のルールが存在することを確認します:

    Direction プロトコル ポート範囲 送信先/送信元 アクション

    アウトバウンド

    TCP

    443

    0.0.0.0/0 (またはウェブフック CIDR)

    許可

    アウトバウンド

    TCP

    10250

    VPC CIDR

    許可

    インバウンド

    TCP

    1024–65535

    0.0.0.0/0

    許可 (エフェメラルリターントラフィック)

    注記

    NACL はステートレスです。インバウンドルールで、エフェメラルポート (1024~65535) でリターントラフィックを明示的に許可する必要があります。

    これらのルールは、2 つの異なるパスを対象としています。ポート 443 ルールは、ウェブフックと OIDC エンドポイントへのアウトバウンドトラフィック用であり、それはエグレスデバイスを介して VPC から離れます。ポート 10250 ルールは kubelet API 用であり、それはコントロールプレーンとノードの間の VPC 内に留まります。エグレスデバイスが存在しない場合、ポート 10250 には影響しませんが、制限的なネットワーク ACL によってブロックされる可能性があります。

アクセスできないようにするセキュリティグループ

症状:

  • Webhook 呼び出しが失敗する。

  • コントロールプレーンはノード (ポート 10250) の kubelet API に到達できない。

  • kubectl execkubectl logs、または kubectl port-forward が失敗する。

原因:

コントロールプレーン ENI にアタッチされたセキュリティグループ (クラスターセキュリティグループ) は、必要なポートでのアウトバウンドトラフィックを許可しません。

解決策:

  1. クラスターセキュリティグループを特定する:

    aws eks describe-cluster --name my-cluster \ --query "cluster.resourcesVpcConfig.clusterSecurityGroupId"
  2. アウトバウンドルールで以下が許可されていることを確認します:

    プロトコル ポート 送信先

    TCP

    443

    0.0.0.0/0 (ウェブフックエンドポイント、OIDC プロバイダー)

    TCP

    10250

    ノードセキュリティグループまたは VPC CIDR (kubelet API)

  3. アウトバウンドルールが制限されている場合は、必要なトラフィックのルールを追加します。

    aws ec2 authorize-security-group-egress \ --group-id sg-ExampleClusterSG \ --protocol tcp \ --port 443 \ --cidr 0.0.0.0/0
    注記

    厳格なエグレス要件があり、ウェブフックエンドポイントと OIDC エンドポイントの IP 範囲がわかっている場合は、ポート 443 ルールを 0.0.0.0/0 の代わりに、それらの特定の CIDR にスコープできます。ポート 10250 (kubelet API) ルールは VPC 内部のものであり、インターネットではなくノードセキュリティグループまたは VPC CIDR にスコープします。

DHCP オプションセットの更新の失敗

症状:

  • コントロールプレーンから DNS 解決が失敗する。

  • DNS ルックアップ (OIDC 検出、ウェブフック解決) を必要とするクラスターオペレーションが失敗する。

  • 問題が、VPC DHCP オプションが変更されるか、コントロールプレーンが更新された後に発生する。

原因:

VPC DHCP オプションセットが変更されました。または、ドメインネームサーバーに AmazonProvidedDNS が含まれていません。また、コントロールプレーンが必要な名前を解決できる別のリゾルバーがない可能性もあります。コントロールプレーンは DHCP オプションセットの変更を自動的に検出し、通常は 1 時間以内に新しい DNS 設定を適用します。コントロールプレーンは、クラスター IAM ロールが、必要な Amazon EC2 読み取りアクセス許可を付与する場合にのみこれを行うことができます。

解決策:

  1. VPC の DHCP オプションセットを確認します。

    aws ec2 describe-vpcs --vpc-ids vpc-ExampleID \ --query "Vpcs[0].DhcpOptionsId" \ --region region-code
    aws ec2 describe-dhcp-options --dhcp-options-ids dopt-ExampleID --region region-code
  2. domain-name-serversAmazonProvidedDNS (VPC IPv4 CIDR のベースに 2 つ加えた Amazon が提供する DNS リゾルバー)、またはコントロールプレーンに必要な名前を解決できる別のリゾルバーが含まれていることを確認します。

  3. クラスターの IAM ロールが ec2:DescribeVpcsec2:DescribeDhcpOptions を付与していることを確認します。これらのアクセス許可がないと、コントロールプレーンは更新された DHCP オプションを読み取れず、DNS 設定を更新できません。詳細については、「Amazon EKS クラスターの IAM ロール」を参照してください。

  4. DHCP オプションが変更されたら、コントロールプレーンが新しい設定を自動的に検出して適用するまで最大 1 時間かかります。クラスターの更新やインスタンスの置換は必要ありません。1 時間後も DNS 解決が失敗し、上記のアクセス許可が設定されている場合は、AWS サポートにお問い合わせください。

IPv6 ルーティングの問題

症状:

  • IPv6 クラスターが外部 OIDC エンドポイントまたはウェブフックエンドポイントに到達できない。

  • ノード登録が IPv4 では機能するが、IPv6 サービスは失敗する。

原因:

サブネットルートテーブルに Egress-Only インターネットゲートウェイへの ::/0 ルートがないか、セキュリティグループ/NACL が IPv6 トラフィックを許可していません。

解決策:

  1. Egress-Only インターネットゲートウェイが存在し、VPC にアタッチされていることを確認します。

    aws ec2 describe-egress-only-internet-gateways \ --filters "Name=attachment.vpc-id,Values=vpc-ExampleID"
  2. コントロールプレーンサブネットのルートテーブルに ::/0 ルートがあることを確認します。

    aws ec2 describe-route-tables \ --filters "Name=association.subnet-id,Values=subnet-ExampleID1" \ --query "RouteTables[0].Routes[?DestinationIpv6CidrBlock=='::/0']"
  3. 見つからない場合は、ルートを追加します。

    aws ec2 create-route \ --route-table-id rtb-ExampleID \ --destination-ipv6-cidr-block ::/0 \ --egress-only-internet-gateway-id eigw-ExampleID
  4. NACL とセキュリティグループが、ポート 443 のアウトバウンドおよびインバウンドエフェメラルポートで IPv6 を許可していることを確認します。

OIDC プロバイダーにアクセスできない

症状:

  • IAM roles for service accounts (IRSA) が失敗 – ポッドがロールを引き受けることができない。

  • クラスターイベントに OIDC 検出エラーが表示される。

原因:

エグレスがブロックされているため、コントロールプレーンは OIDC プロバイダーエンドポイント (例: oidc.eks.region-code.amazonaws.com) に到達できません。

解決策:

  1. エグレスパスとルートテーブルがアウトバウンド HTTPS トラフィックを許可していることを確認します。エグレスルートがないか、設定が間違っている場合のトラブルシューティング手順については、必要なエンドポイントへのエグレスルートがない を参照してください。

  2. クラスターセキュリティグループが 0.0.0.0/0 へのアウトバウンド TCP 443 を許可していることを確認します (アクセスできないようにするセキュリティグループ を参照)。

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