增加 Amazon EC2 節點的可用 IP 地址數量 - Amazon EKS

協助改善此頁面

想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。

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

增加 Amazon EC2 節點的可用 IP 地址數量

每個 Amazon EC2 執行個體都支援最大數量的彈性網路介面,以及可指派給每個網路介面的最大數量的 IP 地址。每個節點的每個網路介面都需要一個 IP 地址。所有其他可用的 IP 地址都可以指派給 Pods。每個 Pod 都需要專屬的 IP 地址。因此,您的節點可能具有可用的運算和記憶體資源,但無法容納其他 Pods,因為節點已耗盡要指派給 Pods 的 IP 地址。

本主題旨在介紹如何透過指派 IP 字首 (而不是將個別的次要 IP 地址指派給節點),大幅增加節點可指派給 Pods 的 IP 地址數量。每個字首都包含多個 IP 地址。如果您未針對 IP 字首指派設定叢集,則叢集必須進行更多 Amazon EC2 應用程式介面 (API) 呼叫,才能設定 Pod 連線所需的網路介面和 IP 地址。隨著叢集規模不斷擴大,這些 API 呼叫的頻率可能會導致 Pod 和執行個體的啟動時間變得更長。這樣一來,會導致擴展延遲以滿足大型和高峰工作負載的需求,並增加成本和管理負荷,因為您需要佈建額外的叢集和 VPC 以符合擴展需求。如需詳細資訊,請參閱上的Kubernetes延展性閾值 GitHub。

考量事項
  • 每種 Amazon EC2 執行個體類型都支援最大數量的 Pods。如果受管節點群組包含多個執行個體類型,叢集中執行個體的最小 Pods 數量上限會套用至叢集中的所有節點。

  • 依預設,您最多可在節點上執行 110 個 Pods,但您可以變更該數量。如果您變更該數量且擁有現有受管節點群組,則節點群組的下一個 AMI 或啟動範本更新會導致新的工作節點出現變更後的值。

  • 從指派 IP 地址轉換為指派 IP 字首時,建議您建立新的節點群組來增加可用 IP 地址的數量,而不是對現有節點執行輪流取代。在同時指派 IP 地址和字首的節點上執行 Pods,可能會導致公告的 IP 地址容量不一致,進而影響節點日後的工作負載。如需執行轉換的建議方式,請參閱《Amazon EKS 最佳實務指南》中的在次要 IP 模式與字首委派模式相互遷移期間取代所有節點

  • 僅適用於具有 Linux 節點的叢集。

    • 設定附加元件以將字首指派給網路介面後,如果不移除叢集中所有節點群組中的所有節點,您就無法將 Amazon VPC CNI plugin for Kubernetes 附加元件降級為低於 1.9.0 (或 1.10.1) 的版本。

    • 如果您也使用 Pods 的安全群組,且 POD_SECURITY_GROUP_ENFORCING_MODE = standardAWS_VPC_K8S_CNI_EXTERNALSNAT = false,則當 Pods 與 VPC 外部端點通訊時,將使用節點的安全群組,而不會使用您指派給 Pods 的任何安全群組。

      如果您也使用 Pods 的安全群組,且 POD_SECURITY_GROUP_ENFORCING_MODE = strict,則當 Pods 與 VPC 外部端點通訊時,將使用 Pod's 安全群組。

必要條件
  • 現有的叢集。若要部署叢集,請參閱 建立 Amazon EKS 叢集

  • Amazon EKS 節點所在的子網路必須具有足夠的連續 /28 (針對 IPv4 叢集) 或 /80 (針對 IPv6 叢集) 無類別域間路由 (CIDR) 區塊。IPv6 叢集中只能包含 Linux 節點。如果 IP 地址分散在子網路 CIDR 中,則使用 IP 字首可能會失敗。建議您進行下列動作:

    • 使用子網路 CIDR 保留,如此一來,即使保留範圍內的任何 IP 地址仍在使用中,發佈後也不會重新指派 IP 地址。此舉可確保字首無需分割,即可用於配置。

    • 使用專門用於執行指派 IP 字首之工作負載的新子網路。指派 IP 字首時,Windows 和 Linux 工作負載可在同一子網路中同時執行。

  • 若要將 IP 前置詞指派給節點,您的節點必須是以 AWS Nitro 為基礎。非 Nitro 型執行個體會繼續分配個別的次要 IP 地址,但要指派給 Pods 的 IP 地址數量遠低於 Nitro-based 執行個體。

  • 僅適用於具有 Linux 節點的叢集:如果您的叢集針對 IPv4 系列設定,則必須安裝 Amazon VPC CNI plugin for Kubernetes 附加元件的版本 1.9.0 或更新版本。您可以使用下列命令來檢查目前版本:

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

    如果您的叢集針對 IPv6 系列設定,則必須安裝附加元件的版本 1.10.1。如果您的外掛程式版本早於所需版本,則必須對其進行更新。如需詳細資訊,請參閱更新的 使用 Amazon VPC CNI plugin for Kubernetes Amazon EKS 附加元件 區段。

  • 僅適用於具有 Windows 節點的叢集

    • 您的叢集及其平台版本必須與下表中的版本相同或為更新版本。若要升級叢集版本,請參閱 更新 Amazon EKS 叢集 Kubernetes 版本。如果叢集並非最低平台版本,則在 Amazon EKS 更新平台版本之前,您無法將 IP 字首指派給節點。

      Kubernetes 版本 平台版本
      1.27 eks.3
      1.26 eks.4
      1.25 eks.5

      若要檢查目前的 Kubernetes 和平台版本,您可以使用叢集名稱取代以下命令中的 my-cluster,然後執行修改後的命令:aws eks describe-cluster --name my-cluster --query 'cluster.{"Kubernetes Version": version, "Platform Version": platformVersion}'

    • 已為叢集啟用 Windows 支援。如需詳細資訊,請參閱 為您的 Amazon EKS 叢集啟用 Windows 支援

若要增加 Amazon EC2 節點的可用 IP 地址數量
  1. 設定叢集以將 IP 地址字首指派給節點。完成與節點作業系統相符的索引標籤上的步驟。

    Linux
    1. 啟用參數以為 Amazon VPC CNI DaemonSet 的網路介面指派字首。當您部署 1.21 或更高版本的叢集時,Amazon VPC CNI plugin for Kubernetes 附加元件的版本 1.10.1 或更高版本將與其一起部署。如果您使用 IPv6 系列建立叢集,則此設定會預設設為 true。如果您使用 IPv4 系列建立叢集,則此設定會預設設為 false

      kubectl set env daemonset aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true
      重要

      即使子網路有可用的 IP 地址,如果子網路沒有任何可用的連續 /28 區塊,您也會在 Amazon VPC CNI plugin for Kubernetes 日誌中看到下列錯誤:

      InsufficientCidrBlocks: The specified subnet does not have enough free cidr blocks to satisfy the request

      這可能是由分散在子網路上的現有次要 IP 地址的分段造成。若要解決此錯誤,請建立新的子網並在該處啟動 Pods,或使用 Amazon EC2 子網 CIDR 保留來保留子網內的空間,以便與字首指派搭配使用。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的子網路 CIDR 保留

    2. 如果計劃在沒有啟動範本的情況下或使用未在其中指定 AMI ID 的啟動範本來部署受管節點群組,且您使用的是先決條件中列出的 Amazon VPC CNI plugin for Kubernetes 版本或更新版本,則請跳至下一個步驟。受管節點群組會自動為您計算 Pods 的數量上限。

      如果要部署的是自我管理節點群組,或使用其中具有指定 AMI ID 的啟動範本來部署受管節點群組,則必須決定 Amazon EKS 為節點建議的 Pods 數量上限。請遵循 Amazon EKS 為每種 Amazon EC2 執行個體類型建議 Pods 數量上限 中的指示,將 --cni-prefix-delegation-enabled 新增至步驟 3。請記下輸出,以便在稍後步驟中使用。

      重要

      受管節點群組會強制對 maxPods 的值執行數量上限。對於少於 30 個 vCPU 的執行個體,數量上限為 110;對於所有其他執行個體,數量上限為 250。無論是否啟用字首委派,都會套用此數量上限。

    3. 如果您使用針對 IPv6 設定 1.21 或更新版本叢集,請跳到下一個步驟。

      在下列其中一個選項中指定參數。若要判斷哪個選項適合您,以及為其提供哪些價值,請參閱 GitHub 上的 WARM_PREFIX_TARGETWARM_IP_TARGET 以及 MINIMUM_IP_TARGET

      您可以用大於零的值取代 example values

      • WARM_PREFIX_TARGET

        kubectl set env ds aws-node -n kube-system WARM_PREFIX_TARGET=1
      • WARM_IP_TARGETMINIMUM_IP_TARGET:如果此值已設定,則其會覆寫為 WARM_PREFIX_TARGET 設定的任何值。

        kubectl set env ds aws-node -n kube-system WARM_IP_TARGET=5
        kubectl set env ds aws-node -n kube-system MINIMUM_IP_TARGET=2
    4. 使用至少一個 Amazon EC2 Nitro Amazon Linux 2 執行個體類型,建立下列類型的節點群組之一。如需 Nitro 執行個體類型的清單,請參閱 Amazon EC2 使用者指南中的在 Nitro 系統上建置的執行個體。Windows 不支援這項功能。對於包含 110 的選項,使用步驟 3 的值 (建議) 或您自己的值將其取代。

      • 自我管理:使用 啟動自我管理的 Amazon Linux 節點 中的指示部署節點群組。指定BootstrapArguments參數的下列文字。

        --use-max-pods false --kubelet-extra-args '--max-pods=110'

        如果使用 eksctl 來建立節點群組,便可使用以下命令。

        eksctl create nodegroup --cluster my-cluster --managed=false --max-pods-per-node 110
      • 受管:使用下列其中一個選項,部署節點群組:

        • 沒有啟動範本,或有啟動範本,但沒有指定 AMI ID:完成 建立受管節點群組 中的程序。受管節點群組會自動為您計算 Amazon EKS 建議的 max-pods 值。

        • 使用具有指定 AMI ID 的啟動範本:在啟動範本中,指定 Amazon EKS 最佳化 AMI ID 或基於 Amazon EKS 最佳化 AMI 的自訂 AMI,然後使用啟動範本部署節點群組,並在啟動範本中提供下列使用者資料。此使用者資料會將引數傳遞至 bootstrap.sh 檔案。如需引導檔案的詳細資訊,請參閱 GitHub 上的 bootstrap.sh

          /etc/eks/bootstrap.sh my-cluster \ --use-max-pods false \ --kubelet-extra-args '--max-pods=110'

          如果使用 eksctl 來建立節點群組,便可使用以下命令。

          eksctl create nodegroup --cluster my-cluster --max-pods-per-node 110

          如果您建立的自訂 AMI 並非基於 Amazon EKS 最佳化 AMI,則需要自行自訂建立組態。

        注意

        如果您還想要將 IP 地址指派給來自與執行個體不同子網的 Pods,則需要在此步驟中啟用該功能。如需詳細資訊,請參閱 Pod 的自訂聯網

    Windows
    1. 啟用 IP 字首指派。

      1. 開啟 amazon-vpc-cni ConfigMap 進行編輯。

        kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
      2. 將下行新增至 data 區段:

        enable-windows-prefix-delegation: "true"
      3. 儲存檔案並關閉編輯器。

      4. 確認行已新增至 ConfigMap

        kubectl get configmap -n kube-system amazon-vpc-cni -o "jsonpath={.data.enable-windows-prefix-delegation}"

        如果傳回的輸出不是 true,則可能會出現錯誤。請嘗試再次完成該步驟。

        重要

        即使子網路有可用的 IP 地址,如果子網路沒有任何可用的連續 /28 區塊,您也會在節點事件中看到下列錯誤:

        "failed to allocate a private IP/Prefix address: InsufficientCidrBlocks: The specified subnet does not have enough free cidr blocks to satisfy the request"

        這可能是由分散在子網路上的現有次要 IP 地址的分段造成。若要解決此錯誤,請建立新的子網並在該處啟動 Pods,或使用 Amazon EC2 子網 CIDR 保留來保留子網內的空間,以便與字首指派搭配使用。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的子網路 CIDR 保留

    2. (選用) 指定其他組態來控制叢集的預先擴展和動態擴展行為。如需詳細資訊,請參閱開啟前置碼委派模式的Windows組態選項 GitHub。

      1. 開啟 amazon-vpc-cni ConfigMap 進行編輯。

        kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
      2. 使用大於零的值取代 example values,再將所需項目新增至 ConfigMapdata 區段。如果您為 warm-ip-targetminimum-ip-target 設定了值,則該值會覆寫任何為 warm-prefix-target 設定的值。

        warm-prefix-target: "1" warm-ip-target: "5" minimum-ip-target: "2"
      3. 儲存檔案並關閉編輯器。

    3. 建立 Windows 節點群組,其中至少包含一個 Amazon EC2 Nitro 執行個體類型。Nitro如需執行個體類型的清單,請參閱 Amazon Amazon EC2 使用者指南中的在Nitro系統上建置的執行個體。依預設,您最多可將 110 個 Pods 部署到節點。如果您要增加或減少該數量,請在引導組態的使用者資料中指定以下內容:使用 Pod 最大值取代 max-pods-quantity

      -KubeletExtraArgs '--max-pods=max-pods-quantity'

      如果您要部署受管節點群組,則需要在啟動範本中新增此組態。如需詳細資訊,請參閱 使用啟動範本自訂受管節點。如需有關 Windows 引導指令碼組態參數的詳細資訊,請參閱 引導指令碼組態參數

  2. 部署您的節點後,請檢視叢集中的節點。

    kubectl get nodes

    範例輸出如下。

    NAME STATUS ROLES AGE VERSION ip-192-168-22-103.region-code.compute.internal Ready <none> 19m v1.XX.X-eks-6b7464 ip-192-168-97-94.region-code.compute.internal Ready <none> 19m v1.XX.X-eks-6b7464
  3. 描述其中一個節點,判斷該節點的 max-pods 值以及可用 IP 地址的數量。使用上一個輸出中傳回的其中一個節點名稱中的 IPv4 地址取代 192.168.30.193

    kubectl describe node ip-192-168-30-193.region-code.compute.internal | grep 'pods\|PrivateIPv4Address'

    範例輸出如下。

    pods:                                  110
    vpc.amazonaws.com/PrivateIPv4Address:  144

    在先前的輸出中,110 是 Kubernetes 將部署至節點的 Pods 數量上限,即使有 144 個可用的 IP 地址。