NewRelicとEKSを連携する

## はじめに
この記事は[New Relic Advent Calender 2022](https://qiita.com/advent-calendar/2022/newrelic)の14日目の記事です。

Kubernetesを対象としたオブザーバビリティ（可観測性）を実現するためには、システム構成、要件に応じたモニタリングツールの選定が重要となります。
Kubernetesは環境の状態が一定ではなく、特定のノードで特定のPodが稼働する、などとあらかじめ見込んでモニタリングすることができません。
また、複数のコンポーネント・サービスが組み合わさっているため、問題が起きた際の瞬時の原因切り分けや調査、特定は従来のモニタリングでは困難です。
以上の背景から、様々なモニタリングツールを実際に触ってみる、つまり、どのような情報がとれるか、どう可視化できるか、どう案件に適用できそうか、
などを把握することは非常に重要だと考えます。

さて、ツールとしてクラウドサービスでは、AWSのContainer InsightsやAzureのAzure Monitor、OSSでは、PrometheusやGrafanaなどが広く利用されています。
本記事では、有償製品であるNewRelicとAmazon Elastic Kubernetes Service（EKS）を連携し、導入手順と連携結果をまとめてみました。
![fig21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/864d8d75-e88c-3c9f-e0e2-91d74a449be3.png)



## 前提条件
- Amazon Elastic Kubernetes Service（EKS）v1.23
- New Relic One（執筆時点：2022/12/14）

## 導入手順
New Relicにログインし、Add dataメニューからKubernetesを選択します。
![fig9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/6589411b-c612-5953-efb4-d678bb878e9c.png)


NewRelicアカウントIDと、これから連携するEKSクラスタ識別用の名前を設定します。(今後NewRelicコンソール上に表示される名前です。)
また、エージェントがインストールされるKubernetes上のNamespaceはnewrelicとしました。

![fig10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/1a534490-8cd8-c8e1-ddd8-53be23a8ae3c.png)




次にエージェント導入に関わるオプション設定をしていきます。
今回は、以下の通りの設定としました。
![fig11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/74ac6a29-03ee-c051-bf4d-a1c86b6e6546.png)



上記オプションに関する説明は以下の通りです。
#### Scrape Prometheus endpoints
- クラスター内のPrometheusエンドポイントからメトリクスを収集するか（ON：収集）
⇒ 今回はPrometheus形式のメトリクスは収集しないためOFFとしました。
#### Gather Log data
- Kubernetesコントロールプレーン及び、全てなコンテナログを収集するか（ON：収集）
⇒ 今回はログ収集ありに設定しています。

#### Instant service-level insights, full-body requests, and application profiles through Pixie
- Pixieを導入するか（ON：導入）
⇒ Pixieは、アプリケーションパフォーマンスデータやリクエストデータを収集できるモニタリングツールです。
　 詳しくは[こちら](https://newrelic.com/jp/blog/how-to-relic/pixie-ga)で紹介されています。
　 今回はONにしました。
#### Pixie is already running in this cluster
- Pixieがすでにクラスタ上で起動状態か（ON：起動済）
⇒ 未導入なのでOFFにしました。
#### Set up for unprivileged mode 
- 非特権モードのセットアップを有効化するか（ON：有効）
⇒ 今回は特権モードでセットアップしメトリクス収集します。
　※セキュリティ要件レベルが高い場合は、非特権モードでインストールすることを推奨。

#### Reduce the amount of ingested data
- 取込データ量を削減するか（ON：削減）
⇒ 取込データ量を減らし、NewRelicへの転送コストを減らしたい場合に選択します。今回は削減します。
    
次に、Choose Install method選択画面に移ります。ここではHelm3を選択し、Helmによるインストールを実施していきます。
画面上には、先ほどのオプション設定を反映し、自動作成されたスクリプトが表示されています。
Helmチャートのvalues.yamlのパラメータを上書く設定が入っていますね。
![画像31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/0536598c-b6b6-c1ce-2d5f-6e1ab403a8ca.png)

その他のパラメータに関する説明は以下に載っていますので、必要に応じてご参照ください。
[HelmによるKubernetesインテグレーションのインストール | NewRelic](https://docs.newrelic.com/jp/docs/kubernetes-pixie/kubernetes-integration/installation/install-kubernetes-integration-using-helm/)

次にEKSに接続可能な端末から、Helmコマンドを実行してきます。
端末へのインストールが済んでいない場合は、事前に[こちら](https://helm.sh/ja/docs/intro/install/)からインストールをお願いします。
```
$ helm repo add newrelic https://helm-charts.newrelic.com && helm repo update && \
  kubectl create namespace newrelic ; helm upgrade --install newrelic-bundle newrelic/nri-bundle \
    --set global.licenseKey=YOUR_LICENSE_KEY \
    --set global.cluster=eks-work-cluster \
    --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-pixie.enabled=true \
    --set newrelic-pixie.apiKey=YOUR_PIXIE_API_KEY \
    --set pixie-chart.enabled=true \
    --set pixie-chart.deployKey=YOUR_PIXIE_DEPLOY_KEY \
    --set pixie-chart.clusterName=eks-work-cluster 
```

実行後、しばらく待ってから、kubectlコマンドでPodが起動していることを確認します。
上と同じく、端末へのインストールが済んでいない場合は、事前にインストールをお願いします。
```
$ kubectl get pod -n newrelic
NAME                                                     READY   STATUS      RESTARTS   AGE
kelvin-7756fb8f47-bvjdg                                  1/1     Running     0          72s
newrelic-bundle-kube-state-metrics-547fc6d94f-8m78p      1/1     Running     0          111s
newrelic-bundle-newrelic-logging-2v78z                   1/1     Running     0          111s
newrelic-bundle-newrelic-logging-csps4                   1/1     Running     0          111s
newrelic-bundle-newrelic-pixie-xx58v                     0/1     Completed   0          111s
newrelic-bundle-nri-kube-events-f8ffcd4db-sn8jx          2/2     Running     0          111s
newrelic-bundle-nri-metadata-injection-df5b566d6-k4fnz   1/1     Running     0          111s
newrelic-bundle-nrk8s-ksm-769dcc4d5c-mwt5s               2/2     Running     0          111s
newrelic-bundle-nrk8s-kubelet-tjftj                      2/2     Running     0          111s
newrelic-bundle-nrk8s-kubelet-zg5s4                      2/2     Running     0          111s
pl-nats-0                                                1/1     Running     0          76s
vizier-cloud-connector-d578bcf4f-56pnx                   1/1     Running     0          72s
vizier-metadata-0                                        1/1     Running     0          72s
vizier-pem-c6gff                                         1/1     Running     0          72s
vizier-pem-flmpr                                         1/1     Running     0          72s
vizier-query-broker-6b795b84b7-q95mk                     1/1     Running     0          72s
```
Podが起動すると、NewRelicコンソール側でもこのようにエージェントとの連携ができたことを確認できます。
![fig13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/df1551cf-a919-b96c-62f5-0716dd40de80.png)

## インストールされるリソース
導入が終わりましたので、いったんここでは実際にインストールされたエージェントについて詳しくみていきます。
今回の環境で導入したKubernetesリソースのうち、いくつかをピックアップして記載してみました。
参考：[Kubernetes 統合バージョン 3 で導入された変更 | NewRelic](https://docs.newrelic.com/jp/docs/kubernetes-pixie/kubernetes-integration/advanced-configuration/changes-since-v3/)

|オブジェクト |名前 |説明 |
|:-----------|:------------|:------------|
| ReplicaSet       | newrelic-bundle-kube-state-metrics        | kube-state-metricsのエクスポータ。<br>kube-state-metricsは、Podの情報やDeploymentやStatefulSetの正常に稼働しているPodの数などの多くの情報を収集する。 |
| ReplicaSet     | newrelic-bundle-nrk8s-ksm      | kube-state-metricsからメトリクスを収集しNewRelicに送信する。       |
| ReplicaSet       | newrelic-bundle-nri-kube-events        | KubernetesイベントをNewRelicに送信する 。        |
| DaemonSet    | newrelic-bundle-nrk8s-kubelet     | Kubeletから取得したCPU、メモリなどのインフラメトリクスを収集し、NewRelicに送信する。      |
| DaemonSet    | newrelic-bundle-newrelic-logging     | ログをNewRelicに転送するためのコンポーネント。<br>FluentBitプラグインを利用し転送する。      |
| DaemonSet    | vizier-pem     | Pixieのコンポーネント。<br>eBPFを用いてテレメトリーデータの収集やデータの一時保管を行う。      |


概要図としてまとめると、以下のようなイメージになります。
今回は2 ノード構成としているため分かりにくいですが、各ノードで起動するDaemonSetとクラスター内で任意のレプリカ数起動するReplicaSetの2種類のPodが稼働しています。
また、メトリクス、ログ、トレースの収集・転送といった各役割毎にPodを構成していることがわかります。
※ vizier-pem等のPixieコンポーネントは、Pixieエージェントとしてまとめて表記しています。
![fig14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/3ad1e480-08c5-2e82-dcef-115db5266465.png)

## NewRelicでの可視化
それでは、NewRelicでどのように可視化されるか確認していきます。

### Kubernetesダッシュボード
Infrastructureメニュー > Third-party-servicesからKubernetes dashboardを選択します。
![fig15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/36ae5fd0-7b00-e945-1fab-bb22321fa882.png)

Kubernetesダッシュボードでは、Kubernetesクラスタのオブジェクト数やPod数、各コンテナ毎のメトリクス、Deploymentに関する情報など
クラスタ全体の様々な情報を数値、グラフ等で可視化することができます。
また、Filterメニューからクラスタやノード、Podなどの属性でフィルタすることもできます。
![fig16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/2a3ef8a0-609a-7315-6038-8b7ede33a432.png)
![fig17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/36ea08dc-68ce-3a91-0fd9-e03298610c00.png)

### Kubernetes Cluster Explorer
Infrastructureメニュー > Kubernetesから参照するクラスタ識別子を選択します。
![fig22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/45696289-1ceb-f990-6681-8eeb9a6d505b.png)
Kubernetes Cluster Explorerでは、以下の通りPod、ノードをマップとして表現しています。
1つ1つのハニカムがPodとなっており、Podのステータスを色や配置箇所（中心からの位置）で表現しているため、
全体を俯瞰し一目で問題のあるPodを特定することができます。
また、稼働しているNodeもマップ上でわかるようになっています。
![fig23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/259b1199-9d12-8b6e-3d76-1cd8d72d5a70.png)

Podを選択すると、そのPodにひもづくコンテナのCPU使用量やメモリ使用量、スループット等を確認でき、
また、そこからPodやコンテナの詳細画面、ログ、APM&Service画面へ遷移することができます。
※ 補足：選択しているbackend-appアプリケーションは、以下参考文献2で紹介されていたJavaサンプルアプリケーションを利用
![fig26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/a0ba64f2-548d-af61-5963-1e1e869b032a.png)
以下は、Podの See logリンク（上画像の右上箇所）から遷移した後のログ画面です。
上部のテキストボックスでクエリを編集することも可能です。
![fig27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/bbdf26c4-725a-8878-30cb-b4ad00b9f3b8.png)
また、先ほどのPodを選択した状態からCheck metrics in Pixieリンクを押下すると、
以下の通り対象のサービスに対するHTTPリクエスト、レスポンスの情報といったアプリケーションの性能情報を得ることもできました。
![fig28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/843f77b9-af76-c1b2-d01b-7a63a3d92765.png)
![fig29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/fe649cc7-2c8a-f771-dab6-8c88b31d805d.png)
![画像30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953560/650bf9b3-5b60-64d0-8618-7662424c0e77.png)

## まとめ
NewRelicとEKSを連携してみました。
連携は非常に簡単で、数分でインストールとダッシュボード上での可視化ができることにも驚きました。
また、クラスターに何かしらの問題が起きた際にはCluster ExplorerからPod・ノードの状態を確認することで
いち早いボトルネックの特定にもつながり、このような非常に有用なダッシュボードが揃っていると感じました。
Podを選択しドリルダウンして、各コンテナのメトリクス、ログ、トレースデータをすばやく参照できるのも非常に良いですね。

## 参考文献
この記事は以下の情報を参考にして執筆しました。

1. [New Relic実践入門 監視からオブザーバビリティへの変革| 翔泳社](https://www.shoeisha.co.jp/book/detail/9784798166599)
2. [Kubernetes on AWS ～アプリケーションエンジニア 本番環境へ備える| リックテレコム](https://www.ric.co.jp/book/development/detail/266)
3. [Kubernetesインテグレーションの紹介| NewRelic](https://docs.newrelic.com/jp/docs/kubernetes-pixie/kubernetes-integration/get-started/introduction-kubernetes-integration/)