View a markdown version of this page

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

協助改進此頁面

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

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

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

增加 Amazon EKS 節點的可用 IP 位址數量

您可以透過指派 IP 字首 (而不是將個別的次要 IP 位址指派給節點),大幅增加節點可指派給 Pod 的 IP 位址數量。

先決條件

  • 您需要現有的叢集。若要部署叢集,請參閱 建立 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 位址,但要指派給 Pod 的 IP 位址數量遠低於 Nitro 型執行個體。

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

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

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

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

將 IP 位址字首指派給節點

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

Linux

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

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

    即使子網路有可用的 IP 位址,如果子網路沒有任何可用的連續 /28 區塊,您也會在 Kubernetes 專用 Amazon VPC CNI 外掛程式日誌中看到下列錯誤。

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

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

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

    如果您要使用已在其中指定 AMI ID 的啟動範本來部署自我管理節點群組或受管節點群組,則必須設定節點的 Pod 數目上限。如需如何判斷適當值的詳細資訊,請參閱 maxPods的判斷方式

    重要

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

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

    在下列其中一個選項中指定參數。要判斷哪個選項適合您,以及提供哪個值,請參閱 GitHub 上的 WARM_PREFIX_TARGET、WARM_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 2023 執行個體類型,建立下列其中一個節點群組類型。如需 Nitro 執行個體類型的清單,請參閱《Amazon EC2 使用者指南》中的建置在 Nitro 系統上的執行個體。Windows 不支援這項功能。對於包含 110 的選項,使用步驟 3 的值 (建議) 或您自己的值將其取代。

    • 自我管理 – 使用建立自我管理的 Amazon Linux 節點中的指示來部署節點群組。建立 CloudFormation 堆疊之前,請開啟範本檔案,並將 UserData中的 調整NodeLaunchTemplate為如下

      ... apiVersion: node.eks.aws/v1alpha1 kind: NodeConfig spec: cluster: name: ${ClusterName} apiServerEndpoint: ${ApiServerEndpoint} certificateAuthority: ${CertificateAuthorityData} cidr: ${ServiceCidr} kubelet: config: maxPods: 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,然後使用啟動範本部署節點群組,並在啟動範本中提供下列使用者資料。此使用者資料會傳遞NodeConfig物件,以供節點上的nodeadm工具讀取。如需 的詳細資訊nodeadm,請參閱 nodeadm 文件

        MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="//" --// Content-Type: application/node.eks.aws --- apiVersion: node.eks.aws/v1alpha1 kind: NodeConfig spec: cluster: apiServerEndpoint: [.replaceable]`my-cluster` certificateAuthority: [.replaceable]`LS0t...` cidr: [.replaceable]`10.100.0.0/16` name: [.replaceable]`my-cluster kubelet: config: maxPods: [.replaceable]`110` --//--

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

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

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

    注意

    如果您還想要將 IP 位址指派給來自與執行個體不同子網路的 Pod,則需要在此步驟中啟用該功能。如需詳細資訊,請參閱使用自訂聯網在替代子網路中部署 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 區塊,您也會在 Kubernetes 專用 Amazon VPC CNI 外掛程式日誌中看到下列錯誤。

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

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

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

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

      kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
    2. 將範例值取代為大於零的值,並將您需要的項目新增至 的 data區段ConfigMap。如果您為 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 EC2 使用者指南》中的建置在 Nitro 系統上的執行個體。依預設,您最多可將 110 個 Pod 部署到節點。如果您要增加或減少該數量,請在引導組態的使用者資料中指定以下內容:將 max-pods-quantity 取代為您的 max Pod 值。

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

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

確定最大 Pod 和可用的 IP 位址

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

    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
  2. 描述其中一個節點,判斷該節點的 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 將部署至節點的 Pod 數量上限,即使有 144 個可用的 IP 位址。