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には、この機能をサポートするのに十分な連続性が確保されている /28 IPアドレスブロックが必要です。

  • 各インスタンスタイプは、Pod の最大数をサポートします。管理対象ノードグループが複数のインスタンスタイプで構成されている場合、クラスター内のインスタンスの最大数 Pod の最小数がクラスター内のすべてのノードに適用されます。

  • 既存のマネージドノード型グループがある場合、ノードグループの次回 AMI または起動テンプレートを更新すると、新しいワーカーノードで新しい IP アドレスプレフィックス割り当て max-pod 値が有効になります。.

Prerequisites

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

  • バージョン 1.9.0 以降の Amazon VPC CNI アドオンをクラスターに追加します。

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

  1. 現在インストールされている Amazon VPC CNI のバージョンが 1.9.0 以降であることを確認してください。

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

    出力:

    amazon-k8s-cni:1.9.0-eksbuild.1

    バージョンが 1.9.0 以前の場合は、更新する必要があります。詳細については、更新された「Amazon VPC CNI アドオンの管理」セクションを参照してください。

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

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

    サブネットに空きIPアドレスがある場合でも、サブネットに連続していない場合には /28 ブロックを使用すると、VPC CNI ログに次のエラーが表示されます。

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

    これは、サブネット全体に広がる既存のセカンダリ IP アドレスの断片化が原因で発生する可能性があります。このエラーを解決するには、新しいサブネットを作成してそこに Pod を起動するか、Amazon EC2 サブネットの CIDR 予約を使用して、プレフィックス割り当てで使用するサブネット内の領域を予約します。詳細については、Amazon VPC ユーザーガイドの「サブネット CIDR の予約」を参照してください。

  3. 起動テンプレートなしでマネージド型ノードグループをデプロイする場合、またはで AMI ID を指定していない起動テンプレートを使用してデプロイする場合、Amazon VPC CNI アドオンのバージョン 1.9.0 以降を使用している場合は、次の手順に進みます。マネージド型ノードグループは、Pod の最大数を自動的に計算します。

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

    重要

    マネージド型ノードグループは、maxPods の値に最大数を適用します。vCPUs が 30 未満のインスタンスの場合、最大数は 110 で、その他すべてのインスタンスの最大数は 250 です。この最大数は、プレフィックス委任が有効かどうかにかかわらず適用されます。

  4. 以下のオプションの内の 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 または 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>
  5. 少なくとも 1 つの Amazon EC2 Nitro Amazon Linux 2 インスタンスタイプを使用して、次のいずれかのタイプのノードグループを作成します。Nitro インスタンスタイプのリストについては、Amazon EC2 Linux インスタンス用ユーザーガイドの「Nitro System 上に構築されたインスタンス」を参照してください。この機能は Windows ではサポートされていません。<110> (<> を含む) オプションの場合、ステップ 3 での値 (推奨)、または独自の値に置き換えます。

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

      --use-max-pods false --kubelet-extra-args '--max-pods=<110>'
    • マネージド型 — 次のいずれかのオプションを使用して、ノードグループをデプロイします。

      • 起動テンプレートがない場合、または AMI ID が指定されていない起動テンプレートを使用する場合 —「マネージド型ノードグループの作成」の手順を完了します。マネージド型ノードグループは、Amazon EKS 推奨最大ポッド値を自動的に計算します。

      • 指定した AMI ID を持つ起動テンプレート — 起動テンプレートで Amazon EKS 最適化 AMI ID を指定するか、Amazon EKS 最適化 AMI から構築されたカスタム AMI を指定してから、起動テンプレートを使用してノードグループをデプロイ起動テンプレートでは、次のユーザーデータを指定します。このユーザーデータは、引数を bootstrap.sh ファイルに渡します。ブートストラップファイルの詳細については、GitHub の「bootstrap.sh」を参照してください。

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

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

      注記

      また、インスタンスとは異なるサブネットの Pod に IP アドレスを割り当てる場合は、この手順でケーパビリティを有効にする必要があります。詳細については、「CNI カスタムネットワーク」を参照してください。

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

    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
  7. ノードでのポッドの最大数を決定するノードを 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 がノードにデプロイするポッドの最大数です。