Amazon EKS ノードで使用可能な IP アドレスを増やす - Amazon EKS

Amazon EKS ノードで使用可能な IP アドレスを増やす

個別のセカンダリ IP アドレスではなく、IP プレフィックスをノードに割り当てて、ノードでPodsに割り当て可能な IP アドレスの数を増やす方法について説明します。

この手順を開始する前に以下を完了してください。

  • 考慮事項を確認します。

  • 既存のクラスターが必要です。デプロイするには、「Amazon EKS クラスターを作成します。」を参照してください。

  • Amazon EKS ノードが配置されているサブネットでは、/28 個の連続ブロック (IPv4 クラスターの場合)、または /80 個の Classless Inter-Domain Routing (CIDR) ブロック (IPv6 クラスターの場合) が十分な数として必要になります。IPv6 クラスターに含めることができるのは Linux ノードだけです。IP アドレスがサブネット CIDR 全体に分散している場合、IP プレフィックスを使用すると失敗する可能性があります。次のことを推奨します。

    • サブネット CIDR 予約を使用すると、予約された範囲内の IP アドレスがまだ使用されている場合でも、解放時に IP アドレスが再割り当てされません。これにより、セグメンテーションなしでプレフィックスを割り当てることができます。

    • IP プレフィックスが割り当てられているワークロードの実行に特に使用される新しいサブネットを使用してください。IP プレフィックスを割り当てると、Windows と Linux 両方のワークロードを同じサブネットで実行できます。

  • ノードに IP プレフィックスを割り当てるには、ノードが AWS Nitro ベースである必要があります。Nitro ベースではないインスタンスでは、引き続き個別のセカンダリ IP アドレスが割り当てられますが、Pods に割り当てることのできる IP アドレスの数は 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 VPC CNI を使用してポッドに IP を割り当てる」の更新セクションを参照してください。

  • 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 クラスターに WiWindows ノードをデプロイする」を参照してください。

      1. ノードに IP アドレスプレフィックスを割り当てるようにクラスターを設定します。ノードのオペレーティングシステムに対応するタブで手順を完了します。

        Linux
        1. パラメータを有効にして、Amazon VPC CNI DaemonSet のネットワークインターフェイスにプレフィックスを割り当てます。1.21 以降のクラスターをデプロイすると、バージョン 1.10.1 以降の Amazon 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 VPC ユーザーガイドの「サブネット CIDR の予約」を参照してください。前提条件のリストに記載されたバージョン以降の Amazon VPC CNI plugin for Kubernetes を使用しながら、起動テンプレートなしでマネージドノードグループをデプロイする場合、または AMI ID を指定していない起動テンプレートを使用してデプロイする場合には、このまま次のステップに進みます。マネージド型ノードグループが、Pods の最大数を自動的に計算します。

+ AMI ID を指定した起動テンプレートを使用して、セルフマネージド型ノードグループまたはマネージド型ノードグループをデプロイする場合は、Amazon EKS でノードのために推奨される Pods の最大数を特定する必要があります。「各 Amazon EC2 インスタンスタイプの Amazon EKS の推奨最大ポッド数」の指示に従い、ステップ 3 に --cni-prefix-delegation-enabled を追加します。後のステップで使用するために、出力に注意してください。

+ 重要:マネージド型ノードグループは、maxPods の値に最大数を適用します。vCPUs が 30 未満のインスタンスの場合、最大数は 110 で、その他すべてのインスタンスの最大数は 250 です。この最大数は、プレフィックス委任が有効かどうかにかかわらず適用されます。IPv6 用に設定された 1.21 以降のクラスターを使用している場合は、このまま次のステップに進みます。

+ 以下のオプションの内の 1 つでパラメータを指定します。どのオプションが適切で、どの値を提供するかを決定するには、「GitHub」の「WARM_PREFIX_TARGET、WARM_IP_TARGET、および MINIMUM_IP_TARGET」を参照してください。

+ サンプル値は、ゼロより大きい値で置き換えます。

+ ** WARM_PREFIX_TARGET

+

kubectl set env ds aws-node -n kube-system WARM_PREFIX_TARGET=1
  • WARM_IP_TARGET または MINIMUM_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. 少なくとも 1 つの Amazon EC2 Nitro Amazon Linux 2 インスタンスタイプを使用して、次のいずれかのタイプのノードグループを作成します。Nitro インスタンスタイプのリストについては、「Amazon EC2 ユーザーガイド」の「Instances built on the Nitro System」を参照してください。この機能は 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

        Amazon EKS 最適化 AMI から構築されていないカスタム AMI を作成した場合は、自分で設定をカスタム作成する必要があります。

        注記

        また、インスタンスとは異なるサブネットの Pods に IP アドレスを割り当てる場合は、このステップで機能を有効化する必要があります。詳細については、「カスタムネットワーキングを使用して代替サブネットに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 VPC ユーザーガイドの「サブネット CIDR の予約」を参照してください。(オプション) クラスターの事前スケーリング動作と動的スケーリング動作を制御するための追加設定を指定します。詳細については、「GitHub」の「 Windows でのプレフィックス委任モードの設定オプション」を参照してください。

+ 編集する amazon-vpc-cni ConfigMap を開きます。

+

kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
  1. サンプル値を 0 より大きい値に置き換え、必要なエントリを ConfigMap の data セクションに追加します。warm-ip-target または minimum-ip-target のいずれかに値を設定した場合、その値は warm-prefix-target に設定された値をオーバーライドします。

    warm-prefix-target: "1" warm-ip-target: "5" minimum-ip-target: "2"
  2. ファイルを保存し、エディタを閉じます。

    1. 少なくとも 1 つの Amazon EC2 Nitro インスタンスタイプで Windows ノードグループを作成します。Nitro インスタンスタイプのリストについては、「Amazon EC2 ユーザーガイド」の「Nitro システムに構築されたインスタンス」を参照してください。デフォルトでは、1 つのノードにデプロイできる Pods の最大数は 110 です。この数値を増減させる場合は、ブートストラップ設定のユーザーデータに以下を指定します。max-pods-quantity を最大ポッド値に置き換えます。

      -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 アドレスの数を決定します。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 は、144 個の IP アドレスが使用可能であるにもかかわらず、Kubernetes がノードにデプロイする Pods の最大数です。