サクッと試すNew Relic Kubernetes APM auto-attach

目次

この記事は New Relic 使ってみた情報をシェアしよう! by New Relic Advent Calendar 2024シリーズ1 3日目の記事です。

2024年11月に開催されたKubeCon + CloudNativeCon North America 2024にて、New RelicからKubernetes APM auto-attachが発表されました。

通常New RelicでAPMを利用する場合、エージェントをアプリケーションに手動でインストールする必要があります。
Configure New Relic agents

Kubernetes APM auto-attachはその名の通り、K8sクラスターにデプロイされたアプリケーションに対して自動的にAPMエージェントをインストールしてくれる機能です。

今回は簡単なRailsアプリケーションをK8sクラスターにデプロイし、Kubernetes APM auto-attachを試してみます。

事前準備

New Relicアカウントの作成

今回の検証で利用するためにNew Relicアカウントを作成します。
New Relic - 無料サインアップ

New Relicには幅広く利用できる無料枠が用意されているため、まずは無料枠で試してみるのがおすすめです。

New Relicライセンスキーの発行

New RelicのAPIキーにはいくつか種類がありますが、今回はライセンスキーが必要です。

ドキュメントの通りにUIから発行するだけなので手順は割愛します。
New Relic API keys

アプリケーションの準備

Kubernetes APM auto-attachを試すために、あらかじめ簡単なRailsアプリケーションを用意しておきます。

ちなみに既存のAPMエージェントがインストールされている場合は、予期しない動作が発生する可能性があるため、事前に削除しておくことが推奨されています。 Can I install the Kubernetes APM auto-attach if my applications are already instrumented?

$ rails new train-rails --api --minimal

Railsアプリケーションのイメージをbuild & pushしておき、Deploymentをクラスターに作成しておきます。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: train
  namespace: station
  labels:
    app: train
spec:
  replicas: 1
  selector:
    matchLabels:
      app: train
  template:
    metadata:
      labels:
        app: train
    spec:
      containers:
        - name: app
          # 今回はHarborにpushしたイメージを利用
          image: harbor:30003/station/train-rails:latest
          ports:
            - containerPort: 80
$ kubectl get pod -n station -l app=train
NAME                     READY   STATUS    RESTARTS   AGE
train-7646c78d6d-7nwk6   1/1     Running   0          30s

インストール

Installに従って、Kubernetes APM auto-attachを利用するためのOperatorをインストールします。

方法としては

の2つがあります。 今回はKubernetes APM auto-attachだけを試すため、スタンドアロン構成でインストールします。
作業としては

  1. ライセンスキーを発行
  2. ドキュメント記載のコマンドを実行
    1. Helmリポジトリを追加
    2. Helmチャートをインストール

だけで完了します。

$ helm repo add k8s-agents-operator https://newrelic.github.io/k8s-agents-operator
"k8s-agents-operator" has been added to your repositories
$ helm upgrade --install k8s-agents-operator k8s-agents-operator/k8s-agents-operator \
    --namespace newrelic \
    --create-namespace \
    --set licenseKey={発行したNEWRELIC_LICENSE_KEY}
Release "k8s-agents-operator" has been upgraded. Happy Helming!
NAME: k8s-agents-operator
LAST DEPLOYED: Fri Dec  6 01:35:32 2024
NAMESPACE: newrelic
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
This project is currently in preview.
Issues and contributions should be reported to the project's GitHub.
=====================================

                             ********
                         ****************
                     **********    **********,
                    &&&****            ****/(((
                    &&&&&&&              ((((((
                     &&&&&&&&&&          ((((((
                         &&&&&&&&        ((((((
                            &&&&&        ((((((
                            &&&&&      ((((((((
                            &&&&& .((((((((((
                            &&&&&((((((((
                              &&&(((,

Your deployment of the New Relic Agent Operator is complete.
You can check on the progress of this by running the following command:

kubectl get deployments -o wide -w --namespace newrelic k8s-agents-operator

WARNING: This deployment will be incomplete until you configure your Instrumentation custom resource definition.
=====================================

Please visit https://github.com/newrelic/k8s-agents-operator for instructions on how to create & configure the
Instrumentation custom resource definition required by the Operator.

インストールが完了するとk8s-agents-operatorが作成されます。

$ kubectl get deployments --namespace newrelic k8s-agents-operator
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
k8s-agents-operator   1/1     1            1           64s

自動計装の設定

Kubernetes APM auto-attachを利用するためには、Instrumentationというカスタムリソースを作成します。 カスタムリソース定義には、適用対象を指定するセレクターやエージェントの設定を記述します。

セレクターは計装する対象を指定するためのもので

を選択し、特定のコンポーネント(e.g, 任意のDeploymentのみ)などに限定できます。

エージェントは計装する対象の言語やイメージ、環境変数などを指定します。
この記事の時点(2024年12月)では

が対応されています。 これを踏まえて、事前準備で作成したDeploymentのPodにマッチするようにInstrumentationを作成します。

---
apiVersion: newrelic.com/v1alpha2
kind: Instrumentation
metadata:
  name: newrelic-instrumentation-ruby
  namespace: newrelic
spec:
  agent:
    language: ruby
    image: newrelic/newrelic-ruby-init:latest
    env:
      - name: NEW_RELIC_APP_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.labels['app']
  namespaceLabelSelector:
    matchExpressions:
      - key: "kubernetes.io/metadata.name"
        operator: "In"
        values: ["station"]
  podLabelSelector:
    matchExpressions:
      - key: "app"
        operator: "In"
        values: ["train"]

逆に後から自動計装の対象から外したい場合は

だけで対応できます。

動作確認

Kubernetes APM auto-attachを確認

Kubernetes APM auto-attachは、Podの起動時にAPMエージェントを自動的にインストールします。
そのためこの段階でNew Relicのダッシュボードを確認しても、何もEntitiesには何も表示されていません。
そのためDeploymentの再起動によってPodを再起動してみます。

$ kubectl rollout restart deployment train -n station

kubectl describe podでラベルを見てみます。
すると再起動前にはなかったnewrelic-k8s-agents-operator-versionが追加されており計装の対象になったことがわかります。

# 再起動前のPodのラベル
Labels:           app=train
                  pod-template-hash=597c9c876d

# 再起動後のPodのラベル
Labels:           app=train
                  newrelic-k8s-agents-operator-version=0.19.0
                  pod-template-hash=5cbf578574

またinit-containerとしてnewrelic/newrelic-ruby-init:latestが追加されていることが確認できます。

Init Containers:
  newrelic-instrumentation-ruby:
    Container ID:  containerd://84a49bb1978c7b6b5c9a13c59ecf3073232d309659847444d04723f8a17f4c25
    Image:         newrelic/newrelic-ruby-init:latest
    Image ID:      docker.io/newrelic/newrelic-ruby-init@sha256:232685ea59c79727730a0e278a68b8db30716419597ffc61f539003d9bdcff9f
    Port:          <none>
    Host Port:     <none>
    Command:
      cp
      -a
      /instrumentation/.
      /newrelic-instrumentation/
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Fri, 06 Dec 2024 02:52:28 +0900
      Finished:     Fri, 06 Dec 2024 02:52:28 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /newrelic-instrumentation from newrelic-instrumentation (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-64rg2 (ro)

しばらく待つと、New RelicのダッシュボードにNEW_RELIC_APP_NAMEで指定したアプリケーションが表示されます。

ただこの段階ではアプリケーションは起動しただけなので、トランザクションなどのデータはまだ収集されていません。

アプリケーションにリクエストを送信

なんらかのリクエストを送信してどうなるか確認してみます。
Railsアプリケーションは初期状態でヘルスチェックのエンドポイントしか存在しないので、これに送ってみることにします。

# serviceすら作成していないのでpodに直接port-forward
$ kubectl port-forward POD_NAME 3000:3000 -n station

# (別ターミナルで) 何回かリクエストを送信
$ curl http://localhost:3000/up

すると、New Relicのダッシュボードにトランザクションデータなどが表示されるようになります。

apm-summary

ヘルスチェックAPIなので面白みはないですが、RailsのMiddlewareやControllerごとに計測されていることがわかります。

apm-detail

ドキュメントには記載されていませんが、ログも収集されていました。

logs

まとめ

タイトルの通り「サクッと」試しましたが、Kubernetes APM auto-attachで非常に簡単にAPMを導入できました。

元々Railsアプリケーションはnewrelic_rpm gemを入れるだけで、非常に簡単にAPMを導入できます。
Kubernetes APM auto-attachを使わなくてもよいように一見思えますが

などのメリットが多そうです。
既存のAPMエージェントのメリット、デメリットを比較して便利に使えるとよいですね。

またサンプリング等の細かい設定がどのようにできるのかはまだ確認していないので、今後調査してみようと思います。

最後までお読みいただき、ありがとうございました。


New Relic User Group Vol.12 3周年&アドカレLT祭りで登壇しました。

← Posts