

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

# Linux 的字首模式
<a name="prefix-mode-linux"></a>

**提示**  
 透過 Amazon EKS 研討會[探索](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)最佳實務。

Amazon VPC CNI 會將網路字首指派給 [Amazon EC2 網路介面](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-prefix-eni.html)，以增加節點可用的 IP 地址數量，並提高每個節點的 Pod 密度。您可以設定 Amazon VPC CNI 附加元件的 1.9.0 版或更新版本，以指派 IPv4 和 IPv6 CIDRs，而不是將個別次要 IP 地址指派給網路介面。

根據預設，IPv6 叢集上會啟用字首模式，並且是唯一支援的選項。VPC CNI 會將 /80 IPv6 字首指派給 ENI 上的插槽。如需詳細資訊，請參閱[本指南的 IPv6 一節](ipv6.md)。

使用字首指派模式時，每個執行個體類型的彈性網路介面數量上限保持不變，但您現在可以將 Amazon VPC CNI 設定為指派 /28 (16 個 IP 地址） IPv4 地址字首，而不是將個別 IPv4 地址指派給網路介面上的插槽。當 `ENABLE_PREFIX_DELEGATION` 設為 true VPC CNI 時，會從指派給 ENI 的字首將 IP 地址配置到 Pod。請遵循 [EKS 使用者指南](https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html)中提及的指示來啟用字首 IP 模式。

![兩個工作者子網路的圖解](http://docs.aws.amazon.com/zh_tw/eks/latest/best-practices/images/networking/pm_image.png)


您可以指派給網路介面的 IP 地址數量上限會因執行個體類型而異。指派給網路介面的每個字首都計為一個 IP 地址。例如，`c5.large` 執行個體每個網路介面的 IPv4 地址數量上限為 `10` 個。此執行個體的每個網路介面都具備主要 IPv4 地址。如果網路介面沒有次要 IPv4 地址，則最多可以為網路介面指派 9 個字首。為網路介面多指派一個 IPv4 地址，可為網路介面指派的字首數量便少一個。檢閱[每個執行個體類型每個網路介面 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)的 AWS EC2 文件[，並將字首指派給網路介面。](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-prefix-eni.html)

在工作者節點初始化期間，VPC CNI 會將一或多個字首指派給主要 ENI。CNI 透過維護暖集區來預先配置字首，以加快 Pod 啟動速度。您可以透過設定環境變數來控制暖集區中保留的字首數量。
+  `WARM_PREFIX_TARGET`，超過目前需求的要配置字首數目。
+  `WARM_IP_TARGET`，超過目前需求要配置的 IP 地址數量。
+  `MINIMUM_IP_TARGET`，隨時可用的 IP 地址數量下限。
+  `WARM_IP_TARGET` `MINIMUM_IP_TARGET` 如果設定 ， 和 會覆寫 `WARM_PREFIX_TARGET`。

由於現有 ENI 將請求更多 Pod 排程的額外字首。首先，VPC CNI 會嘗試將新的字首配置給現有的 ENI。如果 ENI 容量為 ，VPC CNI 會嘗試將新的 ENI 配置給節點。新的 ENIs將連接，直到達到 ENI 上限 （由執行個體類型定義）。連接新的 ENI 時，ipamd 會配置維護 `WARM_PREFIX_TARGET`、 `WARM_IP_TARGET`和 `MINIMUM_IP_TARGET`設定所需的一或多個字首。

![將 IP 指派給 Pod 的程序流程圖](http://docs.aws.amazon.com/zh_tw/eks/latest/best-practices/images/networking/pm_image-2.jpeg)


## 建議
<a name="_recommendations"></a>

### 在 時使用字首模式
<a name="_use_prefix_mode_when"></a>

如果您在工作者節點上遇到 Pod 密度問題，請使用字首模式。為了避免 VPC CNI 錯誤，建議您先檢查子網路是否有 /28 字首地址的連續區塊，再遷移至字首模式。如需[子網路保留詳細資訊，請參閱「使用子網路保留以避免子網路分段 (IPv4)](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-cidr-reservation.html)」一節。

為了回溯相容性，[最大 Pod ](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/misc/eni-max-pods.txt)限制設定為支援次要 IP 模式。若要增加 Pod 密度，請將 `max-pods`值指定為 Kubelet 和 `--use-max-pods=false`，做為節點的使用者資料。如需詳細資訊，請參閱《Amazon EKS 使用者指南》中的 [ maxPods的判斷方式](https://docs.aws.amazon.com/eks/latest/userguide/choosing-instance-type.html#max-pods-precedence)。如需使用者資料範例，請參閱 EKS [使用者指南](https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html)。

```
./max-pods-calculator.sh --instance-type m5.large --cni-version ``1.9``.0 --cni-prefix-delegation-enabled
```

字首指派模式特別適用於 [CNI 自訂聯網](https://docs.aws.amazon.com/eks/latest/userguide/cni-custom-network.html)的使用者，其中主要 ENI 不用於 Pod。透過字首指派，即使沒有用於 Pod 的主要 ENI，您仍然可以在幾乎每個 Nitro 執行個體類型上連接更多 IPs。

### 在 時避免字首模式
<a name="_avoid_prefix_mode_when"></a>

如果您的子網路片段很大，且可用 IP 地址不足以建立 /28 字首，請避免使用字首模式。如果產生字首的子網路分段 （具有分散次要 IP 地址的大量使用子網路），字首連接可能會失敗。建立新子網路並保留字首可避免此問題。

在字首模式中，指派給工作者節點的安全群組由 Pod 共用。如果您有安全需求，可透過對共用運算資源執行具有不同網路安全要求的應用程式來實現合規，請考慮使用 [Pod 的安全群組](sgpp.md)。

### 在相同的節點群組中使用類似的執行個體類型
<a name="_use_similar_instance_types_in_the_same_node_group"></a>

您的節點群組可能包含多種類型的執行個體。如果執行個體的 Pod 計數上限較低，則該值會套用至節點群組中的所有節點。請考慮在節點群組中使用類似的執行個體類型，以最大化節點使用量。如果您使用 Karpenter 進行自動節點擴展，我們建議您在佈建器 API 的要求部分中設定 [node.kubernetes.io/instance-type](https://karpenter.sh/docs/concepts/nodepools/)。

**警告**  
特定節點群組中所有節點的最大 Pod 計數是由節點群組中任何單一執行個體類型*的最低*最大 Pod 計數所定義。

### 設定 `WARM_PREFIX_TARGET`以保留 IPv4 地址
<a name="_configure_warm_prefix_target_to_conserve_ipv4_addresses"></a>

[安裝資訊清單的](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/config/v1.9/aws-k8s-cni.yaml#L158)預設值`WARM_PREFIX_TARGET`為 1。在大多數情況下， 的建議值 1 `WARM_PREFIX_TARGET`將提供快速 Pod 啟動時間的良好組合，同時將指派給執行個體的未使用 IP 地址降至最低。

如果您需要進一步保留每個節點的 IPv4 地址使用`WARM_IP_TARGET`和`MINIMUM_IP_TARGET`設定，這會在設定`WARM_PREFIX_TARGET`時覆寫。透過`WARM_IP_TARGET`將 設定為小於 16 的值，您可以防止 CNI 保持連接整個多餘的字首。

### 偏好配置新的字首而非連接新的 ENI
<a name="_prefer_allocating_new_prefixes_over_attaching_a_new_eni"></a>

將額外的字首配置到現有的 ENI 比建立新的 ENI 並連接到執行個體更快的 EC2 API 操作。使用字首可改善效能，同時使用 IPv4 地址配置來保持原始狀態。連接字首通常會在一秒內完成，而連接新的 ENI 最多可能需要 10 秒。對於大多數使用案例，在字首模式下執行時，CNI 只需要每個工作者節點單一 ENI。如果您能夠負擔 （在最壞的情況下） 每個節點最多 15 IPs，我們強烈建議使用較新的字首指派聯網模式，並實現其隨附的效能和效率增益。

### 使用子網路預留來避免子網路分段 (IPv4)
<a name="_use_subnet_reservations_to_avoid_subnet_fragmentation_ipv4"></a>

當 EC2 將 /28 IPv4 字首配置給 ENI 時，它必須是來自子網路的連續 IP 地址區塊。如果產生字首的子網路是分段的 （具有分散次要 IP 地址的高度使用子網路），字首連接可能會失敗，而且您會在 VPC CNI 日誌中看到下列錯誤訊息：

```
failed to allocate a private IP/Prefix address: InsufficientCidrBlocks: There are not enough free cidr blocks in the specified subnet to satisfy the request.
```

為了避免分段並有足夠的連續空間來建立字首，您可以使用 [VPC 子網路 CIDR 保留](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-cidr-reservation.html#work-with-subnet-cidr-reservations)來保留子網路內的 IP 空間，以供字首使用。建立保留後，VPC CNI 外掛程式會呼叫 EC2 APIs，以指派從保留空間自動配置的字首。

建議建立新的子網路、為字首預留空間，並為在該子網路中執行的工作者節點使用 VPC CNI 啟用字首指派。如果新的子網路專用於已啟用 VPC CNI 字首指派的 EKS 叢集中執行的 Pod，則可以略過字首保留步驟。

### 避免降級 VPC CNI
<a name="_avoid_downgrading_vpc_cni"></a>

字首模式適用於 VPC CNI 1.9.0 版及更新版本。啟用字首模式並將字首指派給 ENIs版本。如果您決定降級 VPC CNI，您必須刪除並重新建立節點。

### 在轉換為字首委派期間取代所有節點
<a name="_replace_all_nodes_during_the_transition_to_prefix_delegation"></a>

強烈建議您建立新的節點群組，以增加可用 IP 地址的數量，而不是輪流取代現有的工作者節點。封鎖並耗盡所有現有的節點，以安全地移出所有現有的 Pod。為了防止服務中斷，我們建議您在關鍵工作負載的生產叢集上實作 [Pod 中斷預算](https://kubernetes.io/docs/tasks/run-application/configure-pdb)。新節點上的 Pod 將從指派給 ENI 的字首指派 IP。確認 Pod 正在執行後，您可以刪除舊節點和節點群組。如果您使用的是受管節點群組，請依照此處提及的步驟安全地[刪除節點群組](https://docs.aws.amazon.com/eks/latest/userguide/delete-managed-node-group.html)。