

 **協助改進此頁面** 

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

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

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

# 設定 Pod IP 地址的子網路選擇
<a name="cni-subnet-selection"></a>

 **適用於**：包含 Amazon EC2 執行個體的 Linux 節點

適用於 Kubernetes 的 Amazon VPC CNI 外掛程式會在節點上建立次要彈性網路介面 (ENIs)，並將這些 ENIs IP 地址指派給 Pod。根據預設，VPC CNI 會在與節點主要網路界面相同的子網路中建立次要 ENIs。您可以透過下列方法控制 VPC CNI 用於 Pod IP 地址的子網路：
+  **增強型子網路探索** – VPC CNI 會自動探索並使用在相同 VPC 和可用`kubernetes.io/role/cni`區域中以 標記的子網路。需要 VPC CNI 1.18.0 版或更新版本。對於大多數使用案例，我們建議使用此方法。
+  **自訂聯網** – 使用`ENIConfig`自訂資源，為每個可用區域手動指定子網路和安全群組。如需詳細資訊，請參閱[使用自訂聯網在替代子網路中部署 Pod](cni-custom-network.md)。

**注意**  
啟用這兩個功能時，以自訂聯網為優先。

## 增強型子網路探索
<a name="cni-subnet-selection-enhanced-discovery"></a>

VPC CNI 1.18.0 版及更新版本預設會啟用增強型子網路探索 (`ENABLE_SUBNET_DISCOVERY=true`)。VPC CNI 會自動探索與節點位於相同 VPC 和可用區域中的子網路，然後使用它們來建立次要 ENIs並配置 Pod IP 地址。這可展開可用的 IP 地址空間，無需手動`ENIConfig`設定。

若要確認已啟用此功能：

```
kubectl describe ds aws-node -n kube-system | grep ENABLE_SUBNET_DISCOVERY
```

若要停用此功能，請在 `aws-node` DaemonSet `ENABLE_SUBNET_DISCOVERY=false`上設定 。

## 子網路標籤行為 (`kubernetes.io/role/cni`)
<a name="cni-subnet-selection-tag-behavior"></a>

`kubernetes.io/role/cni` 標籤控制 VPC CNI 如何處理 ENI 操作和 Pod IP 配置的子網路。標籤具有不同的效果，取決於 VPC CNI 是建立新的 ENI 還是協調現有的 ENI。

**重要**  
叢集範圍和排除性標記機制只能從 VPC CNI `v1.22.2` 版本開始提供。在此版本之前，只有標準選擇加入行為可透過標籤 使用`kubernetes.io/role/cni=1`。

### 標籤值
<a name="cni-subnet-selection-tag-values"></a>

下表摘要說明每個標籤值如何影響子網路行為：


| 標籤值 | 建立新的 ENI | 現有的 ENI 對帳 | 
| --- | --- | --- | 
|  `1`  |  **選擇加入**：VPC CNI 會在此子網路中建立新的 ENIs。 | ENI 仍可用於 Pod IP 配置。 | 
|  `0`  |  **排除**：VPC CNI 不會在此子網路中建立新的 ENIs。 |  **排除**：VPC CNI 會從 Pod IP 配置中排除此子網路中的現有 ENIs。此 ENI 未指派新的 Pod IPs。 | 
| 不存在 （無標籤） |  **不用於新的 ENIs**：VPC CNI 不會選取沒有新 ENI 建立標籤的次要子網路。主要子網路 （節點啟動的子網路） 仍會用於新的 ENI 建立，即使沒有 標籤也適用於回溯相容性。 |  **不中斷**：未標記子網路中的現有 ENIs 仍可用於 Pod IP 配置。VPC CNI 不會移除或排除這些 ENIs。 | 

### 建立與對帳行為
<a name="cni-subnet-selection-creation-vs-reconciliation"></a>

VPC CNI 會在建立新 ENIs 和協調現有 ENIs 時刻意套用不同的政策：
+  **建立 （次要子網路關閉失敗）**：當 VPC CNI 需要建立新的次要 ENI 時，它只會使用以 明確標記的次要子網路`kubernetes.io/role/cni=1`。從未選取未標記的次要子網路來建立新的 ENI。這可確保新的網路界面僅放置在管理員明確核准的子網路中。
+  **調校 （未標記的子網路無法開啟）**：VPC CNI 啟動或調校已連接到節點的現有 ENIs 時，不會排除 ENIs因為其子網路缺少`kubernetes.io/role/cni`標籤。這可防止中斷已使用這些 ENIs IP 地址的執行中 Pod。

VPC CNI 刻意使用此設計。從未標記的子網路強制排除已連接的 ENI 會中斷目前使用該 ENI IP 地址的 Pod。

**重要**  
為了防止子網路提供新的 Pod IPs，包括來自現有 ENIs 的 IP，請使用 標記子網路`kubernetes.io/role/cni=0`。缺少標籤只會防止在該子網路中**建立新的** ENI。它不會從配置中排除現有的 ENIs。

### 主要子網路處理
<a name="cni-subnet-selection-primary-subnet"></a>

VPC CNI 一律包含節點的主要子網路 （節點啟動的子網路） 以進行 ENI 建立，即使沒有 `kubernetes.io/role/cni`標籤也一樣。這可維持與現有叢集的回溯相容性。主要子網路行為：
+ 包含用於建立 ENI，無論標籤是否存在 （除非已標記 `0`)。
+ 如果使用 標記`kubernetes.io/role/cni=0`，VPC CNI 會從新的 ENI 建立和現有的 ENI 配置中排除主要子網路。

### 叢集範圍子網路篩選
<a name="cni-subnet-selection-cluster-tags"></a>

當子網路使用 標記時`kubernetes.io/role/cni=1`，VPC CNI 還會使用金鑰格式 檢查叢集特定的標籤`cni.networking.k8s.aws/cluster/<cluster-name>`。如果子網路具有此格式的任何叢集標籤，則只有名稱相符的叢集會使用該子網路。具有 `kubernetes.io/role/cni=1`且沒有叢集特定標籤的子網路可供 VPC 中的所有叢集使用。

例如，若要將子網路限制在特定叢集：

```
aws ec2 create-tags --resources subnet-example \
  --tags Key=kubernetes.io/role/cni,Value=1 Key=cni.networking.k8s.aws/cluster/my-cluster,Value=shared
```

當多個 EKS 叢集共用 VPC 且您希望每個叢集針對 Pod IP 地址使用不同的子網路時，這會很有用。

## 建議的工作流程
<a name="cni-subnet-selection-workflow"></a>

若要為 Pod IP 地址新增子網路：

1. 在與節點相同的 VPC 和可用區域中建立新的子網路。

1. 使用 標記子網路`kubernetes.io/role/cni=1`。

1. 確保子網路具有適當的路由表和網路 ACLs。

1. 確認 VPC CNI 發現並開始使用新的子網路。

若要從 Pod IP 配置中移除子網路：

1. 使用 標記子網路`kubernetes.io/role/cni=0`。

1. 等待使用該子網路 IPs Pod 自然終止或重新排程。

1. 確認 VPC CNI 停止從該子網路中的 ENIs 配置新的 Pod IPs。

**重要**  
請勿移除`kubernetes.io/role/cni`標籤以停止使用子網路。移除標籤可防止建立新的 ENI，但**不會**將現有的 ENIs 從配置中排除。若要主動排除子網路，請使用 標記子網路`kubernetes.io/role/cni=0`。

## 考量事項
<a name="cni-subnet-selection-considerations"></a>
+ 增強型子網路探索需要 Amazon VPC CNI 1.18.0 版或更新版本。
+ 此功能需要 VPC CNI IAM 角色中的`ec2:DescribeSubnets`許可。`AmazonEKS_CNI_Policy` 受管政策包含此許可。IPv6 自我管理 IAM 政策**不包含**在內。如果您使用自我管理的 IAM 政策 （例如 IPv6 叢集），請`ec2:DescribeSubnets`手動新增 以啟用子網路探索。
+ 此功能適用於次要 IP 地址模式和字首委派模式。
+ 所有探索到的子網路都必須與節點位於相同的 VPC 中。
+ VPC CNI 只會在與節點位於相同可用區域的子網路中建立 ENIs。
+ 無論標籤變更為何，VPC CNI 都不會取消配置仍有指派給 Pod 之 IP 地址的 ENIs。
+ 使用共用 VPCs（跨帳戶子網路） 時，請在啟動叢集的參與者帳戶中標記子網路。
+ 您可以搭配 Pod、網路政策、字首委派和 SNAT 的安全群組使用增強型子網路探索。