如何選擇要用於 Amazon EKS 叢集中 Pod 的特定 IP 子網路?

3 分的閱讀內容
0

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中為我的 Pod 使用自訂子網路或 IP 範圍。

簡短描述

有時 Pod 不會使用 Amazon EKS 叢集中的所有可用子網路。當某些節點子網路沒有可用的 IP 地址,但 Amazon Virtual Private Cloud (Amazon VPC) 中的其他子網路仍未充分利用時,就會發生這種情況。

Amazon EKS 中的節點和 Pod 使用來自相同地址空間的 IP 地址:與叢集 VPC 相關聯的 IP CIDR 範圍。具體而言,Amazon EKS 會從排定 Pod 之工作節點的相同子網路為 Pod 指派 IP。

例如,假設在子網路-1 中啟動節點-1。也就是說,節點的主要彈性網路介面位於子網路-1 中。稍後,Pod-A 可能會部署並排定為節點-1。根據預設,Amazon VPC CNI 外掛程式會在子網路-1 中分配次要彈性網路介面和 IP,以將 IP 地址指派給 Pod-A。

因此,使用者無法直接控制 Pod 到 IP 子網路的自訂分配,因為 Pod 和節點使用相同的子網路。如果節點有足夠的運算容量來執行多個 Pod,則 Pod 可能會使用節點子網路中的所有可用 IP 地址。由於節點子網路中的 IP 地址已耗盡,因此新 Pod 無法執行。即使 Amazon VPC 中的其他子網路可能具有可用的 IP 地址,也會發生這種情況。

解決方案

您可以使用 Amazon VPC CNI 的自訂聯網元件來修正此問題。此功能可讓您定義 Amazon VPC 叢集中的特定子網路,以供 Pod 使用。其區分您的子網路與工作節點所使用的子網路。還有一項額外優勢是,您可以為 Pod 定義安全群組。請參閱教學:自訂聯網,進一步瞭解自訂聯網使用案例的詳細資訊。

先決條件

在開始之前,請執行以下事項:

最佳實務是確保您的叢集中有執行最新版本的 Amazon VPC CNI 外掛程式。請執行下列命令以驗證 Amazon VPC 叢集中的版本:

kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

**注意:**如需最佳使用版本的詳細資訊,請參閱更新適用於自我管理之附加元件的 Amazon VPC CNI 外掛程式

設定您的自訂子網路和 IP 範圍

請依照下列步驟使用 Amazon VPC CNI 自訂聯網功能:

1.    開啟 Amazon VPC CNI 自訂聯網功能:

kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true

2.    建立 ENIConfig 物件以定義供 Pod 使用的子網路和安全群組。

ENIConfig 物件會定義一個子網路和安全群組清單。當僅使用一個 ENIConfig 物件註釋或標記節點時,排定至該節點的所有 Pod 都會使用該 ENIConfig 物件中定義的子網路和安全群組。

您可以自動或手動將 ENIConfig 物件與節點建立關聯。

自動將 ENIConfig 物件與節點建立關聯

此選項僅允許每個可用區域 (AZ) 一個 ENIConfig 物件 (一個子網路)。ENIConfig 名稱必須是 AZ 的名稱。

1.    建立具有 AZ 名稱的 ENIConfig 物件:

cat <<EOF  | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-XXXXXXXX
EOF


cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: us-east-2b
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-YYYYYYYYY
EOF

2.    啟用 Amazon VPC-CNI 能夠使用與節點 AZ 相符的 ENIConfig 物件自動標記節點。

kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone

手動將 ENIConfig 物件與節點建立關聯

此選項允許每個可用區域多個 ENIConfig 物件。請注意,您可以為每個 ENIConfig 物件使用自訂名稱。請確定節點和相關聯的 ENIConfig 物件位於相同的可用區域中。

**注意:**您僅能使用一個 ENIConfig 物件註釋一個節點,但是您可以使用相同的 ENIConfig 物件註釋多個節點。

1.    使用自訂名稱建立 ENIConfig 物件,如下所示:

cat <<EOF  | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: my-conf-1-us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-XXXXXXXX
EOF


cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: my-conf-2-us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-ZZZZZZZZZZ
EOF

2.    使用 ENIConfig 物件手動註釋節點。請確定節點和相關聯的 ENIConfig 物件中的子網路位於相同的可用區域中。

kubectl annotate node ip-192-168-0-126.us-east-2.compute.internal k8s.amazonaws.com/eniConfig=my-conf-1-us-east-2a

此手動註釋的優先順序高於 Amazon VPC CNI 自動新增的標記。

啟動新節點以取代目前的工作節點

在 Amazon VPC CNI 中開啟自訂聯網功能前,現有的工作節點可能具有來自節點子網路的次要彈性網路介面和 IP。因此,您必須啟動新節點,以便其可以從與節點相關聯的 ENIConfig 物件中定義的子網路分配次要彈性網路介面和 IP

1.    請確認您是否正在使用下列任一節點群組選項:

  • 自我管理的節點群組
  • 具有自訂 AMI ID 的受管節點群組

**注意:**如果您要在這些節點群組類型中建立節點,請繼續執行步驟 2 以手動定義節點的 Pod 數目上限。如果您在受管節點群組中啟動節點而未指定自訂 AMI,則 Amazon EKS 會自動更新節點的 Pod 數目上限。請參閱受管節點群組,進一步瞭解詳細資訊。

2.    決定每個節點的 Pod 數目上限。使用自訂聯網時,節點的主要網路介面不會用於 Pod IP。若要使用最大 Pod 計算器指令碼決定 Pod 值上限,請參閱 Amazon EKS 針對每個 EC2 執行個體類型建議的最大 Pod

**注意:**搭配上述指令碼使用 cni-custom-networking-enabled 標記,在您自己執行個體以外的子網路中啟動 Pod。

3.    更新新節點上的使用者資料指令碼,以包含必要的標記。例如:

#!/bin/bash
/etc/eks/bootstrap.sh my_cluster_name --use-max-pods false --kubelet-extra-args '--max-pods=20'

**注意:**將 my_cluster_name 取代為您的 EKS 叢集名稱。如需有關 Bootstrap 功能的詳細資訊,請參閱 GitHub 網站上的 awslabs/amazon-eks-ami

4.    重新建立 Pod 以使用新的 Pod 自訂聯網組態。

其他考量

  • 依預設,從 Pod 到叢集 VPC CIDR 外部 IP 地址的流量會使用節點的主要介面和 IP 地址。因此,此流量不會使用 ENIConfig 中定義的子網路和安全群組。而是使用節點主要網路介面的安全群組和子網路。請參閱 適用於 Pod 的 SNAT,進一步瞭解詳細資訊。
  • 如果您也為 Pod 使用安全群組,則會使用安全群組政策中指定的安全群組,而不會使用 ENIConfig 物件中指定的安全群組**。**
  • 請參閱簡化 CNI 自訂聯網,進一步瞭解 GitHub 網站上的最新更新。
  • 若要在 VPC 中新增更多 IP CIDR 範圍,請按照如何在 Amazon EKS 中使用多個 CIDR 範圍?中的步驟進行操作

AWS 官方
AWS 官方已更新 1 年前