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

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

增加 Amazon EKS 節點的可用 IP 地址

您可以增加節點可指派的 IP 地址數目 Pods 透過指派 IP 字首,而不是將個別次要 IP 地址指派給節點。

開始程序之前,請先完成下列各項:

  • 檢閱考量事項。

  • 您需要現有的叢集。若要部署叢集,請參閱 建立 Amazon EKS 叢集

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

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

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

  • 若要將 IP 字首指派給節點,您的節點必須是 AWS Nitro 型。非 Nitro 型的執行個體會繼續配置個別次要 IP 地址,但要指派給的 IP 地址數量明顯較低 Pods 相較於 Nitro-based 執行個體執行。

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

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

    如果您的叢集針對 IPv6 系列設定,則必須安裝附加元件的版本 1.10.1。如果您的外掛程式版本早於所需版本,則必須對其進行更新。如需詳細資訊,請參閱使用 Amazon IPs 將 VPC 指派給 Pod 的更新章節CNI

  • 對於具有 的叢集 Windows 僅限節點

    • 您的叢集及其平台版本必須與下表中的版本相同或為更新版本。若要升級叢集版本,請參閱 將現有叢集更新至新的 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 已啟用叢集的 支援。如需詳細資訊,請參閱在 EKS 叢集上部署 Windows 節點

      1. 設定叢集以將 IP 地址字首指派給節點。完成標籤中與您節點作業系統相符的程序。

        Linux
        1. 啟用 參數,將字首指派給 Amazon VPC 的網路介面 CNI DaemonSet。 當您部署 1.21或更新版本的叢集時, 1.10.1Amazon VPC CNI plugin for Kubernetes 附加元件會與其一起部署。如果您使用 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 CIDR 使用者指南中的子網路 Word 保留。 VPC... 如果您計劃在沒有啟動範本的情況下部署受管節點群組,或使用您尚未在其中指定 AMI ID 的啟動範本,而且您正在使用 的 版本 Amazon VPC CNI plugin for Kubernetes 等於或晚於先決條件中列出的版本,然後跳至下一個步驟。受管節點群組會自動計算最大數量 Pods 為您。

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

+ IMPORTANT:受管節點群組會強制執行 值的最大值maxPods。對於 30 vCPUs 以下的執行個體,最大數量為 110,而對於所有其他執行個體,最大數量為 250。無論是否啟用字首委派,都會套用此數量上限。... 如果您使用的是為 設定的 1.21或更新版本叢集IPv6,請跳至下一個步驟。

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

+ 您可以取代 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
  1. 使用至少一種 Amazon EC2 Nitro Amazon Linux 2 執行個體類型,建立下列其中一個節點群組類型。如需 Nitro 執行個體類型的清單,請參閱 Amazon Word 使用者指南中的在 Nitro 系統上建置的執行個體。 EC2不支援此功能 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,或AMI建立在 Amazon EKS 最佳化 AMI 上的自訂 Word,然後使用啟動範本部署節點群組,並在啟動範本中提供下列使用者資料。此使用者資料會將引數傳遞至 bootstrap.sh 檔案。如需有關引導檔案的詳細資訊,請參閱 上的 https://bootstrap.sh GitHub.

        /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 從與執行個體不同的子網路,然後您需要在此步驟中啟用 功能。如需詳細資訊,請參閱部署 pods 使用自訂聯網的替代子網路

        Windows
  2. 啟用 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 CIDR 使用者指南中的子網路 Word 保留。 VPC... (選用) 指定其他組態,以控制叢集的擴展前和動態擴展行為。如需詳細資訊,請參閱 Windows onWord 上具有字首委派模式的組態選項。 GitHub

+ ... 。 開啟 amazon-vpc-cniConfigMap進行編輯。

+

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

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

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

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

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

      +

      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
      1. 描述其中一個節點,判斷該節點的 max-pods 值以及可用 IP 地址的數量。Replace (取代) 192.168.30.193 IPv4 地址為上一個輸出中傳回的其中一個節點名稱。

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

        範例輸出如下。

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

        在上一個輸出中, 110是 Pods that Kubernetes 將部署到節點,即使 144 IP 地址可用。