🐙

Karpenterを試してみる

2023/07/23に公開

Karpenterを試してみる。

Karpenterとは

nodeのオートスケーラの一つ
https://karpenter.sh/docs/

オートスケーラの比較

  • karpenter
    https://karpenter.sh/docs/
    karpenterはノードグループ関係なく設定された要件に合うノードを選んでデプロイしてくれる。
    自動でなるべくコスパのいいノードを選んでくれる。
    ノードグループのスペックに依存しないので、オーバスペックなノードの作成を避けられる。

  • cluster-autoscaler
    https://github.com/kubernetes/autoscaler/tree/master
    既存のノードグループをもとにノード数を調整する。
    新たに作成されるノードのスペックはノードグループの設定値に依存。

Karpenterデプロイ

terraform moduleが提供されているのでそれを使用した。
ex: https://github.com/terraform-aws-modules/terraform-aws-eks/tree/master/examples/karpenter

その他注意点としては、karpenterが私用するsubnet, security_groupにはkarpenter.sh/discovery: ${cluster名} のタグを入れておくと自動で探索してくれる。

動作検証

以下を参考にテストpodをデプロイし、スケールするかの確認
https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/#scale-up-deployment

  • 既存の t3.large 2つにc5a.xlarge 2つが追加された。
    感覚的にはcluster autoscalerより少し早い気がする。
$ kubectl scale deployment inflate --replicas 5


$ eks-node-viewer -resources=cpu,memory

2023/07/22 05:43:45 updating spot pricing, MissingRegion: could not find region configuration, using existing pricing data from 2022-12-05T13:09:08Z
4 nodes (8370m/11700m)    71.5% cpu    █████████████████████████████░░░░░░░░░░░ $0.474/hour | $346.312/month
        2998Mi/28541808Ki 10.8% memory ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
31 pods (3 pending 28 running 28 bound)

ip-192-168-2-61.ap-northeast-1.compute.internal cpu    █████████████████████░░░░░░░░░░░░░░  60% (5 pods)  t3.large/$0.0832   On-Demand - Ready
                                                memory ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  16%
ip-192-168-2-75.ap-northeast-1.compute.internal cpu    █████████████████████░░░░░░░░░░░░░░  60% (5 pods)  t3.large/$0.0832   On-Demand - Ready
                                                memory ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  16%
ip-192-168-2-60.ap-northeast-1.compute.internal cpu    ████████████████████████████████░░░  92% (11 pods) c5a.xlarge/$0.1540 On-Demand - Ready
                                                memory ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   7%
ip-192-168-2-42.ap-northeast-1.compute.internal cpu    ██████████████████████░░░░░░░░░░░░░  63% (7 pods)  c5a.xlarge/$0.1540 On-Demand - Ready
                                                memory █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   3%
  • 既存の t3.large 1つしてレプリカ数を20にしてみた。
    すぐスケールした。1分以内ぐらい
$ kubectl scale deployment inflate --replicas 20

$ eks-node-viewer -resources=cpu,memory

6 nodes (23580m/29510m)   79.9% cpu    ████████████████████████████████░░░░░░░░ $1.161/hour | $847.676/month
        2514Mi/58610052Ki 4.4%  memory ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
56 pods (3 pending 53 running 53 bound)

ip-192-168-2-75.ap-northeast-1.compute.internal  cpu    █████████████████████░░░░░░░░░░░░░░  60% (5 pods)  t3.large/$0.0832    On-Demand - Ready
                                                 memory ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  16%
ip-192-168-2-60.ap-northeast-1.compute.internal  cpu    ████████████████████████████████░░░  92% (11 pods) c5a.xlarge/$0.1540  On-Demand - Ready
                                                 memory ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   7%
ip-192-168-2-42.ap-northeast-1.compute.internal  cpu    ███████████████████████████████░░░░  88% (8 pods)  c5a.xlarge/$0.1540  On-Demand - Ready
                                                 memory █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   3%
ip-192-168-2-106.ap-northeast-1.compute.internal cpu    ███████████████████████████████░░░░  88% (8 pods)  c5a.xlarge/$0.1540  On-Demand - Ready
                                                 memory █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   3%
ip-192-168-2-48.ap-northeast-1.compute.internal  cpu    ████████████████████░░░░░░░░░░░░░░░  56% (9 pods)  c5a.2xlarge/$0.3080 On-Demand - Ready
                                                 memory █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   1%
ip-192-168-2-91.ap-northeast-1.compute.internal  cpu    █████████████████████████████████░░  94% (12 pods) c5a.2xlarge/$0.3080 On-Demand - Ready
                                                 memory █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   1%
  • レプリカを0にした。
    1個は残ってしまう。
    おそらくkarpenter自身のコントローラのためか?
    fluent-bitなどのdaemon-setはちゃんと無視されていそう
2 nodes (1760m/5850m)     30.1% cpu    ████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░ $0.237/hour | $173.156/month
        1634Mi/14270900Ki 11.7% memory █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
16 pods (3 pending 13 running 13 bound)

ip-192-168-2-75.ap-northeast-1.compute.internal cpu    █████████████████████░░░░░░░░░░░░░░  60% (5 pods) t3.large/$0.0832   On-Demand - Ready
                                                memory ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  16%
ip-192-168-2-60.ap-northeast-1.compute.internal cpu    █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  15% (8 pods) c5a.xlarge/$0.1540 On-Demand - Ready
                                                memory ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   7%
  • その他ttlSecondsUntilExpired: 120 にして2分毎にノードがリフレッシュされる挙動を確認できた。
$ kubectl get node
NAME                                              STATUS                     ROLES    AGE     VERSION
ip-192-168-2-42.ap-northeast-1.compute.internal   Ready                      <none>   70s     v1.27.3-eks-a5565ad
ip-192-168-2-43.ap-northeast-1.compute.internal   Ready,SchedulingDisabled   <none>   2m19s   v1.27.3-eks-a5565ad
ip-192-168-2-75.ap-northeast-1.compute.internal   Ready                      <none>   59m     v1.27.3-eks-a5565ad
ip-192-168-2-9.ap-northeast-1.compute.internal    Unknown                    <none>   10s
  • 使用したコード
    https://github.com/ryutaro-asada/test-terraform/blob/main/test-karpenter/main.tf

  • その他考察
    consolidation.enabled: trueを設定しておくことで積極的にコスパ改善されるようにノードを作りなおすらしいが、もう少し検証しておきたい。
    場合によっては ttlSecondsAfterEmptyのほうを使用する方が良い可能性がある。
    また、適切にdrainされるようにpodのterminationGracePeriodSecondsを適切に設定しておく必要がある。

Discussion