

 **協助改進此頁面** 

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

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

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

# 設定控制平面輸出路由
<a name="control-plane-egress"></a>

根據預設，Amazon EKS 會管理從 Kubernetes 控制平面到 VPC 資源的輸出聯網。使用*控制平面輸出路由*來變更此行為，並自行管理網路路徑。這可讓您完全控制來自控制平面彈性網路界面 (ENIs) 的流量如何到達您的 VPC 資源。您可以透過自己的 NAT 閘道、防火牆或檢查設備進行路由。

![架構圖顯示 kube-apiserver 透過客戶 VPC 子網路中的跨帳戶 ENI 將流量傳送至路由表和輸出裝置，例如 NAT 閘道，然後傳到網際網路以連接 Webhook 和 OIDC 端點](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/control-plane-egress-overview.png)


## 輸出路由模式
<a name="control-plane-egress-modes"></a>

Amazon EKS 支援下列控制平面輸出路由模式：


| Mode | 說明 | 
| --- | --- | 
|  `AWS_MANAGED`  | 預設行為。Amazon EKS 會管理控制平面 ENIs 的輸出路徑。您不需要為控制平面流量設定 NAT 閘道或其他路由基礎設施。 | 
|  `CUSTOMER_ROUTED`  | 您可以從 VPC 子網路中的控制平面管理輸出路徑。您有責任確保控制平面可以到達所需的端點 （例如 Webhook 伺服器、OIDC 提供者和其他資源）。您提供輸出路徑，例如 NAT 閘道、NAT 執行個體、傳輸閘道或防火牆設備。您也可以設定允許此流量的路由表、網路 ACL 和安全群組規則。 | 

**重要**  
在 `CUSTOMER_ROUTED`模式下，您有責任確保從控制平面進行適當的網路連線。VPC 網路中的設定錯誤可能會導致控制平面操作失敗。這些設定錯誤包括缺少輸出路徑、限制性網路 ACLs 或不正確的安全群組。受影響的操作包括許可 Webhook 呼叫和 OIDC 身分驗證。

## 先決條件
<a name="control-plane-egress-prerequisites"></a>

您的 VPC 和子網路必須符合標準 Amazon EKS 聯網需求。如需詳細資訊，請參閱[檢視 VPC 和子網路的 Amazon EKS 聯網需求](network-reqs.md)。

在 `CUSTOMER_ROUTED`模式下，Kubernetes API 伺服器會透過跨帳戶網路界面傳送面向客戶的流量傳出。Amazon EKS 已在子網路中建立這些界面，用於控制平面到節點的通訊。此流量包含對許可 Webhook 和 OIDC 供應商的呼叫。Amazon EKS 不會建立個別的輸出網路介面。此模式會變更現有界面的使用*方式*。存放這些界面的子網路必須符合下列要求：
+ 子網路必須具有控制平面需要到達的端點路由 （例如 Webhook 伺服器和 OIDC 供應商）。對於 VPC 外部的端點，這通常表示輸出裝置的預設路由。預設路由`0.0.0.0/0`適用於 IPv4，`::/0`適用於 IPv6。輸出裝置可以是 NAT 閘道、NAT 執行個體、防火牆或傳輸閘道至集中式輸出 VPC。輸出裝置的選擇由您選擇；Amazon EKS 只需要路徑即可運作。
+ 跨帳戶網路介面上的安全群組必須允許工作負載所需的連接埠上的傳出流量 （例如，Webhook 和 OIDC 提供者的連接埠 443)。
+ 子網路上的網路 ACLs 必須允許傳出流量，以及傳回流量的對應傳入暫時性連接埠範圍。

在 `CUSTOMER_ROUTED`模式下，控制平面會使用 VPC 的 DNS 組態解析主機名稱。這可讓控制平面到達 Route 53 私有託管區域中的端點，以及透過 Route 53 Resolver 端點轉送的內部部署 DNS。
+ 您的 VPC DHCP 選項集必須包含`AmazonProvidedDNS`在其網域名稱伺服器清單中。這是控制平面解析 VPC 內 DNS 名稱的必要項目。如果您的叢集使用具有公有 DNS 名稱的外部 Webhook 端點或 OIDC 供應商，解析程式也必須解析公有主機名稱。確保解析程式可以同時處理 VPC 和公有 DNS 解析。

下表摘要說明控制平面在 `CUSTOMER_ROUTED` 模式下透過 VPC 傳送的流量：


| 流量 | 目標 | 站點 | 備註 | 
| --- | --- | --- | --- | 
| 許可 Webhook | Webhook 端點 （客戶定義的 URLs) | 443 （通常是） | 只有在 Webhook 已設定時。如果端點是外部，則透過輸出裝置離開 VPC。 | 
| OIDC 探索 | OIDC 發行者 URL | 443 | 只有在已設定 OIDC 供應商時。如果發行者是外部，則透過您的輸出裝置離開 VPC。 | 
| 彙總 API 伺服器 | 客戶 API 伺服器端點 | 443 | 只有在設定時。如果端點是外部，則透過輸出裝置離開 VPC。 | 
| Kubelet API | 工作者節點 IP 地址 | 10250 | 這是控制平面與節點之間透過叢集 ENI 的流量；它不會周遊您的輸出裝置。它需要路由表、安全群組和網路 ACLs 允許控制平面和節點之間跨叢集 ENI 的流量。 | 

**注意**  
只有此資料表中列出的流量會受到輸出組態影響。EKS 受管控制平面流量 （例如與 etcd、CloudWatch Logs 和內部 EKS 服務的通訊） 透過 AWS 受管網路路徑繼續，不受 VPC 組態影響。

## 建立具有客戶路由輸出的叢集
<a name="control-plane-egress-create"></a>

您可以在建立新叢集時指定控制平面輸出模式。

**Example**  
執行下列命令。將{{預留位置值}}取代為您自己的值。  

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

您可以將 `ipFamily=ipv6`用於 IPv6 叢集。搭配 `CUSTOMER_ROUTED` 模式使用 IPv6 時，請確定子網路除了 IPv4 流量的 NAT 閘道之外，還有 IPv6 流量的輸出限定網際網路閘道。

**Example**    
 AWS 管理主控台   

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇 **Add cluster** (新增叢集)，然後選擇 **Create** (建立)。

1. 在**聯網**頁面上，針對**控制平面輸出**，選取**客戶路由**。

1. 完成剩餘的叢集組態，然後選擇**建立**。

For AWS CloudFormation，在 `ControlPlaneEgressMode: CUSTOMER_ROUTED`中設定 `ResourcesVpcConfig`。未來版本的[AWS 提供者](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)將可使用此欄位的 Terraform 支援。

**注意**  
切換到 `CUSTOMER_ROUTED` 是單向操作。在叢集上啟用客戶路由輸出後，您就無法還原為 `AWS_MANAGED`。

## 更新現有叢集
<a name="control-plane-egress-update"></a>

您可以使用 `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 符合 中的要求[先決條件](#control-plane-egress-prerequisites)。如果控制平面在更新後失去與所需端點的連線，許可 Webhook 呼叫和 OIDC 身分驗證等操作可能會失敗。

## IPv6 考量因素
<a name="control-plane-egress-ipv6"></a>

如果您使用客戶路由輸出執行 IPv6 叢集，則需要同時設定 IPv4 和 IPv6 輸出路徑。

使用輸出執行 IPv6 叢集 (`ipFamily=ipv6`) `CUSTOMER_ROUTED` 時：
+ 控制平面 ENIs 會同時指派 IPv4 和 IPv6 地址。
+ 您必須同時設定 IPv4 和 IPv6 輸出路徑：
  +  **IPv4**：輸出裝置的預設路由 (`0.0.0.0/0`) （例如 NAT 閘道）。
  +  **IPv6**：到 IPv6 輸出裝置的`::/0`路由 （例如，僅限輸出網際網路閘道）。
+ 安全群組和 NACLs 必須允許兩個 IP 版本的流量。
+ 如果您的 OIDC 提供者或 Webhook 端點僅限 IPv4-only，請確保 IPv4 NAT 正常運作。

## 考量事項
<a name="control-plane-egress-considerations"></a>

當您使用客戶路由控制平面輸出時，請記住下列幾點：
+  **您的責任**：在 `CUSTOMER_ROUTED`模式下，您擁有從控制平面到外部端點的網路路徑。如果該路徑中斷，控制相依於它的平面操作 （例如許可 Webhook 呼叫和 OIDC 身分驗證） 可能會失敗，直到您還原連線為止。
+  **VPC 內部流量不受影響**：控制平面與節點之間的流量 （例如，連接埠 10250 上的 kubelet API) 透過叢集 ENI 並不取決於您的輸出裝置。
+  **EKS Auto Mode**：控制平面輸出路由在標準和自動模式叢集上的運作方式相同，因為控制平面架構相同。
+  **EKS 功能**：EKS 功能 （例如 ArgoCD、ACK 和 KRO) 會在不同的 AWS 受管基礎設施中執行。此功能不會透過 VPC 路由來自 EKS 功能控制器的流量。
+  可**觀測性**：如果您在 VPC 或叢集子網路上啟用 VPC 流程日誌，則可以觀察透過 VPC 路由的輸出流量。這包括對 Webhook 和 OIDC 端點的呼叫。如果未啟用 VPC 流程日誌，則不會記錄此流量。

## IAM 條件索引鍵
<a name="control-plane-egress-iam-condition"></a>

Amazon EKS 支援 `eks:controlPlaneEgressMode`條件金鑰。您可以在 IAM 政策或服務控制政策 (SCPs) 中使用此金鑰，以控制發起人在建立或更新叢集時可以指定哪些輸出模式發起人。

條件索引鍵適用於下列動作：
+  `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 提供者組態
<a name="control-plane-egress-oidc"></a>

如果您的叢集使用 OIDC 身分提供者，控制平面必須透過 HTTPS （連接埠 443) 到達 OIDC 探索端點。這適用於服務帳戶的 IAM 角色，或您為叢集身分驗證建立關聯的 OIDC 身分提供者。沒有 OIDC 特定的設定；它使用您在[先決條件](#control-plane-egress-prerequisites)中設定的相同輸出路徑。若要允許它：

1. 確認控制平面子網路具有涵蓋 OIDC 端點的路由 （通常是輸出裝置的預設路由，例如 NAT 閘道）。

1. 確認叢集安全群組允許傳出 TCP 443。

1. 確認子網路 NACLs傳出 TCP 443 和傳入暫時性傳回流量 （連接埠 1024–65535)。

端點取決於您的提供者：
+  **Amazon EKS OIDC 提供者 （預設）**： `oidc.eks.{{region-code}}.amazonaws.com`
+  **自訂 OIDC 供應商**：您設定的發行者 URL。

如果 OIDC 身分驗證失敗，如需疑難排解步驟，請參閱 [無法連線 OIDC 提供者](control-plane-egress-troubleshooting.md#egress-troubleshoot-oidc)。

## 驗證連線
<a name="control-plane-egress-verify"></a>

設定`CUSTOMER_ROUTED`輸出後，請確認控制平面可以到達您的 VPC 資源：

1.  **檢查目前的輸出模式**：確認叢集使用您預期的模式。

   ```
   aws eks describe-cluster --name my-cluster \
       --query "cluster.resourcesVpcConfig.controlPlaneEgressMode" \
       --region region-code
   ```

1.  **檢查叢集狀態**：叢集應處於 `ACTIVE` 狀態。

   ```
   aws eks describe-cluster --name my-cluster --query "cluster.status" --region region-code
   ```

1.  **測試 Webhook 連線**：如果您已設定許可 Webhook，請建立可觸發 Webhook 並確認 Webhook 成功的資源。

1.  **驗證節點註冊**：啟動節點並確認其成功加入叢集。

   ```
   kubectl get nodes
   ```

1.  **檢查 OIDC**：如果針對服務帳戶 (IRSA) 使用 IAM 角色，請確認 Pod 可以擔任其 IAM 角色。

如需常見問題的故障診斷，請參閱 [對控制平面輸出問題進行故障診斷](control-plane-egress-troubleshooting.md)。

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