New Relic・Pixieを使いKubernetesを可視化する

# はじめに
この記事はNew Relic Advent Calendar 2022の4日目の記事です。

https://qiita.com/advent-calendar/2022/newrelic

New Relic、よく名前は聞くものの使ったことはなく、Advent Calendarをきっかけとしてちょっと触ってみようと思い立ちました。
昨年のアドベントカレンダーで@inductor氏が紹介していた[Pixie](https://newrelic.com/jp/platform/kubernetes-pixie)がどんなものか気になるというのもあり、いろいろ見てみようと思います。  

https://blog.inductor.me/entry/2021/12/06/152734

# 試した環境
導入先のKubernetesとして Azure Kubernetes Service(AKS) v1.23.12 を使用しました。

# KubernetesにNew Relicを導入する
では早速KubernetesクラスターにNew Relicのエージェントを導入してみましょう。  
ブラウザでNew Relicにログインし、Install New Relicから `Kubernetes` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/d066a47b-12fd-fbf8-5e56-fbcf5b7ca798.png)

`Begin installation` ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/9eae2d7f-f9df-1249-3043-7e9001c00341.png)

以下の項目を入力します。
- We'll send your data to this account: データ送信先のNew Relicアカウントを選択します。1つしかアカウントがなければそのままでOKです。
- Cluster Name: New Relic上で表示されるKubernetesクラスターの名前を入力します。今回は`AKS`という名前にしました。
- Namespace for the integration: New RelicのエージェントがデプロイされるKubernetesのNamespaceを入力します。今回はデフォルトの`newrelic`のままとします。

入力が終わったら`Continue`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/f6a3b51e-c2b1-d01e-e538-80e901ba8ea7.png)


その他の導入オプションを選択する画面が表示されます。  
今回はデフォルトのまま進めます。下部の`Continue`ボタンをクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/4dffcea4-4c07-55ff-d80c-c5301256b524.png)

次の画面でインストール用の手順が表示されます。
- New Relic CLIを使ってインストールする（Guided Install）
- Helm 3でインストールする
- Manifestを生成する

という3種類の手順があります。今回はHelm 3を選びました。  
表示された手順をコピーして実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/e5073915-d606-02e6-26dd-5ad1e6491ecd.png)

```sh
"newrelic" has been added to your repositories
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "newrelic" chart repository
Update Complete. ⎈Happy Helming!⎈
namespace/newrelic created
NAME: newrelic-bundle
LAST DEPLOYED: Sat Dec  3 17:19:10 2022
NAMESPACE: newrelic
STATUS: deployed
REVISION: 1
TEST SUITE: None
```

デプロイされたPodの起動状態を確認してみましょう。

```sh
kubectl get pod -n newrelic
```
全て`Running`か`Completed`になっていれば大丈夫です。  

```sh
NAME                                                      READY   STATUS      RESTARTS      AGE
kelvin-655b8fdccd-cw9l8                                   1/1     Running     0             2m54s
newrelic-bundle-kube-state-metrics-547fc6d94f-fx7vt       1/1     Running     0             4m21s
newrelic-bundle-newrelic-pixie-fq8mg                      0/1     Completed   0             4m21s
newrelic-bundle-newrelic-prometheus-agent-0               1/1     Running     0             4m21s
newrelic-bundle-nri-kube-events-f8ffcd4db-vfgvt           2/2     Running     0             4m21s
newrelic-bundle-nri-metadata-injection-7f9d67967f-c8xw8   1/1     Running     0             4m21s
newrelic-bundle-nrk8s-ksm-8448567987-tcx6v                2/2     Running     0             4m21s
newrelic-bundle-nrk8s-kubelet-6sk84                       2/2     Running     0             4m21s
newrelic-bundle-nrk8s-kubelet-gdksv                       2/2     Running     0             4m21s
newrelic-bundle-nrk8s-kubelet-xd9gm                       2/2     Running     0             4m21s
pl-nats-0                                                 1/1     Running     0             3m3s
vizier-cloud-connector-fd69bb6cd-ksw6r                    1/1     Running     0             2m54s
vizier-metadata-0                                         1/1     Running     0             2m54s
vizier-pem-nl9mc                                          1/1     Running     0             2m54s
vizier-pem-tsb4f                                          1/1     Running     0             2m54s
vizier-pem-v8nj2                                          1/1     Running     0             2m54s
vizier-query-broker-5c5cc5c684-fcfrl                      1/1     Running     2 (53s ago)   2m54s
```

New Relicの画面に戻り、`Continue`ボタンをクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/bf6321e5-8abb-b8f6-96e3-709cfb78e30e.png)

少し待つと`We are successfully receiving data from your cluster. 🎉`と表示されます。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/d70a4503-3879-9199-ed37-03f29e7acf8f.png)

これでNew Relicの導入は完了です。
`Kubernetes cluster explorer`のボタンをクリックすると、以下のようなKubernetesを可視化した画面が表示されます。  
オシャレですね。カッコいい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/0f995431-7178-4c47-9333-99ec107349ae.png)

New RelicでKubernetes用のダッシュボード定義があらかじめ準備されており、ポチポチクリックするだけでKubernetesクラスターの概況をサクッと表示することができます。便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/43fd43d6-9834-0e01-ba94-79c6dc5f43be.png)


# Pixie
[Pixie](https://px.dev/)は[CNCFのSandbox Project](https://www.cncf.io/projects/pixie/)となっているモニタリングツールです。  
eBPFを用いた情報収集が特徴で、アプリケーションに手を入れずとも色んな情報を取得することができます。  
デフォルトの設定でNew Relicをインストールすると、Pixieも一緒に導入されます。前項で実行したHelmのコマンド内でも`--set pixel-chart.enabled=true`というオプションが指定されていました。表示部分もNew RelicのGUIに統合されています。

Pixieでどういった情報を見ることができるか、いくつかピックアップしてご紹介します。  

## HTTPリクエストの可視化
Kubernetesのサービスに対するリクエストを可視化することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/be164e7b-c873-d05f-5c29-f44ab821ada0.png)

リクエスト数やエラーレート、レイテンシのグラフ表示も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/931856f7-71fd-3f8c-28d5-4c410394145d.png)

サービス単位だけじゃなく、Pod単位に掘り下げて表示することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/2cf0d03e-7d60-3777-fc71-1dd64b612849.png)

## フレームグラフ
Podの画面ではパフォーマンスのフレームグラフまで表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/9f728f24-cee1-53e3-b7f2-d546938a814e.png)

上記のPodはDockerオフィシャルのnginxをそのままデプロイしたもので、Pod側には何も手を加えていません。  
プログラム内にエージェントを仕込むことなくこれらの情報が取得できるということですね。  

## SQLの可視化
インバウンドのリクエストだけでなく、RDBMSに対して発行したSQLの情報を取得することもできます。  
以下のように発行したSQLごとのSQL文・レスポンスデータ・レイテンシーを一覧表示できます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/5caa4f85-0ac0-e426-b886-dfb70a89cd5e.png)

特定のSQLのレイテンシーの推移をP50/P90/P99のパーセンタイルでグラフ表示することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/16f2aebd-91c8-cf7b-d6a8-40cb976bcd97.png)

本機能の対象となるRDBMSはPostgreSQLとMySQLの2つです。  

下記の一覧を見る限り、RDBMS以外にもRedis/Kafka/Cassandraの情報取得にも対応しているようです。

https://docs.px.dev/about-pixie/data-sources/

# おわりに
New Relic(とPixie)を導入するだけで、Kubernetesの様々な情報が簡単に可視化できました。アプリケーションに手を入れずとも情報が取れるというのは便利ですね。  

ところで解決できなかった問題が一点。
[このページ](https://docs.px.dev/about-pixie/pixie-ebpf/)にある図の内容からするとOpenSSLで暗号化された通信内容の取得にも対応してるのかなと思ったのですが、PostgreSQLへの接続時にSSLを無効化しないと情報が取れず…。  
設定とか環境の問題かと思いつつアドベントカレンダーの日程的にここでタイムアップ。どなたか詳しい方がツッコミ入れてくれると信じてこのまま投稿します…。