Kubernetes(GKE)+PrometeusにGrafanaを導入する

前回記事で、GKE(Google Kubernetes Engine)+Prometeusの環境を構築しました。本記事では、Grafanaを導入する手順を記載していきます。

Prometheusの公式ドキュメントを参考に進めていきます。

利用するイメージとデフォルト設定の確認

Prometheusの公式ドキュメントの『Installing』の章に記載されている以下のリンクを辿ります。Grafanaのダウンロードページに案内されます。

To install Grafana see the official Grafana documentation.

初期ページは『Linux』が選択されています。今回はGKE上で稼働させるため、『Docker』を選択します。

同ページの『installation guide』を参考に、公式のGrafanaのイメージを構成していきます。

こちらでデフォルトで設定されているパス設定を確認します。このパス設定は、環境変数で指定されているため、変更するには設定ファイル(conf/grafana.ini)ではなく、環境変数を変更する必要があるようです。

上記の『Default Paths』に記載があるように、設定ファイルは、/etc/grafana/grafana.ini に、データ領域は、/var/lib/grafana にあることがわかります。

PVCを作成

Grafana container with persistent storage (recommended)』という章があるように、永続ストレージを利用することがrecommendedされています。本項では、永続ボリュームを要求するPVC(persistentVolumeClaim)を作成します。

利用するボリュームサイズは、監視対象のユーザ/データソース/ダッシュボード/プラグインなどに依存します(※ 情報元)。個人利用の環境のため、適当に10GBぐらいで作成してみます。

○ grafana_pvc.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana-pvc
  namespace: monitoring
  labels:
    app: grafana-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi


以下コマンドを実行し、PVCを作成します。

kubectl create -f grafana_pvc.yml

Deploymentを作成

以下のDeploymentファイルを作成します。

○ grafana_deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: monitoring
  labels:
    app: grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
        - image: grafana/grafana:6.4.2
          name: grafana
          ports:
            - containerPort: 3000
              name: grafana
          volumeMounts:
            - name: grafana-storage-volume
              mountPath: /var/lib/grafana
      volumes:
        - name: grafana-storage-volume
          persistentVolumeClaim:
            claimName: grafana-pvc
      securityContext:
        runAsUser: 472
        fsGroup: 472
        runAsNonRoot: true


・Dockerイメージの 6.4.0 より、ベースイメージがDebianからAlpineに変更されているため、6.4.x系の10月14日時点で最新である 6.4.2を利用します。

v6.4.0-beta1
 ・Switch base image from ubuntu:18:04 to Alpine 3.10

https://hub.docker.com/r/grafana/grafana

・Grafanaの設定ファイル(/etc/grafana/grafana.ini)は、動作確認用途のためデフォルトのまま利用します。適宜ConfigMap等を利用して、設定を変更してください。

・securityContextで、grafanaユーザ(472)、grafanaグループ(472)を指定します。


以下コマンドを実行し、Deploymentを作成します。

kubectl create -f grafana_deployment.yml

Grafanaのデータソースを設定

まず、Grafanaの管理画面に接続するため、Grafanaの管理画面にポートフォワードします。

以下コマンドで、稼働中のpodを確認します。

kubectl get pods --namespace=monitoring
NAME                          READY   STATUS    RESTARTS   AGE
grafana-847fcfb699-cvlwc      1/1     Running   0          11m
prometheus-7454d8ff8c-ghfk8   1/1     Running   0          17h

上記で確認したgrafanaのPodにポートフォワードします。

kubectl port-forward grafana-847fcfb699-cvlwc 3000:3000 --namespace=monitoring

以下URLに接続し、Grafanaの管理画面に接続します。

http://localhost:3000

ログイン画面が表示されます。

デフォルトでは、ユーザ/パスワードが admin/admin でログインできます。

初回ログインすると、ログインパスワードの変更を求められます。画面に従ってパスワードを変更します。

トップ画面が表示されます。Add data source を選択します。

以下画面が表示されます。Prometheus欄にあるSelectを選択します。

URLには、こちらで設定したservice名とポートを指定し、「Save&Test」を選択します。

問題なくSaveされた旨が表示されたら、GrafanaのHOME画面に戻ります。

Grafanaダッシュボードを作成

Prometheus公式ドキュメントの『Importing pre-built dashboards from Grafana.com』に記載があるように、Grafana.comより、Data SourceをPrometheusでFillterして良さげなダッシュボードを探してImportするのが良いです。

ざっと検索して、Download数が多かったこちらをimportしてみた状態が以下です。


ところどころ取得できていないグラフがあるのが確認できます。画像2枚目のように、Podごとのメモリ使用量や、PVの使用率を取得できている箇所もあります。

以上からわかるように、適切なモニタリングを行うには、取得したメトリクスを元にダッシュボードを作成する必要がありそうです。ダッシュボードを作成するには、こちらのQiita記事が参考になりそうでした。

とりあえず入れてみるレベルの導入は行えましたが、本番で運用するには、Grafanaの設定やPrometheusの設定、ダッシュボードの作成など取り組む作業は多そうです。そのあたりについても、随時記事にしていければと思います。