前置き
微妙に釣りになっていないタイトルは頑張った証です。
全然ひとつじゃないと思いますが、参考まで
EKSのノードを作成する際に、というかそれに限らずVPCやsubnetを作成する必要がありますが、net maskどんくらいにします?
なにが正しいってのはないとは思いますが、私の場合、VPCのnet maskは/16
、 subnetは /24
にします。
VPCは/16であれば、単純に第二オクテットでネットワークを識別できるからです。10.1.0.0/16
とかなら、10.1
がネットなわけですな。
VPCたくさんつくってもそれぞれ、10.1.0.0/16 , 10.2.0.0/16, 10.3.0.0/16
とはやっとけばそれぞれに配置しているリソースの識別も容易なわけです。
特にVPCピア接続をしたいと思った時にネットワークのIPが別である必要があるため、便利、というか必須です。
で、subnet。
/24
にしとけば、第四オクテットが自由になる部分であり、発行できるIPアドレスは256。256個もIP発行することある?ないでしょ!
ということで、なんの迷いもなくそうやってきました。そう。EKSを使うまでは。
EKSにノードを立てたら、次にやるのはscale out ですよね。
ちなみにEKSのクラスタ構築にはeksctl
を使用しています。
eksctl.io
https://eksctl.io/
裏でCloudFormationが走るよいツールです。普段はTerraformなのでちょっと思うところはありますが、良いツールです。
よっしゃー、r5.large
でいっきに100個までscale outさせちゃうぞ!(ただしspot instanceにかぎる)
とかやります。私はやりました。
その結果、謎のエラー。。。。
CloudFormationのコンソール見たら、案の定エラー終了しています。
エラーメッセージをよく見てみると、どうやらsubnetのIPアドレスが枯渇しているとのこと。。。 え?
なんとEKSは、large
クラスであれば、各ノード毎に約10個程度のIPアドレスを確保していきます。いきやがるのです。
によれば、なんとr5.large
の場合1インタンスあたり最大29個のIPアドレスを消費する可能性があるとのこと。
podごとにIPをアサインする必要があるためらしいですが、いや1ノードでそんなにpod動かさないでしょ〜。
一度このエラーが発生するとCloudFormationのRollbackも至難の技で苦労しました。
Rollback時に出るエラーログを丁寧に追いながら、rollback対象外のリソースを指定していくのがポイント。
まあそもそも発生させないのがよいのでその方法を。
デフォルトで割り当てられる private IPアドレスの数を制限する方法
- 例えば3個に制限する場合
kubectl set env daemonset aws-node -n kube-system WARM_IP_TARGET=3
こんだけです。
daemonsetとしてノードごとに起動しているaws-nodeの環境変数を変更するわけですな。
他に設定可能な値は以下参照。
CNI 設定変数
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/cni-env-vars.html
変えたのはデフォルト値なので、たくさんpodをあげれば当然IPを確保しにいくので、枯渇の悪夢は起こりえます。
ご注意を。