LoginSignup
3
3

More than 1 year has passed since last update.

EKS で1つのノードに配置できるPod数を増やす

Posted at

一つのEC2インスタンスで実行できるPod数の制限について

EKS では、RDS などの AWS リソースに対してシームレスにつながるように、PodにVPCネットワーク上と同じIPアドレスが付与されます。
ノードをEC2で構築している場合、EC2のENIが持っているIPから割り振られるのですが、インスタンスタイプよって持てるENIの最大数が決まっており、また1つのENIで持てるIPアドレスの最大数も決まっています。このIPアドレスからPodに割り当てられないIPアドレスやaws-nodekube-proxy に割り当てられるIPアドレスなどから、Podに使用できるIPアドレス数、つまり1つのインスタンスで実行できるPodの上限数となります。

fig1

インスタンスタイプとPodの上限数は以下のページにまとまっています
amazon-eks-ami/eni-max-pods.txt at master · awslabs/amazon-eks-ami · GitHub

AWS Nitro ベースのインスタンスと Amazon VPC CNI のバージョンアップで利用可能IP数を増やす

前述のように、デフォルトでは1つのEC2ノードに割り当てられるIPアドレス数はそれほど多くありません。
しかし、Amazon VPC CNI アドオンのバージョンを 1.9.0 以上、インスタンスファミリーを t3m5 のような AWS Nitro ベースのインスタンスにすることで、/28 IP アドレスプレフィックスを割り当てることができるようになり、1つのEC2ノードでより多くのPodを動かせるようになります。

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

Amazon EKS アドオンについて

EKS アドオン は EKS で Kubernetes クラスターを作成したときにインストールされるコンポーネントのバージョンを管理する機能です。
管理できるコンポーネントは現在は下記の3つです。

  • Amazon VPC CNI
  • CoreDNS
  • kube-proxy

現状、CoreDNSkube-proxy は最新バージョンがデフォルトでインストールされますが、Amazon VPC CNI はデフォルトのバージョンが v1.7.5-eksbuild.2 となっており、利用可能なIP数を増やしたい場合は、このEKSアドオンを使って Amazon VPC CNI のバージョンを v1.9.0-eksbuild.1 以上にする必要があります。

Amazon VPC CNI アドオンを設定する

AWSのマネジメントコンソールやeksctlから設定することもできますが、弊社ではTerraformで管理しているので以下のような設定で追加します(実際にはモジュール化しているので下記そのままではありませんが)

resource "aws_eks_addon" "this" {
  cluster_name      = aws_eks_cluster.this.name
  addon_name        = "vpc-cni"
  addon_version     = "v1.9.1-eksbuild.1"
  resolve_conflicts = "OVERWRITE"
}

設定を適用すると各ノードで実行されている aws-node が指定されたバージョンに更新されます。

AWS マネジメントコンソールからも以下のように表示されて指定されたバージョンがインストールされたことがわかります。
fig2

aws-node DaemonSet のパラメーターを有効にする

Amazon VPC CNI を 1.9.0 以上にすることができたので、以下のコマンドを実行して環境変数を設定し、パラメーターを有効にします。

$ kubectl set env daemonset aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true
$ kubectl set env daemonset aws-node -n kube-system WARM_PREFIX_TARGET=1

ノードグループを作り直す

ノードグループを自前で管理している(セルフマネージド)と、マネージドでノードグループを管理している場合で設定方法が異なるのですが、ここではマネージドでノードグループを管理している場合を記載します。

まず、最大Pod数をEC2インスタンスを起動時に指定する必要がありますが、マネージドでノードグループを作成している場合、自動で計算を行って起動テンプレートに以下のように最大Pod数に110と設定されていることがわかります。

/etc/eks/bootstrap.sh [省略] --max-pods=110' [省略] --use-max-pods false

最大Pod数が従来よりも多くなるのは Amazon EC2 Nitro Amazon Linux 2 のみなので、インスタンスタイプに、t3m5 などのシリーズを含める必要があります。
(上記のDaemonSetの設定を有効にしていても Nitro ベース以外のインスタンスが動かなくなるわけではありませんが、Nitroベースのものに比べるとかなり少なくなります)

また、最大Pod数はEC2インスタンスが起動時に設定されるため、インスタンスを作り直す必要があります。

変更した結果

設定変更前のm5.largeの最大Pod数は29だったのが、変更後は110 まで大幅に増えたことが確認できました。

beta.kubernetes.io/instance-type=m5.large
...[省略]...
Capacity:
    pods:                        110

まとめ

以前はリソース要求が少ないPodが多い場合、1つのノードに集約しようとしてもEC2のIPアドレスが上限に達してしまってCPUやメモリーが余ってしまうことがありましたが、今回の変更でリソースを有効に使えるようになったと思います。

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3