

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

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

# コントロールプレーンのエグレスに関する問題のトラブルシューティング
<a name="control-plane-egress-troubleshooting"></a>

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

## 失敗したウェブフックを検出する
<a name="egress-troubleshoot-detect"></a>

コントロールプレーンがウェブフックサーバーまたは 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
```
+ エラーがタイムアウト (`context deadline exceeded`) か、接続の拒否である場合、コントロールプレーンはウェブフックエンドポイントに到達できません。「[必要なエンドポイントへのエグレスルートがない](#egress-troubleshoot-natgw)」、「[ウェブフックまたはコントロールプレーントラフィックをブロックする NACL](#egress-troubleshoot-nacl)」、および「[アクセスできないようにするセキュリティグループ](#egress-troubleshoot-sg)」を参照してください。
+ エラーが DNS に関するものであるか、そのようなホスト障害ではない場合、コントロールプレーンはエンドポイントを解決できません。「[DHCP オプションセットの更新の失敗](#egress-troubleshoot-dhcp)」を参照してください。

## 必要なエンドポイントへのエグレスルートがない
<a name="egress-troubleshoot-natgw"></a>

 **症状:** 
+ アドミッションウェブフックがタイムアウトする。
+ OIDC プロバイダーの検出が失敗する。
+ クラスターの作成または更新が停止する。

 **原因:** 

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

 **解決策:** 

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

   ```
   aws eks describe-cluster --name my-cluster \
       --query "cluster.resourcesVpcConfig.subnetIds"
   ```

1. サブネットごとに、関連付けられたルートテーブルをチェックします:

   ```
   aws ec2 describe-route-tables \
       --filters "Name=association.subnet-id,Values=subnet-ExampleID1"
   ```

1. エグレスデバイスを指す `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
<a name="egress-troubleshoot-nacl"></a>

 **症状:** 
+ アドミッションウェブフック呼び出しがタイムアウトする (エラー: `failed calling webhook`)。
+ ミューテーティングウェブフックまたは検証ウェブフックを使用する Kubernetes リソースを作成または変更する際の断続的な障害。

 **原因**: 

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

 **解決策:** 

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

   ```
   aws ec2 describe-network-acls \
       --filters "Name=association.subnet-id,Values=subnet-ExampleID1"
   ```

1. 次のルールが存在することを確認します:    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/control-plane-egress-troubleshooting.html)
**注記**  
NACL はステートレスです。インバウンドルールで、エフェメラルポート (1024～65535) でリターントラフィックを明示的に許可する必要があります。  
これらのルールは、2 つの異なるパスを対象としています。ポート 443 ルールは、ウェブフックと OIDC エンドポイントへのアウトバウンドトラフィック用であり、それはエグレスデバイスを介して VPC から離れます。ポート 10250 ルールは kubelet API 用であり、それはコントロールプレーンとノードの間の VPC 内に留まります。エグレスデバイスが存在しない場合、ポート 10250 には影響しませんが、制限的なネットワーク ACL によってブロックされる可能性があります。

## アクセスできないようにするセキュリティグループ
<a name="egress-troubleshoot-sg"></a>

 **症状:** 
+ Webhook 呼び出しが失敗する。
+ コントロールプレーンはノード (ポート 10250) の kubelet API に到達できない。
+  `kubectl exec`、`kubectl logs`、または `kubectl port-forward` が失敗する。

 **原因**: 

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

 **解決策:** 

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

   ```
   aws eks describe-cluster --name my-cluster \
       --query "cluster.resourcesVpcConfig.clusterSecurityGroupId"
   ```

1. アウトバウンドルールで以下が許可されていることを確認します:    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/control-plane-egress-troubleshooting.html)

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

   ```
   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 オプションセットの更新の失敗
<a name="egress-troubleshoot-dhcp"></a>

 **症状:** 
+ コントロールプレーンから 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
   ```

1. `domain-name-servers` に `AmazonProvidedDNS` (VPC IPv4 CIDR のベースに 2 つ加えた Amazon が提供する DNS リゾルバー)、またはコントロールプレーンに必要な名前を解決できる別のリゾルバーが含まれていることを確認します。

1. クラスターの IAM ロールが `ec2:DescribeVpcs` と `ec2:DescribeDhcpOptions` を付与していることを確認します。これらのアクセス許可がないと、コントロールプレーンは更新された DHCP オプションを読み取れず、DNS 設定を更新できません。詳細については、「[Amazon EKS クラスターの IAM ロール](https://docs.aws.amazon.com/eks/latest/userguide/cluster-iam-role.html)」を参照してください。

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

## IPv6 ルーティングの問題
<a name="egress-troubleshoot-ipv6"></a>

 **症状:** 
+ 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"
   ```

1. コントロールプレーンサブネットのルートテーブルに `::/0` ルートがあることを確認します。

   ```
   aws ec2 describe-route-tables \
       --filters "Name=association.subnet-id,Values=subnet-ExampleID1" \
       --query "RouteTables[0].Routes[?DestinationIpv6CidrBlock=='::/0']"
   ```

1. 見つからない場合は、ルートを追加します。

   ```
   aws ec2 create-route \
       --route-table-id rtb-ExampleID \
       --destination-ipv6-cidr-block ::/0 \
       --egress-only-internet-gateway-id eigw-ExampleID
   ```

1. NACL とセキュリティグループが、ポート 443 のアウトバウンドおよびインバウンドエフェメラルポートで IPv6 を許可していることを確認します。

## OIDC プロバイダーにアクセスできない
<a name="egress-troubleshoot-oidc"></a>

 **症状:** 
+  `IAM roles for service accounts` (IRSA) が失敗 – ポッドがロールを引き受けることができない。
+ クラスターイベントに OIDC 検出エラーが表示される。

 **原因**: 

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

 **解決策:** 

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

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

📝 [GitHub でこのページを編集する](https://github.com/search?q=repo%3Aawsdocs%2Famazon-eks-user-guide+%5B%23control-plane-egress-troubleshooting%5D&type=code) 