【AWS】EC2インスタンスタイプごとの最大のENIやIPアドレスの数
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 を消費しません。
先ほどの表の値を当てはめると、こうなります。
| インスタンスタイプ | 最大 ENI | IP / ENI | 最大 pod 数 |
|---|---|---|---|
t3.small | 3 | 4 | 11 |
t3.medium | 3 | 6 | 17 |
t3.large | 3 | 12 | 35 |
t3.xlarge | 4 | 15 | 58 |
r5.large | 3 | 10 | 29 |
r5.xlarge | 4 | 15 | 58 |
r5.4xlarge | 8 | 30 | 234 |
r5.24xlarge | 15 | 50 | 737 |
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 を割り当てられるようになり、この上限を大きく引き上げられます。
参考(出典)
- Choose an optimal Amazon EC2 node instance type(Amazon EKS 公式ドキュメント)
- Assign more IP addresses to Amazon EKS nodes with prefixes(Amazon EKS 公式ドキュメント)
