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

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

デフォルトでは、pods に割り当てることができる IP アドレスの数は、Elastic Network Interface に割り当てられた IP アドレスの数と、Amazon EC2 ノードにアタッチされているネットワークインターフェイスの数に基づいて決まります。バージョン 1.9.0 以降の Amazon VPC CNI アドオンを設定すると、/28 IPv4 アドレスプレフィックスを割り当てることができます。1.10.1 以降のアドオンでも /28 IPv4 アドレスプレフィックスを割り当てることはできますが、バージョン 1.21 以降のクラスターで IPv6 向けの設定をしている場合は、代わりに /80 IPv6 アドレスプレフィックスを割り当てることが可能になります。

CNI アドオンでプレフィックスの割り当てを設定すると、個々の IP アドレスを割り当てる場合と比較して、大幅に多くの IP アドレスをネットワークインターフェイスに割り当てられるようになります。これにより、ノードは pods に対し、より多くの使用可能な IP アドレスを割り当てられます。アドオンでこれを行うことができる Amazon EC2 機能の詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの「Assigning prefixes to Amazon EC2 network interfaces」を参照してください。

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

考慮事項

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

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

  • VPC には、この機能をサポートするのに十分な、連続性が確保されている /28 IPv4 アドレスブロックが必要です。

  • 各インスタンスタイプは、pods の最大数をサポートします。マネージドノードグループが複数のインスタンスタイプで構成されている場合、クラスターのインスタンスで指定する pods の最大数の内、最小の値がクラスター内のすべてのノードに適用されます。

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

前提条件

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

  • クラスターにデプロイされた、バージョン 1.9.0 以降 (バージョン 1.20 以前のクラスターまたは IPv4 用に設定された 1.21 以降のクラスターの場合)、または 1.10.1 以降 (IPv6 用に設定されたバージョン 1.21 以降のクラスターの場合) の Amazon VPC CNI plugin for Kubernetes アドオン。

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

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

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

    出力例を次に示します。

    amazon-k8s-cni:v1.10.1-eksbuild.1

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

  2. パラメータを有効にして、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 ログに次のエラーが記述されます。

    "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 の予約」を参照してください。

  3. 前提条件のリストに記載されたバージョン以降の Amazon VPC CNI plugin for Kubernetes を使用しながら、起動テンプレートなしでマネージド型ノードグループをデプロイする場合、または AMI ID を指定していない起動テンプレートを使用してデプロイする場合には、このまま次のステップに進みます。マネージド型ノードグループが、pods の最大数を自動的に計算します。

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

    重要

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

  4. IPv6 用に設定された 1.21 以降のクラスターを使用している場合は、このまま次のステップに進みます。

    以下のオプションの内の 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'

      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 アドレスを割り当てる場合は、このステップで機能を有効化する必要があります。詳細については、「チュートリアル: カスタムネットワーキング」を参照してください。

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

    kubectl get nodes

    出力例を次に示します。

    NAME STATUS ROLES AGE VERSION ip-192-168-22-103.region-code.compute.internal Ready <none> 19m v1.20.4-eks-6b7464 ip-192-168-97-94.region-code.compute.internal Ready <none> 19m v1.20.4-eks-6b7464
  7. ノードの max-pods を決定するために、いずれかのノードを詳細表示します。

    kubectl describe node node-name ip-192-168-22-103.region-code.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 がノードにデプロイする pods の最大数です。