

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 對控制平面輸出問題進行故障診斷
<a name="control-plane-egress-troubleshooting"></a>

使用`CUSTOMER_ROUTED`控制平面輸出模式時，您必須負責控制平面 ENIs 的網路連線。此頁面涵蓋常見問題及其解決方案。

## 偵測失敗的 Webhook
<a name="egress-troubleshoot-detect"></a>

當控制平面無法連線到 Webhook 伺服器或 OIDC 供應商時，症狀通常會顯示為 Webhook 逾時。若要確認，請建立或修改觸發 Webhook 的資源，並檢查錯誤：

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

您也可以檢查叢集中最近的事件是否有 Webhook 錯誤：

```
kubectl get events --all-namespaces --field-selector reason=FailedCreate
```
+ 如果錯誤是逾時 (`context deadline exceeded`) 或連線遭拒，則控制平面無法連線到 Webhook 端點。請參閱[沒有輸出路由到所需的端點](#egress-troubleshoot-natgw)、[封鎖 Webhook 或控制平面流量NACLs](#egress-troubleshoot-nacl)和[防止存取的安全群組](#egress-troubleshoot-sg)。
+ 如果錯誤提及 DNS 或沒有此類主機失敗，則控制平面無法解析端點。請參閱 [DHCP 選項集重新整理失敗](#egress-troubleshoot-dhcp)。

## 沒有輸出路由到所需的端點
<a name="egress-troubleshoot-natgw"></a>

 **徵狀：**
+ 許可 Webhook 逾時。
+ 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
   ```

## 封鎖 Webhook 或控制平面流量NACLs
<a name="egress-troubleshoot-nacl"></a>

 **徵狀：**
+ 許可 Webhook 呼叫逾時 （錯誤：`failed calling webhook`)。
+ 建立或修改使用變動或驗證 Webhook 的 Kubernetes 資源時發生間歇性失敗。

 **原因：**

控制平面 ENI 子網路上的網路 ACLs 會封鎖 Webhook 端點的傳出流量，或封鎖傳入暫時性連接埠傳回流量。

 **解決方案**：

1. 識別與您的控制平面子網路相關聯的 NACLs：

   ```
   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/zh_tw/eks/latest/userguide/control-plane-egress-troubleshooting.html)
**注意**  
NACLs 是無狀態的。您必須明確允許傳入規則中暫時性連接埠 (1024–65535) 上的傳回流量。  
這些規則涵蓋兩個不同的路徑。連接埠 443 規則適用於傳出流量到 Webhook 和 OIDC 端點，這會透過您的輸出裝置離開 VPC。連接埠 10250 規則適用於 kubelet API，其會在控制平面和節點之間保留在您的 VPC 內。遺失的輸出裝置不會影響連接埠 10250，但限制性網路 ACL 可以封鎖它。

## 防止存取的安全群組
<a name="egress-troubleshoot-sg"></a>

 **徵狀：**
+ Webhook 呼叫失敗。
+ 控制平面無法連線到節點上的 kubelet API （連接埠 10250)。
+  `kubectl exec`、 `kubectl logs`或 `kubectl port-forward` 失敗。

 **原因：**

連接到控制平面 ENIs 的安全群組 (*叢集安全群組*) 不允許必要連接埠上的傳出流量。

 **解決方案**：

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/zh_tw/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
   ```
**注意**  
如果您有嚴格的輸出要求，而且您知道 Webhook 和 OIDC 端點的 IP 範圍，您可以將連接埠 443 規則範圍限定為這些特定的 CIDRs，而不是 `0.0.0.0/0`。連接埠 10250 (kubelet API) 規則為 VPC 內部；將其範圍限定於節點安全群組或 VPC CIDR，而非網際網路。

## DHCP 選項集重新整理失敗
<a name="egress-troubleshoot-dhcp"></a>

 **徵狀：**
+ DNS 解析從控制平面失敗。
+ 需要 DNS 查詢 (OIDC 探索、Webhook 解析） 的叢集操作失敗。
+ 問題會在 VPC DHCP 選項變更後或控制平面更新後出現。

 **原因：**

VPC DHCP 選項集已變更。或者，它不包括在其網域名稱伺服器`AmazonProvidedDNS`中。它也可能缺少另一個解析程式，可以解析控制平面所需的名稱。控制平面會自動偵測 DHCP 選項集變更，並套用新的 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`(Amazon 提供的 DNS 解析程式，這是 VPC IPv4 CIDR 的基礎加上兩個），或另一個解析程式可以解析控制平面所需的名稱。

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 選項變更後，控制平面最多需要一小時的時間來自動偵測和套用新設定。不需要叢集更新或執行個體替換。如果 DNS 解析在一小時後仍然失敗，且上述許可已就緒，請聯絡 AWS Support。

## IPv6 路由問題
<a name="egress-troubleshoot-ipv6"></a>

 **徵狀：**
+ IPv6 叢集無法連線到外部 OIDC 或 Webhook 端點。
+ 節點註冊可透過 IPv4 運作，但 IPv6 服務失敗。

 **原因：**

子網路路由表缺少僅輸出網際網路閘道的`::/0`路由，或安全群組/NACLs不允許 IPv6 流量。

 **解決方案**：

1. 驗證輸出限定網際網路閘道是否存在，並連接到 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. 確保 NACLs 和安全群組允許連接埠 443 和傳入暫時性連接埠上的 IPv6 傳出。

## 無法連線 OIDC 提供者
<a name="egress-troubleshoot-oidc"></a>

 **徵狀：**
+  `IAM roles for service accounts` (IRSA) 失敗 — Pod 無法擔任角色。
+ 叢集事件會顯示 OIDC 探索錯誤。

 **原因：**

控制平面無法到達 OIDC 提供者端點 （例如 `oidc.eks.region-code.amazonaws.com`)，因為輸出遭到封鎖。

 **解決方案**：

1. 確認輸出路徑和路由表允許傳出 HTTPS 流量。如需輸出路由遺失或設定錯誤時的疑難排解步驟，請參閱 [沒有輸出路由到所需的端點](#egress-troubleshoot-natgw)。

1. 確認叢集安全群組允許傳出 TCP 443 `0.0.0.0/0`（請參閱 [防止存取的安全群組](#egress-troubleshoot-sg))。

📝 [在 GitHub 上編輯此頁面](https://github.com/search?q=repo%3Aawsdocs%2Famazon-eks-user-guide+%5B%23control-plane-egress-troubleshooting%5D&type=code) 