AWS
PR

【AWS】EC2インスタンスタイプごとの最大のENIやIPアドレスの数

saratogax
記事内に商品プロモーションを含む場合があります

EKS(Kubernetes)を触っていると、EC2 で立てているノードの IP アドレス管理も気になってきます。

1 つのノードで、どのくらいの pod を動かすのか、主に CPU やメモリなどのリソース中心で考えてしまいますが、割り振れる IP アドレスの数も重要ですよね。

ということで、EC2 のインスタンスタイプごとに、以下の情報を調べてみました。

・最大の ENI の数
・1 つの ENI ごとの IP アドレスの数

ENI(ネットワークインタフェース)

ENI の情報は aws cli を使えばすぐにわかります。

You can use the describe-instance-types AWS CLI command to display information about an instance type, such as its supported network interfaces and IP addresses per interface. The following example displays this information for all C5 instances.

To retrieve network interface information using the AWS CLI

例えば、r5 系のインスタンスの場合は以下の通り。

$ aws ec2 describe-instance-types --filters "Name=instance-type,Values=r5.*" --query "InstanceTypes[].{Type: InstanceType, MaxENI: NetworkInfo.MaximumNetworkInterfaces, IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" --output table

結果は以下の通り。
(2024 年 5 月 31 日現在)

---------------------------------------
|        DescribeInstanceTypes        |
+----------+----------+---------------+
| IPv4addr | MaxENI   |     Type      |
+----------+----------+---------------+
|  50      |  15      |  r5.24xlarge  |
|  10      |  3       |  r5.large     |
|  30      |  8       |  r5.4xlarge   |
|  50      |  15      |  r5.metal     |
|  50      |  15      |  r5.16xlarge  |
|  30      |  8       |  r5.8xlarge   |
|  15      |  4       |  r5.xlarge    |
|  15      |  4       |  r5.2xlarge   |
|  30      |  8       |  r5.12xlarge  |
+----------+----------+---------------+

r5.xlarge の場合は、ENI が最大で 4 つ、ENI が追加されるごとに 15 個の IP アドレスが追加される計算になります。

やはり t3 系の小さなインスタンスタイプだと少ないですね。

$ aws ec2 describe-instance-types --filters "Name=instance-type,Values=t3.*" --query "InstanceTypes[].{Type: InstanceType, MaxENI: NetworkInfo.MaximumNetworkInterfaces, IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" --output table
--------------------------------------
|        DescribeInstanceTypes       |
+----------+----------+--------------+
| IPv4addr | MaxENI   |    Type      |
+----------+----------+--------------+
|  15      |  4       |  t3.2xlarge  |
|  15      |  4       |  t3.xlarge   |
|  12      |  3       |  t3.large    |
|  6       |  3       |  t3.medium   |
|  2       |  2       |  t3.nano     |
|  2       |  2       |  t3.micro    |
|  4       |  3       |  t3.small    |
+----------+----------+--------------+

ノードのIPアドレス設定

EKS のノードの場合、起動時に割り振られる IP アドレスの数は、aws-node の以下の環境変数によって状態が異なります。

WARM_ENI_TARGET
WARM_IP_TARGET
MINIMUM_IP_TARGET

なお、WARM_IP_TARGET が設定されている場合は、WARM_ENI_TARGET の設定が無効になるので WARM_IP_TARGET の扱いには注意が必要です。

このあたりの説明は以下の記事に詳しく書かれています。

なるべく IP アドレスを節約したい場合は、WARM_IP_TARGET を設定するといいですね。

ENI と IP から「1 ノードに載る pod 数」を出す

ここまでの ENI と IP の数がわかれば、そのノードに何個の pod を載せられるかを計算できます。Amazon VPC CNI を既定の設定で使う場合、EKS の最大 pod 数は次の式で決まります。

最大 pod 数 = (最大 ENI 数 × (ENI あたりの IP 数 - 1)) + 2

- 1 しているのは、各 ENI の 1 つ目の IP が ENI 自身のプライマリ IP で pod には使えないためです。+ 2 は、どのノードでも動く Amazon VPC CNI と kube-proxy の分で、この 2 つは pod の IP を消費しません。

先ほどの表の値を当てはめると、こうなります。

インスタンスタイプ最大 ENIIP / ENI最大 pod 数
t3.small3411
t3.medium3617
t3.large31235
t3.xlarge41558
r5.large31029
r5.xlarge41558
r5.4xlarge830234
r5.24xlarge1550737
※表は横スクロールできます

t3.small は 11 個しか載りません。DaemonSet がいくつかあるだけで埋まってしまうので、CPU やメモリに余裕があっても pod が Pending のまま増えない、という事態はこれが原因のことがあります。

ただし、マネージドノードグループ(カスタム AMI なし)では上限が別にかぶさります。AWS が user data に maxPods を注入し、vCPU が 30 未満なら 110、30 以上なら 250 で頭打ちになります。r5.24xlarge は式の上では 737 ですが、実際に載るのは 250 までということです。

なお、Nitro 世代のインスタンスではプレフィックス委任(prefix delegation)を有効にすると、1 つの ENI に /28 のプレフィックス単位で IP を割り当てられるようになり、この上限を大きく引き上げられます。

参考(出典)

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました