📖

Grafanaを使ったKubernetesのパフォーマンス可視化

に公開

この記事について

こんにちは、東京大学鈴村研究室で、インフラエンジニアとしてお手伝いさせていただいています、福田と申します。

https://sites.google.com/view/toyolab/鈴村研究室概要

これまで、クラウド基盤mdxの上でKubernetes環境を構築し、サーバレスWebアプリケーションを開発するための手順や、分散学習を行うための手順について説明してきました。

https://zenn.dev/suzumura_lab/articles/627b5063d6884d

はじめに

KubernetesとKNativeを使ってWebサービスを動かすと、リクエスト数やレイテンシなどのメトリクスを監視したくなります。
そのために、Prometheus + Grafanaを導入すると、わかりやすいダッシュボードでリアルタイムに状況を確認できます。

この記事では、以下の流れで Grafana を導入して、KNativeのリクエスト数を可視化してみます。

  1. KNativeの環境を用意する
  2. Prometheusをインストールする
  3. Grafanaをインストールする
  4. ダッシュボードを設定してKNativeのメトリクスを可視化する

前提環境

  • Kubernetesクラスタが構築されていること
  • KNative Servingがインストール済み
  • kubectlが利用可能

踏み台サーバへの接続

いつもの通り、mdx踏み台サーバに接続します。
PCにインストールされたLENSからもアクセスできるように、kube masterへのssh portfowardを有効にします。

eval `ssh-agent`
ssh-add ~/.ssh/(ssh公開秘密鍵のファイル名)
ssh -L 6443:(master nodeのPrivate IPアドレス):6443 -A mdxuser@(踏み台サーバのGlobal IPアドレス)

Prometheusスタックのセットアップ

Helmを使用したPrometheusスタックのインストール

まず、以下の内容で、values.yamlを作成します。

kube-state-metrics:
  metricLabelsAllowlist:
    - pods=[*]
    - deployments=[app.kubernetes.io/name,app.kubernetes.io/component,app.kubernetes.io/instance]
prometheus:
  prometheusSpec:
    serviceMonitorSelectorNilUsesHelmValues: false
    podMonitorSelectorNilUsesHelmValues: false

Helmを利用して、prometheusをインストールします。
ここで、先ほどの手順で作成した、values.yamlをinstall時の引数に指定します。
このコマンドは、踏み台サーバで実行しても、LENSのTerminalから実行してもOKです。

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 先ほどの手順で作成した、values.yamlをここで指定する
helm install prometheus prometheus-community/kube-prometheus-stack -n default -f values.yaml

ServiceMonitors/PodMonitorsの適用

ServiceMonitors/PodMonitorsを適用して、Knativeからメトリックスを収集できるようにします。

kubectl apply -f https://raw.githubusercontent.com/knative-extensions/monitoring/refs/heads/opencensus/servicemonitor.yaml

Grafanaダッシュボードのインポート

以下のコマンドを実行して、KNativeのメトリックスを可視化できるダッシュボードをインストールします。

curl -sL https://raw.githubusercontent.com/knative-extensions/monitoring/refs/heads/opencensus/grafana/dashboards.yaml \
| yq 'select(.kind == "ConfigMap" and (.metadata.name | test("knative-serving")))' \
| kubectl apply -f -

なお、このコマンドを実行するには、yqがインストールされていることが前提です。
踏み台サーバで実行している場合、以下のコマンドでyqをインストールします。

sudo snap install yq

ここでyqを使っている理由としては、yqはyamlを操作できるコマンドですが、デフォルトのdashboards.yamlには、KNative Servingだけでなく、KNative Eventingのダッシュボードも含まれています。
この記事においては、KNative Eventingのインストールは前提としていないため、そのままのyamlファイルで、ダッシュボードをインストールしてしまうと、インストールに失敗してしまいます。
このため、yqコマンドを使って、knative-servingに必要なダッシュボードだけをインストールするようにしています。

GrafanaへのWebブラウザからのアクセス

Grafanaは prometheus-grafana というプライベートサービスとして公開されています。
このGrafanaにWebブラウザからアクセスするための手順を示します。

LENSのターミナルから、以下のコマンドを実行し、port番号3000でのアクセスを有効にします。

kubectl port-forward -n default svc/prometheus-grafana 3000:80


Webブラウザで、http://localhost:3000 にアクセスします。
すると以下の画面が表示されます。

ここで、IDとpasswordは以下を入力します。

ユーザー名: admin
パスワード: prom-operator

ログインすると、以下の画面が表示されます。
そこでdashboardsのメニューを選択します。

dashboardsには、KNative Serving関連のダッシュボードがあることが確認できます。

その中の1つ、「Knative Serving - Revision HTTP Requests」を選択すると、 以下のような画面が確認できます。

特にアクセスがないと No Dataと表示されたままですが、試しに、デプロイ済みのKNative Webサービスに何回かアクセスすると、Request Volumeなどの数字が表示されるようになります。

まとめ

この記事では、KNative + Kubernetes上で Prometheus + Grafana を導入し、リクエスト数を可視化する方法を紹介しました。
これで、KNativeで動くサービスの監視基盤をすぐに試すことができます。

今回の記事では、Grafanaの導入だけを説明しましたが、Grafanaには、一定の負荷を超えた場合に、メールやslackで通知するなど、本当に多くの機能があります。
気になる方は、以下のオフィシャルサイトを見てみてください。
https://grafana.com/docs/grafana/latest/
この連載でも、いずれGrafanaの詳細機能について説明していく予定です。

東京大学鈴村研究室について

https://sites.google.com/view/toyolab/鈴村研究室概要

Discussion