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

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

デフォルトでは、ポッドに割り当てることができる IP アドレスの数は、Elastic Network Interface に割り当てられた IP アドレスの数と、Amazon EC2 ノードにアタッチされているネットワークインターフェイスの数に基づいて決まります。個々の IP アドレスをネットワークインターフェイスに割り当てる代わりに、バージョン 1.9.0 以降の Amazon VPC CNI アドオンを設定すると、/28 IP アドレスプレフィックス (16 個の IP アドレス) を割り当てることができます。これにより、ノードはポッドに対し、より多くの使用可能な IP アドレスを割り当てられます。アドオンでこれを行うことができる Amazon EC2 機能の詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの「Assigning prefixes to Amazon EC2 network interfaces」を参照してください。

この機能を有効にしない場合、アドオンは、より多くの Amazon EC2 アプリケーションプログラムインターフェイス (API) 呼び出しを行い、ポッド接続に必要なネットワークインターフェイスと IP アドレスを設定する必要があります。これらの API 呼び出しの頻度が高く、かつ各 VPC 内に多数のネットワークインターフェースが存在する場合、クラスターのサイズが大きくなるにつれて、ポッドとインスタンスの起動時間が長くなる可能性があります。これにより、大規模でスパイク的なワークロードの需要を満たすためにスケーリングの遅延が発生します。また、スケーリング要件を満たすためには、追加のクラスターと VPC をプロビジョニングする必要があるため、コストと管理オーバーヘッドも増加します。

Considerations

  • この機能は、AWS Nitro ベースのノードで使用できます。Nitro ベースではないインスタンスでは、引き続き個別のセカンダリ IP アドレスを割り当てられますが、ポッドに割り当てることのできる IP アドレスの数は Nitro ベースのインスタンスよりも大幅に少なくなります。

  • ネットワークインターフェイスにプレフィックスを割り当てるようにアドオンを設定した後は、クラスター内のすべてのノードグループ内のすべてのノードを削除しない限り、Amazon VPC CNI アドオンを 1.9.0 より前のバージョンにダウングレードすることはできません。

  • アドレスは VPC のアドレス空間から割り当てられるため、この機能をサポートするのに十分な IP アドレスが VPC にあることを確認してください。

Prerequisites

  • 既存のクラスター。所有するクラスターがまだない場合は、Amazon EKS の使用開始 ガイドのいずれかを参照しながら作成します。

  • バージョン 1.9.0 以降の Amazon VPC CNI アドオンをクラスターに追加します。クラスターでアドオンを追加または更新するには、「Amazon VPC CNI アドオンの管理」を参照してください。

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

  1. パラメータを有効にして、Amazon VPC CNI デーモンセットのネットワークインターフェイスにプレフィックスを割り当てます。

    kubectl set env daemonset aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true
  2. ノードでのポッドについて、Amazon EKS で推奨される最大数を決定します。

    1. 各インスタンスタイプにおけるポッドの最大数を計算するために使用できるスクリプトをダウンロードします。

      curl -o max-pods-calculator.sh https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/files/max-pods-calculator.sh
    2. コンピュータ上で、そのスクリプトを実行可能としてマークします。

      chmod +x max-pods-calculator.sh
    3. 以降の手順では、すべての<example values> (<> を含む) は、自分が使用している値に置き換えます。<m5.large> をデプロイする予定のインスタンスタイプに置き換え、<1.9.x-eksbuild.y> 以降を Amazon VPC CNI アドオンのバージョンに置き換えます。

      ./max-pods-calculator.sh --instance-type <m5.large> --cni-version <1.9.x-eksbuild.y> --cni-prefix-delegation-enabled

      出力

      110
      注記

      110は Amazon EKS が m5.large インスタンス用として推奨するポッドの最大数です。ENABLE_PREFIX_DELEGATION パラメータが有効になっていない場合、推奨されるポッドの最大数は 29 です。

  3. 以下のオプションの内の 1 つでパラメータを指定します。使用すべき適切なオプションと、そのオプションにどのような値を提供するかについては、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_TARGET – この値を設定した場合、WARM_PREFIX_TARGET に対し設定されている値はすべて上書きされます。このオプションを使用する場合は、以下のパラメータの両方を指定する必要があります。

      kubectl set env ds aws-node -n kube-system WARM_IP_TARGET=<5>

      MINIMUM_IP_TARGET – この値を設定した場合、WARM_PREFIX_TARGET に対し設定されている値はすべて上書きされます。

      kubectl set env ds aws-node -n kube-system MINIMUM_IP_TARGET=<2>
  4. 少なくとも 1 つの Amazon EC2 Nitro Amazon Linux 2 インスタンスタイプを使用して、次のいずれかのタイプのノードグループを作成します。Nitro インスタンスタイプのリストについては、Amazon EC2 Linux インスタンス用ユーザーガイドの「Nitro System 上に構築されたインスタンス」を参照してください。この機能は Windows ではサポートされていません。<110> (<> を含む) はステップ 2 での値 (推奨)、または自分が使用している値に置き換えます。

    • セルフマネージドセルフマネージド型の Amazon Linux ノードの起動 の手順に従ってノードグループをデプロイします。BootstrapArguments パラメータに、以下のテキストを指定します。

      --use-max-pods false --kubelet-extra-args '--max-pods=<110>'
    • マネージド – eksctl を使用する場合は、以下のコマンドを使用して、ノードグループをデプロイします。

      eksctl create nodegroup \ --cluster <my-cluster> \ --region <us-west-2> \ --name <my-nodegroup> \ --node-type <m5.large> \ --managed \ --max-pods-per-node <110>

      別のツールを使用してマネージド型ノードグループをデプロイする場合、そのデプロイには起動テンプレートを使用する必要があります。起動テンプレート内で Amazon EKS 最適化 AMI ID を指定した上で、その起動テンプレートによりノードグループをデプロイし、次のユーザーデータを設定します。このユーザーデータは、引数を bootstrap.sh ファイルに渡します。ブートストラップファイルの詳細については、GitHub の「bootstrap.sh」を参照してください。

      /etc/eks/bootstrap.sh <my-cluster> \ --kubelet-extra-args '--max-pods=<110>'
      注記

      さらにカスタムネットワークを使用する場合には、ここでの手順により有効にする必要があります。カスタムネットワークの詳細については、「CNI カスタムネットワーク」を参照してください。

  5. ノードがデプロイされると、クラスター内のノードの表示が可能になります。

    kubectl get nodes

    出力

    NAME STATUS ROLES AGE VERSION ip-192-168-22-103.us-west-2.compute.internal Ready <none> 19m v1.20.4-eks-6b7464 ip-192-168-97-94.us-west-2.compute.internal Ready <none> 19m v1.20.4-eks-6b7464
  6. ノードでのポッドの最大数を決定するノードを 1 つ詳細表示します。

    kubectl describe node node-name ip-192-168-22-103.us-west-2.compute.internal

    出力

    ... Allocatable: attachable-volumes-aws-ebs: 25 cpu: 1930m ephemeral-storage: 76224326324 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 7244720Ki pods: 110 ...

    前の出力にある 110 は、Kubernetes がノードにデプロイするポッドの最大数です。