Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Kube-Prometheus-Stack HelmチャートでカスタムGrafanaダッシュボードをコード管理する方法

By Abrar AliApr 11, 20225 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

この方法なら、Grafanaを再デプロイしても、別の環境やクラスターに展開しても、ダッシュボードはそのまま残ります。

How-to-add-custom-Grafana-dashboards-in-code

再デプロイや別環境への展開でもダッシュボードを失わない方法

Prometheusは事実上の標準監視ツールとなっており、GrafanaやAlertmanagerと組み合わせることで、多くの組織がオブザーバビリティとアラートのスタックをまるごと構築しています。

とはいえ、これらを個別に管理・デプロイするのは手間がかかり、インフラの変更に合わせて各コンポーネントの整合性を保つのも一苦労です。そこで役立つのが、prometheus-communityがメンテナンスする kube-prometheus-stack Helmチャートです。これを使えば、3つのツールの設定を1つのHelm values ファイルにまとめて管理できます。本記事では、Helmチャート内でGrafanaダッシュボードを追加する方法を紹介します。これにより、Grafanaを再デプロイしても別の環境/クラスターに展開しても、ダッシュボードがそのまま残るようになります。

前提条件

まずはkube-prometheus-stack Helmチャートを含むリポジトリをクローンします。チャートをリモートから取得して適用する方法では、カスタムダッシュボードをコードとして保持できません。ローカルにコピーしたチャートから適用する場合にのみ追加が可能だからです。あわせて、作業用マシンに以下のツールをインストールしておきます。

  • Git
  • Helm
  • Kubectl
  • お好みのIDE
$ git clone https://github.com/prometheus-community/helm-charts.git
$ cd helm-charts/charts/kube-prometheus-stack

chartsフォルダーに入ったら、Grafanaダッシュボードのフォルダーへ移動します。ここに、標準で同梱されているダッシュボードがすべて格納されています。

$ cd templates/grafana/dashboards-1.14/
$ ls
alertmanager-overview.yaml grafana-overview.yaml
k8s-resources-pod.yaml namespace-by-workload.yaml
pod-total.yaml statefulset.yaml
apiserver.yaml k8s-coredns.yaml
k8s-resources-workload.yaml node-cluster-rsrc-use.yaml

ご覧のとおり、grafanaのインストールには多数のダッシュボードが付属しています。これらは、このdashboardsディレクトリに含まれるconfigmapsテンプレートを適用することで反映されます。

カスタムダッシュボードをエクスポートする

Grafanaでカスタムダッシュボードを作成して保存したら、次のステップでconfigmapに追加するためのJSONをエクスポートします。ダッシュボード上の歯車アイコンをクリックし、左側のペインから「JSON Model」を選択します。表示されたJSONをコピーして、後で使えるよう保存しておきます。

graphana-dashboards

kube-prometheus

カスタムダッシュボードを追加する

続いて、独自のconfigmap Helmテンプレートをdashboardsフォルダーに追加します。一番手軽なのは、フォルダー内の既存のyamlファイルを1つ複製し、ダッシュボード名にリネームしてJSONを差し込む方法です。今回の例では、先ほどのカスタムダッシュボードに合わせて「time-series-graph.yaml」とします。それでは、テンプレートを書き換えていきましょう。まず、ファイル冒頭の以下のコメント部分を削除します。

{{- /*
Generated from 'alertmanager-overview' from https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/grafana-dashboardDefinitions.yaml
Do not change in-place! In order to change this file first read following link:
https://github.com/prometheus-community/Helm-charts/tree/main/charts/kube-prometheus-stack/hack
*/ -}}

次に、ConfigMapの名前を数か所書き換えます。まずはこの部分です。

apiVersion: v1
kind: ConfigMap
metadata:
namespace: {{ template "kube-prometheus-stack-grafana.namespace" . }}
name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "alertmanager-overview" | trunc 63 | trimSuffix "-" }}

テンプレートのコピー元である「alertmanager-overview」を、ダッシュボード名およびyamlファイル名に合わせて「time-series-graphs」に変更します。

apiVersion: v1
kind: ConfigMap
metadata:
namespace: {{ template "kube-prometheus-stack-grafana.namespace" . }}
name: {{ printf "%s-%s" (include "kube-prometheus-stack.fullname" $) "time-series-graph" | trunc 63 | trimSuffix "-" }}

次に、configmapテンプレートのdataセクションの名前を以下のように変更します。

data:
alertmanager-overview.json: |-

data:
time-series-graph.json: |-

続いて、既存のダッシュボードのJSONを、grafanaのダッシュボード設定からコピーしておいたJSONに置き換えます。以下のようにこの行の直下に配置し、JSON全体を必ず1タブ以上インデントしてください。

data:
  time-series-graphs.json: |-
    {
        "__inputs": [\
\
        ],
        "__requires": [\
\
        ],
        "annotations": {
            "list": [\
\
            ]
        },
        "editable": false,
        "gnetId": null,
        "graphTooltip": 1,
        "hideControls": false,
        "id": null,
        "links": [\
\
        ],
        "refresh": "30s",
        "rows": [\
...\
```\
\

レンダリング後のHelmテンプレートを生成する\

ダッシュボードのconfigmap Helmテンプレートのyamlファイルを追加できたので、Helmチャートから生成されるyamlマニフェストを確認し、ダッシュボード用のConfigMapが正しく生成されているか検証します。
\

# 必要なチャート用にHelmへリポジトリを追加\
$ Helm repo add grafana https://grafana.github.io/Helm-charts\
\
$ Helm repo add prometheus-community https://prometheus-community.github.io/Helm-charts\
\
# チャートの依存関係を取得して更新\
$ Helm dependency build\
\
$ Helm repo update\
```\
\
これでHelm templateコマンドを実行し、Helmテンプレートからyamlマニフェストをレンダリングして、後で確認できるようにファイルへ保存できます。--validateフラグを付けることで、現在のKubernetesクラスターのコンテキストに対して有効なyaml Kubernetesマニフェストになっているかをチェックします。\
\
```\
$ Helm template kube-prometheus-stack . --validate > rendered-template.yaml\
```\
\
次にrendered-template.yamlファイルの中身を確認し、ConfigMapが作成されており、次のステップでHelm installコマンドを実行した際に適用されることを確かめます。\
\
```\
$ cat rendered-template.yaml\
…\
---\
# Source: kube-prometheus-stack/templates/grafana/dashboards-1.14/time-series-graphs.yaml\
apiVersion: v1\
kind: ConfigMap\
metadata:\
  namespace: default\
  name: kube-prometheus-stack-time-series-graphs\
  annotations:\
    {}\
  labels:\
    grafana_dashboard: "1"\
    app: kube-prometheus-stack-grafana\
    app.kubernetes.io/managed-by: Helm\
    app.kubernetes.io/instance: kube-prometheus-stack\
    app.kubernetes.io/version: "32.2.1"\
    app.kubernetes.io/part-of: kube-prometheus-stack\
    chart: kube-prometheus-stack-32.2.1\
    release: "kube-prometheus-stack"\
    heritage: "Helm"\
data:\
  time-series-graphs.json: |-\
    {\
      "annotations": {\
        "enable": false,\
        "list": [\
          {\
            "builtIn": 1,\
            "datasource": "-- Grafana --",\
            "enable": true,\
            "hide": true,\
            "iconColor": "rgba(0, 211, 255, 1)",\
            "name": "Annotations & Alerts",\
```\
\
ファイル内で「time-series」を検索すれば、ConfigMapが作成されており、dataに先ほど追加したダッシュボードのJSONが含まれていることがすぐに確認できます。\
\
最後にHelmチャートをKubernetesクラスターに適用し、Grafanaが起動したらダッシュボードが表示されることを確認しましょう。\
\
```\
$ Helm install kube-prometheus-stack .\
```\
\
![graphana-dashboards](https://media.doit.com/imports/wordpress/2022/04/f4aa0c1fd59e-graphana-dashboards.jpg)\
\

関連ブログ\

amazon bedrock pricing
\

Amazon Bedrockの料金:AIコストを管理するCloudOps向けガイド\

Amazon Bedrockは処理した入力・出力トークン単位で課金され、コストはモデル、料金モード、workloadによって変わります

databricks pricing explained
\

Databricksの料金を解説:DBU、ティア、コスト管理\

Databricksはコンピュートに対してDatabricks Units(DBU)で秒単位の課金が行われ、これとは別にお使いの

cloud infrastructure
\

クラウドインフラストラクチャサービスとは?CloudOps向けガイド\

コンピュート、ストレージ、ネットワーキングを含むクラウドインフラストラクチャサービスは、CloudOpsチームが日々運用する基盤そのものです。最適な

検索

検索
\

担当チームとの打ち合わせを予約\

地域を選択AmericasEMEAAPAC次のステップで日時の選択肢が表示されます