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 クラスタの準備と Helmcert-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 というサンプルアプリを利用して分散トレースが繋がるかどうかも確認して問題なく利用できることが確認できました。