コンテンツにスキップ

ConfigMap系@Grafana

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. grafana-datasource-cm

grafana-datasource-cmとは

Grafanaのdatasource.yamlファイルを管理する。


サイドカー (grafana-sc-datasources)

Grafanaのコンテナが起動する前に、データソースをセットアップする。

apiVersion: v1
kind: Pod
metadata:
  name: grafana-pod
  namespace: prometheus
spec:
  containers:
    # grafanaコンテナ
    - name: grafana
      image: grafana/grafana:8.0.0

      ...

    # サイドカー
    - name: grafana-sc-datasources
      image: quay.io/kiwigrid/k8s-sidecar:1.14.2

      ...

      env:
        - name: METHOD
          value: LIST
        - name: LABEL
          value: grafana_datasource
        - name: FOLDER
          value: /etc/grafana/provisioning/datasources
        - name: RESOURCE
          value: both
      volumeMounts:
        - mountPath: /etc/grafana/provisioning/datasources
          name: sc-datasources-volume
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-api-access-****
          readOnly: "true"


datasources

▼ datasourcesとは

Grafanaのデータソースを設定する。

▼ Prometheusの場合

Prometheusの場合、ビルトインのプラグインを使用できる。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  datasource.yaml: |
    apiVersion: 1
    datasources:
      - name: prometheus
        type: prometheus
        url: http://<PrometheusのService名>.<PrometheusのNamespace名>:9090/
        access: proxy
        # デフォルトのデータソースとするか否かを設定する
        isDefault: "true"
        jsonData:
          timeInterval: 30s

▼ VictoriaMetricsの場合

VictoriaMetricsの場合、ビルトインのprometheusタイプを使用できる。

VictoriaMetricsからメトリクスのデータポイントを収集するために、PromQLを実行する必要がある。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  datasource.yaml: |
    apiVersion: 1
    datasources:
      - name: victoria-metrics
        type: prometheus
        url: http://<VictoriaMetricsのサーバーのIPアドレス>:8248/
        access: proxy
        isDefault: "false"
        jsonData:
          timeInterval: 30s

▼ AWS CloudWatchの場合

AWS CloudWatchの場合、cloudwatchタイプを指定する。

AWS CloudWatch-APIからメトリクスのデータポイントを収集するために、自前のクエリを送信する必要がある。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  datasource.yaml: |
    apiVersion: 1
    datasources:
      - name: CloudWatch
        type: cloudwatch
        jsonData:
          authType: default
          defaultRegion: ap-northeast-1


02. grafana-ini-cm

Grafanaのgrafana.iniファイルを管理する。


02-02. grafana.ini

auth.anonymousセクション

ユーザー名とパスワード無しでログインできるようにする。

login_cookie_nameもデフォルト (grafana_session) 以外に変更する必要がある。

anonymousユーザーは、デフォルトでViewerロールを持つ。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [auth]
    login_cookie_name = anonymous_session
    [auth.anonymous]
    enabled = true
    org_role = Viewer


auth.generic_oauthセクション

KeycloakをIDプロバイダーとして、SSOでログインできるようにする。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [auth.generic_oauth]
    enabled = true
    name = Keycloak-OAuth
    allow_sign_up = true
    client_id = YOUR_APP_CLIENT_ID
    client_secret = YOUR_APP_CLIENT_SECRET
    scopes = openid email profile offline_access roles
    email_attribute_path = email
    login_attribute_path = username
    name_attribute_path = full_name
    auth_url = https://<PROVIDER_DOMAIN>/realms/<REALM_NAME>/protocol/openid-connect/auth
    token_url = https://<PROVIDER_DOMAIN>/realms/<REALM_NAME>/protocol/openid-connect/token
    api_url = https://<PROVIDER_DOMAIN>/realms/<REALM_NAME>/protocol/openid-connect/userinfo
    role_attribute_path = contains(roles[*], 'admin') && 'Admin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'


auth.githubセクション

GitHubをIDプロバイダーとして、SSOでログインできるようにする。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    enabled = true
    client_id = YOUR_GITHUB_APP_CLIENT_ID
    client_secret = YOUR_GITHUB_APP_CLIENT_SECRET
    scopes = user:email,read:org
    auth_url = https://github.com/login/oauth/authorize
    token_url = https://github.com/login/oauth/access_token
    api_url = https://api.github.com/user
    allow_sign_up = true
    auto_login = false
    team_ids = 150,300
    allowed_organizations = ["My Organization", "Octocats"]
    allowed_domains = mycompany.com mycompany.org
    role_attribute_path = [login=='octocat'][0] && 'GrafanaAdmin' || 'Viewer'


pathsセクション

記入中...

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [paths]
    ...


serverセクション

記入中...

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [server]
    ...


dashboardセクション

▼ min_refresh_interval

ダッシュボードのPromQLの自動更新間隔の最小値を設定する。

自動更新間隔のデフォルト値が変わるわけではないことに注意する。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [dashboard]
    min_refresh_interval = 5s
    default_home_dashboard_path = /var/lib/grafana/dashboards/local/home.json


databaseセクション

記入中...

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [database]
    ...


remote_cacheセクション

記入中...

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [remote_cache]
    ...


date_formatsセクション

▼ date_formatsセクション

時間に関して設定する。

▼ default_timezone

タイムゾーンを設定する。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [date_formats]
    default_timezone = Asia/Tokyo


usersセクション

▼ usersセクション

記入中...

▼ default_theme

ダッシュボードのデフォルトのテーマを設定する。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [users]
    default_theme = light

▼ home_page

Grafanaのダッシュボードのホームを設定する。

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  grafana.ini: |
    [users]
    # foo.grafana.com/dashboards がホームになる。
    home_page = dashboards


02-03. download_dashboard.sh

download_dashboard.shとは

リモートからダッシュボードをダウンロードするスクリプトを定義する。

必ずdashboardproviders.yamlファイルも合わせて必要である。

URLの指定の方法として、以下がある。

  • GitHubのRawファイルのURL (https://raw.githubusercontent.com/example/foo.json)
  • GrafanaのコミュニティーのAPI (https://grafana.com/api/dashboards/<ID>/revisions/<リビジョン番号>/download)
apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-grafana
  namespace: prometheus
data:
  download_dashboard.sh: |
    #!/usr/bin/env sh
    set -euf

    curl -skf \
      --connect-timeout 60 \
      --max-time 60 \
      -H "Accept: application/json" \
      -H "Content-Type: application/json;charset=UTF-8" \
      "https://raw.githubusercontent.com/example/foo.json" \
      > "/var/lib/grafana/dashboards/remote/foo.json"
  # 必ずdashboardproviders.yamlファイルが必要である
  dashboardproviders.yaml: |
    apiVersion: 1
    providers:
      - name: local
        options:
          path: /var/lib/grafana/dashboards/local
      - name: remote
        options:
          path: /var/lib/grafana/dashboards/remote


InitContainer (download-dashboards)

Grafanaの起動時に、リモートからダッシュボードをダウンロードする。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: foo-grafana
  namespace: prometheus
spec:
  replicas: 1
  template:
    metadata:
    spec:
      - containers:
          - name: grafana
            image: "docker.io/grafana/grafana:10.0.3"
          - name: grafana-sc-dashboard
            image: "quay.io/kiwigrid/k8s-sidecar:1.24.6"
          - name: grafana-sc-datasources
            image: "quay.io/kiwigrid/k8s-sidecar:1.24.6"
        initContainers:
          - name: download-dashboards
            image: "docker.io/curlimages/curl:7.85.0"
            imagePullPolicy: IfNotPresent
            command: ["/bin/sh"]
            # ダウンロードスクリプトを実行する
            args:
              [
                "-c",
                "mkdir -p /var/lib/grafana/dashboards/remote && /bin/sh -x /etc/grafana/download_dashboards.sh",
              ]
            volumeMounts:
              # ダウンロードスクリプトをマウントする
              - name: config
                mountPath: "/etc/grafana/download_dashboards.sh"
                subPath: download_dashboards.sh
              - name: storage
                mountPath: "/var/lib/grafana"
        volumes:
          - name: config
            configMap:
              name: foo-grafana-ini-cm
          - name: foo-dashboards
            configMap:
              name: foo-dashboards


02-04. dashboardproviders.yaml

ダッシュボードの共通定義をプロバイダーとして設定する。

ローカルやリモートにあるダッシュボードのJSONを動的に読み込んでダッシュボードを作成する場合に必要になる。

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-grafana
  namespace: prometheus
data:
  dashboardproviders.yaml: |
    apiVersion: 1
    providers:
      - name: local
        options:
          path: /var/lib/grafana/dashboards/local
      - name: remote
        options:
          path: /var/lib/grafana/dashboards/remote


03. grafana-provider-cm

grafana-provider-cmとは

Grafanaのprovider.yamlファイルを管理する。

ダッシュボードのフォルダを定義できる。


providers

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: prometheus
data:
  provider.yaml: |
    apiVersion: 1
    providers:
      - name: 'sidecarProvider'
        orgId: 1
        folder: ''
        type: file
        disableDeletion: "false"
        allowUiUpdates: "false"
        updateIntervalSeconds: 30
        options:
          foldersFromFilesStructure: "false"
          path: /tmp/dashboards


04. grafana-dashboard-cm

grafana-dashboard-cmとは

Grafanaのdashboard.jsonファイルを管理する。

ファイルサイズが大きくなってしまうため、一つのConfigMapで一つのdashboard.jsonファイルを管理する方が良い。

これをGrafanaのコンテナにマウントする。


サイドカー (grafana-sc-dashboard)

Kubernetesの通常の仕組みであれば、ConfigMapの数だけVolumeMountでマウントする必要がある。

これに関して、ダッシュボードのConfigMapの数だけVolumeMountを実行してくれるサイドカーが開発されている。

なお、ダッシュボードが増えるほどConfigMapのVolumeMountが必要になるため、Podで必要なストレージの容量が増えていく。

apiVersion: v1
kind: Pod
metadata:
  name: grafana-pod
  namespace: prometheus
spec:
  containers:
    # grafanaコンテナ
    - name: grafana
      image: grafana/grafana:8.0.0

      ...

    # サイドカー
    - name: grafana-sc-dashboard
      image: quay.io/kiwigrid/k8s-sidecar:1.14.2

      ...


      env:
          - name: METHOD
            value: WATCH
          - name: LABEL
            value: grafana_dashboard
          # ダッシュボードのJSONファイルを配置するgrafanaコンテナのディレクトリ
          - name: FOLDER
            value: /tmp/dashboards
          - name: RESOURCE
            value: both
          # サイドカーがConfigMapを検知するNamespace
          - name: NAMESPACE
            value: ALL
      volumeMounts:
        - mountPath: /tmp/dashboards
          name: sc-dashboard-volume
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-api-access-*****
          readOnly: "true"

サイドカーがConfigMapを検知できるように、metadata.labelsキーにデフォルトでgrafana_dashboard: "1"を設定する必要がある。

言い方を変えれば、`grafana_dashboard: "1"キーを持つConfigMapのみをダッシュボードの設定として読み込ませられる。

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-dashboard
  namespace: prometheus
  labels:
    grafana_dashboard: "1"
data:
  foo.json: |-
    {{ `
    ダッシュボードのJSON
    ` }}


セットアップ

▼ grafanaチャートの場合

grafanaチャートでは、valuesファイルのdashboards.labelキーやdashboards.labelValueキーを使用して、サイドカーが検知するConfigMapを設定できる。

# valuesファイル
  dashboards:

    ...

    # サイドカー検知用の.metadata.labelsキー
    label: grafana_dashboard
    # .metadata.labelsキーの値
    labelValue: null

    ...

  datasources:

    ...

    label: grafana_datasource
    labelValue: null
apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-grafana-dashboard
  labels:
    grafana_dashboard: "<labelValueに設定した値>"
data:
  foo.json: |-
    {{ `
    ダッシュボードのJSON
    ` }}

▼ kube-prometheus-stackチャートの場合

kube-prometheus-stackチャートでは、prometheusのチャートの他、grafanaチャートなどに依存している。

kube-prometheus-stackチャートのvaluesファイルでは、サイドカー用のgrafana_dashboardキーに1が割り当てられている。

# valuesファイル

  sidecar:
    dashboards:

      ...

      # サイドカー検知用の.metadata.labelsキー
      label: grafana_dashboard
      # .metadata.labelsキーの値
      labelValue: "1"

      ...

    datasources:

      ...

      label: grafana_datasource
      labelValue: "1"

そのため、kube-prometheus-stackチャートを用いる場合はgrafana_dashboardキーの値が1のConfigMapのみがダッシュボードの設定として読み込まれる。

マニフェストから作成したダッシュボードは、GUIからは削除できないようになっている。

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-grafana-dashboard
  namespace: prometheus
  labels:
    grafana_dashboard: "1"
data:
  foo.json: |-
    {{ `
    ダッシュボードのJSON
    ` }}

補足として、kube-prometheus-stackチャートではダッシュボードのConfigMapはすでに用意されている。

またその他に、kubernetes-mixinsも同時にインストールするようになっている。