Karpenterを試してみる
Karpenterを試してみる。
Karpenterとは
nodeのオートスケーラの一つ
オートスケーラの比較
-
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をデプロイし、スケールするかの確認
- 既存の
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