この記事は 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をインストールします。
方法としては
- Kubernetes統合のコンポーネントがまとめられた
nri-bundle
をインストールし、k8s-agents-operator
を有効化 k8s-agents-operator
をスタンドアロン構成でインストール
の2つがあります。
今回はKubernetes APM auto-attachだけを試すため、スタンドアロン構成でインストールします。
作業としては
- ライセンスキーを発行
- ドキュメント記載のコマンドを実行
- Helmリポジトリを追加
- 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
というカスタムリソースを作成します。
カスタムリソース定義には、適用対象を指定するセレクターやエージェントの設定を記述します。
セレクターは計装する対象を指定するためのもので
PodLabelSelectorAPM
... PodのラベルNameSpaceLabelSelector
... Namespaceのラベル
を選択し、特定のコンポーネント(e.g, 任意のDeploymentのみ)などに限定できます。
エージェントは計装する対象の言語やイメージ、環境変数などを指定します。
この記事の時点(2024年12月)では
dotnet
java
nodejs
python
ruby
php
が対応されています。
これを踏まえて、事前準備で作成した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"]
逆に後から自動計装の対象から外したい場合は
Instrumentation
を更新する- Pod, Namespaceのラベルを変更する
だけで対応できます。
動作確認
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のダッシュボードにトランザクションデータなどが表示されるようになります。
ヘルスチェックAPIなので面白みはないですが、RailsのMiddlewareやControllerごとに計測されていることがわかります。
ドキュメントには記載されていませんが、ログも収集されていました。
まとめ
タイトルの通り「サクッと」試しましたが、Kubernetes APM auto-attachで非常に簡単にAPMを導入できました。
元々Railsアプリケーションはnewrelic_rpm
gemを入れるだけで、非常に簡単にAPMを導入できます。
Kubernetes APM auto-attachを使わなくてもよいように一見思えますが
- アプリケーションのコードを変更する必要がない
- アプリケーションごとにエージェントをインストールする手間が省ける
- アプリケーションごとにエージェントのバージョンや設定を管理する必要がない
- クラスター全体で一括管理できるため、網羅的にAPMを導入できる
などのメリットが多そうです。
既存のAPMエージェントのメリット、デメリットを比較して便利に使えるとよいですね。
またサンプリング等の細かい設定がどのようにできるのかはまだ確認していないので、今後調査してみようと思います。
最後までお読みいただき、ありがとうございました。
New Relic User Group Vol.12 3周年&アドカレLT祭りで登壇しました。
- 13Pまでこのブログの内容
- 14Pから自動計装の流れ(Rubyの場合)