Top takeaways
本記事は Public Preview 中の機能になります。
現時点での最新情報はお届けしますが GA の際には情報が変わる可能性があることをご注意下さい。
詳細は pre-release policy をご確認下さい。
Kubernetes Agent Operator(k8s agent operator) は New Relic のKubernetes Agent(k8s agent) と並行して APM の導入を自動化することによって Kubernetes 環境における可視化を効率的に行えることを期待されて設計されています。開発者は APM Agent を手動で管理する必要が無くなります。
インストール、アップデート、削除の作業もオペレーターが自動的に行ってくれるものになります。
本記事ではその導入方法を紹介していきます。
現在、Java、.NET、Node.js、Python、Rubyをサポートしており、追加の言語(PHPとGo)も追加される予定です。EKSとオンプレミスクラスタでAMDノードを実行していることがテストされています。
事前準備
k8s クラスタの準備と Helm、 cert-manager を利用できるようにしておきましょう。
New Relic の k8s agent の環境要件に関してはドキュメントを参照下さい。
cert-manager のインストール
k8s agent をデプロイする前に cert-manger をデプロイしておきます。
helm repo add jetstack https://charts.jetstack.io
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true
オペレーターのインストール
オペレーターのインストール方法として2種類あります。
New Relic の Kubernetes 統合に加えてのインストール(推奨)
スタンドアローンインストール
今回は推奨の方法で実施をします。
Kubernetes 統合は nri-bundle という helm charts を利用するので helm 経由でインストールをします
helm repo add newrelic https://helm-charts.newrelic.com
helm upgrade --install newrelic-bundle newrelic/nri-bundle \
--set global.licenseKey=<NEW RELIC INGEST LICENSE KEY> \
--set global.cluster=<CLUSTER_NAME> \
--namespace=newrelic \
--set newrelic-infrastructure.privileged=true \
--set global.lowDataMode=true \
--set kube-state-metrics.enabled=true \
--set kubeEvents.enabled=true \
--set k8s-agents-operator.enabled=true \
--create-namespace
また values.yaml を利用する方法も用意されています。
シークレットの作成とCRDのデプロイ
APM Agent を動作させたいネームスペースに対してシークレットを作成します。
kubectl create secret generic newrelic-key-secret \
--namespace <NAMESPACE_TO_MONITOR> \
--from-literal=new_relic_license_key=<YOUR_NEW_RELIC_INGEST_LICENSE_KEY>
次にオペレーターを各ネームスペースで動作させるための CRD をデプロイします。
apiVersion: newrelic.com/v1alpha1
kind: Instrumentation
metadata:
labels:
app.kubernetes.io/name: instrumentation
app.kubernetes.io/created-by: k8s-agents-operator
name: newrelic-instrumentation
spec:
java:
image: newrelic/newrelic-java-init:latest
# env:
# Example New Relic agent supported environment variables
# - name: NEW_RELIC_LABELS
# value: "environment:auto-injection"
# Example overriding the appName configuration
# - name: NEW_RELIC_POD_NAME
# valueFrom:
# fieldRef:
# fieldPath: metadata.name
# - name: NEW_RELIC_APP_NAME
# value: "$(NEW_RELIC_LABELS)-$(NEW_RELIC_POD_NAME)"
nodejs:
image: newrelic/newrelic-node-init:latest
python:
image: newrelic/newrelic-python-init:latest
dotnet:
image: newrelic/newrelic-dotnet-init:latest
ruby:
image: newrelic/newrelic-ruby-init:latest
アプリケーションに対して APM の自動挿入を有効化する
k8s agent operator が APM Agent の自動挿入対象を把握させるために以下のアノテーションを対象の言語に併せて付与させます。
instrumentation.newrelic.com/inject-java: "true"
instrumentation.newrelic.com/inject-nodejs: "true"
instrumentation.newrelic.com/inject-python: "true"
instrumentation.newrelic.com/inject-dotnet: "true"
instrumentation.newrelic.com/inject-ruby: "true"
サンプルとしてDeployment の例を載せます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-petclinic
spec:
selector:
matchLabels:
app: spring-petclinic
replicas: 1
template:
metadata:
labels:
app: spring-petclinic
annotations:
instrumentation.newrelic.com/inject-java: "true"
spec:
containers:
- name: spring-petclinic
image: ghcr.io/pavolloffay/spring-petclinic:latest
ports:
- containerPort: 8080
env:
# New Relic で表示させる APM 名として必要
- name: NEW_RELIC_APP_NAME
value: spring-petclinic-demo
アプリケーションをデプロイして APM Agent がセットアップされているか確認しましょう。
問題なくセットアップされていることが確認できました。
筆者は Bookinfo というサンプルアプリを利用して分散トレースが繋がるかどうかも確認して問題なく利用できることが確認できました。
次のステップ
これでアプリケーション側に手を加えること無く APM Agent の導入ができるようになりました。
本記事での紹介は以上になりますが上手く導入できなかった場合などはトラブルシュートなどを参照下さい。
また Kubernetes 連携をしたことによってアプリケーションとの連携も利用できるようになりましたので併せてお試し下さい。
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。