📘

Nodeのプロビジョニング勝負! -Cluster Autoscaler vs Karpenter-

2023/10/31に公開

Kubernetes のノードプロビジョナーは、何を使っていますでしょうか。
ブログや技術記事を見ているとCluster Autoscaler(以後、CA)が多いように感じます。
実際に私もCAを利用しており、可もなく不可もなくという感じなのですが、ノードのプロビジョニング(Pod のスケジューリング)スピードに少し不満があります。
ノードのプロビジョニングスピードに少し時間がかかるため、急激なトラッフィク増加に耐えられません。そのため、事前にトラフィック増加がわかっている場合は、手動でアプリケーション Pod を増加させていますが、地味に煩わしいので自動でやってくれないかなーと思っています。

そこで CA の課題であるポッドのスケジューリングを改善した Karpenter を試してみます。
今回は、CA と Karpenter の Pod スケジューリング(Ready になる)までの時間を計測し、比較しすることでどのくらいの差があるのか確認します。

実は、試験的に Karpenter を導入していたりするのですが、Apply してから Pod が Ready になるまで結構速い印象です。

環境やCA, Karpenter の設定次第では、今回の検証より良い結果が得られるかも知れませんが、大体このくらいなんだなーくらいで知っていただけると嬉しいです。

検証内容

新しいノードが必ずプロビジョニングされるような Deployment manifest を Apply し、 Pod が Ready になるまでの時間を計測します。
CA, Karpenter ともに基本的にGitHub に置かれている状態のまま利用しますが、必要に応じて最低限変更しています。

環境情報

コンポーネント バージョン
Kubernetes(EKS) v1.27.6-eks-f8587cb
Karpenter v0.29.2
Cluster Autoscaler v1.24.2

使用する manifest

resources や nodeAffinity をいい感じに設定し、新しいノードが起動するようにします。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test-pod
  name: test-pod
spec:
  minReadySeconds: 10
  replicas: 1
  selector:
    matchLabels:
      app: test-pod
  template:
    metadata:
      labels:
        app: test-pod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  # Karpenter の場合
                  - key: karpenter.sh/provisioner-name
                    operator: In
                    values:
                      - default
      containers:
        - image: nginx
          imagePullPolicy: IfNotPresent
          command:
            - sleep
            - infinity
          name: debian
          resources:
            limits: #
              cpu: "2000m"
              memory: "8000Mi"

検証

viddy を使って確認します。Time Machine mode で過去に戻って確認できるので、かなり便利です。

Karpenter

manifest を Apply 後、20:43:11 に Pod が Pending

25秒後、Node が NotReady で起動

12秒(合計37秒)後、Node が Ready となり、Pod の STATUS が ContainerCreating に更新

合計49秒後、Pod が Running

Cluster Autoscaler

manifest を Apply 後、21:44:47 に Pod が Pending

41秒後、Node が NotReady で起動

16秒(合計57秒)後、Node が Ready となり、Pod の STATUS が ContainerCreating に更新

合計1分10秒後、 Pod が Running

結果

Node のプロビジョニングは、以下の結果となりました。

  • Karpenter: 37秒
  • Cluster Autoscaler:57秒

Karpenter は CA の約2/3ほどの時間で Node をプロビジョニングできることがわかりました。

感想

もう少し差があるのかと思っていましたが、思っていたより差はありませんでした。
ただ、20秒は結構大きい差だと思うので検証結果次第では CA から Karpenter への乗り換えもありではないでしょうか。
どちらのプロビジョニングスピードでも急激なトラフィックへの対策は対応しきれないため、引続き手動で Pod 数を増やす必要があります。自動でいい感じにやってくれるものはないかなーと思っています。

実際、Karpenter を最初に触ったのが1年以上前(v0.19)で、Node のプロビジョニング以外のところで少し課題感がありプロダクションへの採用は見送りました。
最近AWSの方から聞いた話では、それらの点が改善されつつあり、プロダクションへの採用ができる可能性もありそうだったため、再度検討してみます。

GitHubで編集を提案

Discussion