Kubernetes Node のオートスケーラーとして従来に使われていたのは ClusterAutoscaler でこれは Kubernetes を使っている方なら誰でも利用されていたと思います。

Karpenter は Kubernetes Node のオートスケーラーとして新しく登場したオプションになっており従来 Amazon EKS などで ClusterAutoscaler を利用してオートスケールをする場合には Auto Scaling Group に依存している形になります。Karpenter の場合は未スケジュールの Pod などのスペックを見て最適なキャパシティを選択して直接 EC2 を起動する方式を採用しており起動速度やワークロードに対して最適な選択肢を提供するものとなっています。

今回はその Karpenter のメトリクスを New Relic に対して転送する方法をご紹介します。

環境構成

今回は以下の環境で実施しました。

  • Amazon EKS v1.27
  • Karpenter v0.33.1
  • New Relic Kubernetes Integration (nri-bundle-5.0.58)

EKS は作成されている前提で進めますので Amazon EKS のセットアップガイドに従ってクラスター未作成の方は作成を実施してください。
Karpenter のドキュメントにも Cluster の作成の項目がありのちほど必要な手順が省略されるのでオススメです。

New Relic のアカウントが必要になりますので New Relic のアカウントを持ってない場合はアカウントを作成してください。

Karpenter のデプロイ

Karpenter もドキュメントに従ってセットアップを進めてください。

https://karpenter.sh/preview/getting-started/getting-started-with-karpenter/

Karpenter は 8000 番ポートでメリトクスアクセスのためのポートを公開しており /metrics にリクエストすることでメトリクスを取得できるようになっています。
次に New Relic の Kubernetes Integration を導入して Prometheus のメトリクスも収集できるようにします。

New Relic Kubernetes Integration の導入

New Relic Kubernetes Integration の導入をします。
https://docs.newrelic.com/docs/kubernetes-pixie/kubernetes-integration/get-started/introduction-kubernetes-integration/

Helmで導入をします。
今回は Prometheus Agent を利用するので以下の形で実行します。

yaml 管理することでもう少し効率的に管理ができますがインストール時はワンライナーで導入します。

kubectl create namespace newrelic;
kubectl apply -f https://download.newrelic.com/install/kubernetes/pixie/latest/px.dev_viziers.yaml && \
kubectl apply -f https://download.newrelic.com/install/kubernetes/pixie/latest/olm_crd.yaml && \
helm upgrade --install newrelic-bundle newrelic/nri-bundle \
#https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/
 --set global.licenseKey=<license key>  \
 --set global.cluster=<cluster name> \
 --namespace=newrelic \
 --set newrelic-infrastructure.privileged=true \
 --set global.lowDataMode=true \
 --set ksm.enabled=true \
 --set kubeEvents.enabled=true \
 --set logging.enabled=true \
 --set newrelic-prometheus-agent=true 

license key の箇所には New Relic のアカウントで取得できる Lisence Key を利用します。
https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/

ここまで無事リリースが完了して全てのリソースが正常に動けば準備が整いましたので Prometheus のメトリクスを Karpenter から取得します。

Prometheus メトリクスの取得

Prometheus メトリクスの取得をしていきます。
今回は Prometheus Agent を利用していますのでその手順に沿って設定をします。

 Prometheus Agent の場合、newrelic.io/scrape: "true" か prometheus.io/scrape: "true" のannotationが付与されている場合にスクレイプをしにいくようになっています。

Karpenter の Deployment と Service にannotationを付与します。

---
apiVersion: v1
kind: Service
metadata:
  name: karpenter
  namespace: kube-system
  labels:
    helm.sh/chart: karpenter-v0.33.1
    app.kubernetes.io/name: karpenter
    app.kubernetes.io/instance: karpenter
    app.kubernetes.io/version: "0.33.1"
    app.kubernetes.io/managed-by: Helm
  annotations:
    newrelic.io/scrape: "true"
....
----
apiVersion: apps/v1
kind: Deployment
metadata:
  name: karpenter
  namespace: kube-system
  labels:
    helm.sh/chart: karpenter-v0.33.1
    app.kubernetes.io/name: karpenter
    app.kubernetes.io/instance: karpenter
    app.kubernetes.io/version: "0.33.1"
    app.kubernetes.io/managed-by: Helm
  annotations:
    newrelic.io/scrape: "true"

もし prometheus.io/scrape: "true" を利用している場合、 integration_filter が効いていてそのままだと取得ができないので helm の value を少し編集する必要があります。

デフォルトの設定では integration_filter にマッチしているものを取得するので karpenter を設定します。

以下設定例です。
詳細はドキュメントも合わせてご確認ください。

Github も確認していただくとより理解が深まります。

newrelic-prometheus-agent:
  enabled: true
  config:
    kubernetes:
      integrations_filter:
        app_values: [
          "redis",
          "traefik",
          "calico",
          "nginx",
          "coredns",
          "kube-dns",
          "etcd",
          "cockroachdb",
          "velero",
          "harbor",
          "argocd",
          "node-exporter",
          "karpenter" #これを追加
        ]

実際に変更ができたら Promethesu のメトリクスが取得できているかを確認します。

確認の方法として New Relic に Prometheus Agent の Dashboard が用意されているのでそちらを見て頂くか NRQL で取得できていますのでそちらで確認することができます。

参考までに NRQL での取得例を添付します。

Prometheus Agent のダッシュボードからメトリクスが取得されていることを確認することも出来るようになっています。

ここまで確認できたら設定としては以上となります。
オートスケーラーとして正常に動いているかはクラスタ運用としても重要になる点になりますので必要なデータを New Relic に集約してご活用ください。