tech.guitarrapc.cóm

Technical updates

EKSでAWS Load Balancer ControllerでALBを作ろうとしてSubnetのIPが足りなかった話

EKSでAWS Load Balancer Controllerを使ってALB(Application Load Balancer)を作ろうとしたときに、次のようなエラーが出てちょっと戸惑ったのでメモです。

発端

AWS Load Balancer ControllerでingressからALBが作成できないため、ingressのeventを確認したところ、次のようなエラーが出ていました。

$ kubectl describe ingress ingress-name -n namespace
Failed build model due to couldn't auto-discover subnets: subnets count less than minimal required count: 1 < 2

このエラーは、ALBを作成するために必要なサブネットの数が足りないことを示しています。 ALBは高可用性を確保するために、異なるAZで2つ以上のサブネットが必要ですが、条件に当てはまるサブネットが1つしか見つからなかったことを示しています。

AWS Load Balancer Controllerでサブネットがオートディスカバリーで期待する数に解決できない場合、多くの場合は次のどれかが該当します。

  • サブネットに適切なタグが付与されていない (インターネット向けALBならkubernetes.io/role/elb : 1のタグがサブネットに必要)
  • サブネットにクラスターのタグが付与されていない (例: kubernetes.io/cluster/<cluster-name> : sharedのタグがサブネットに必要)
  • サブネットが異なるAZではない
  • サブネットがパブリックではない (InternetGatewayにルートが設定されていない)

ただし、今回はいずれでもなくサブネット自体は問題ありませんでした。

原因

原因は、サブネットのIPアドレスが不足していたことでした。 ALBは各サブネットにENI(Elastic Network Interface)を作成しますが、ドキュメントによると各サブネットに最低8つのIPアドレスが必要です。

To ensure that your load balancer can scale properly, verify that each Availability Zone subnet for your load balancer has a CIDR block with at least a /27 bitmask (for example, 10.0.0.0/27) and at least eight free IP addresses per subnet. These eight IP addresses are required to allow the load balancer to scale out if needed.

Subnets for your load balancerより引用

改めてサブネットを見ると、1つのサブネットは十分にIPが残っていましたが、もう1つのサブネットが残り6IPアドレスしか残っていない状況でした。 今回の環境は、いろいろ実験するEKS環境だったので汎用サブネットは/241で切っていたためNode起動などでIPを消費していた次第です。

EKSで何かしらの理由でNodeとALBを同一サブネットにする場合、/22程度に広げるとイイデスネ。

まとめ

EKSのALBトラブルといえば経験上99%はサブネットのタグ付け忘れですが、そういえばサブネットのIPアドレス不足もありましたね、という話でした。 今まで偶然にも当たったことなかったのですが、こういうこともあるということで。


  1. 加えて、ノード拡縮用に/16の追加CIDRを足していたものの