Grafana Grafana

Helm とプロビジョニングの values で Grafana を Kubernetes にデプロイする

データソース、ダッシュボード、設定のすべてが values ファイルから来る、Helm チャートで Grafana を実行します。

15 min learn.level.中級

Kubernetes では、Grafana の Helm チャートが、プロビジョニングのフォルダーを、values.yaml に書く設定に変えます。チャートは ConfigMap と Secret をレンダリングし、Grafana が期待するパスにマウントし、それらが変更されたときに再起動または再読み込みします。これにより、values ファイルだけを編集すればよくなるため、Grafana は GitOps に適しています。このガイドでは、データソース、ダッシュボード、アラート、サーバー設定をプロビジョニングする values ファイルを構築します。

チャートのホスティングは変更されつつあります。Grafana Labs のチャートの一部は、コミュニティが保守するリポジトリに移行しています。インストールする前に、チャートの README で、使用するリポジトリの URL とチャートのバージョンを確認し、そのバージョンを固定してください。以下の values のキーは、チャートの文書化された構造に従っていますが、インストールするバージョンの values.yaml で確認してください。

インストールする

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install grafana grafana/grafana \
  --namespace monitoring --create-namespace \
  --version <chart-version> \
  -f values.yaml

チャートが移動している場合は、リポジトリの URL を README にあるものに置き換えます。インストールが再現可能になるように、コマンド、--version、values ファイルを Git に保管してください。

サーバーの設定:grafana.ini

grafana.ini に書くものはすべて、grafana.ini キーの下に、セクションごとに整理して置きます。

grafana.ini:
  server:
    root_url: https://grafana.example.com/
  users:
    allow_sign_up: false
  analytics:
    reporting_enabled: false
    check_for_updates: false
  log:
    mode: console

commit すべきでない値は、設定のガイドのように、環境変数やファイルを参照できます(たとえば password: $__file{/etc/secrets/db/password})。

admin の認証情報とその他のシークレット

values にパスワードを書く代わりに、既存の Kubernetes Secret を使います。

admin:
  existingSecret: grafana-admin
  userKey: admin-user
  passwordKey: admin-password

envFromSecret: grafana-secrets   # すべてのキーが環境変数になる
apiVersion: v1
kind: Secret
metadata:
  name: grafana-secrets
  namespace: monitoring
stringData:
  POSTGRES_PASSWORD: change-me
  SLACK_WEBHOOK_URL: https://hooks.slack.com/services/XXX/YYY/ZZZ

プロビジョニングのファイルでは、$POSTGRES_PASSWORD や ${SLACK_WEBHOOK_URL} を使えます。Secret をプレーンな YAML として commit する代わりに、SOPS で暗号化するか、External Secrets で同期してください(シークレットのガイドを参照)。

データソース

datasources キーは、プロビジョニングのファイルにレンダリングされます。

datasources:
  datasources.yaml:
    apiVersion: 1
    datasources:
      - name: Prometheus
        uid: prometheus
        type: prometheus
        access: proxy
        url: http://prometheus-server.monitoring.svc.cluster.local
        isDefault: true
        editable: false

ダッシュボード:3 つの方法

1. チャートフォルダーのファイルからインラインで。 プロバイダーを宣言し、ソースごとにダッシュボードを列挙します。

dashboardProviders:
  dashboardproviders.yaml:
    apiVersion: 1
    providers:
      - name: default
        orgId: 1
        folder: ''
        type: file
        disableDeletion: false
        allowUiUpdates: false
        options:
          path: /var/lib/grafana/dashboards/default

dashboards:
  default:
    node-exporter:
      gnetId: 1860
      revision: 37
      datasource: Prometheus
    kubernetes-overview:
      json: |
        { "uid": "k8s-overview", "title": "Kubernetes Overview", "panels": [] }

エントリは、grafana.com(gnetId と revision)、URL、インラインの JSON から取得できます。dashboards の下のキー(ここでは default)は、プロバイダーの options.path のフォルダー名と一致する必要があります。

2. 自分で管理する ConfigMap から。 ダッシュボードの JSON を、独自の ConfigMap(たとえばリポジトリから Kustomize で生成したもの)に保管し、マウントします。

dashboardsConfigMaps:
  default: grafana-dashboards

3. サイドカーで。 サイドカーのコンテナが、ラベルの付いた ConfigMap(または Secret)をクラスター内で監視し、ダッシュボードとして読み込むため、各アプリケーションチームが、自分のマニフェストの隣に独自のダッシュボードを置けます。

sidecar:
  dashboards:
    enabled: true
    label: grafana_dashboard
    labelValue: "1"
    searchNamespace: ALL
    folderAnnotation: grafana_folder
    provider:
      foldersFromFilesStructure: true
  datasources:
    enabled: true
    label: grafana_datasource
  alerts:
    enabled: true
    label: grafana_alert
apiVersion: v1
kind: ConfigMap
metadata:
  name: webapp-dashboard
  namespace: webapp
  labels:
    grafana_dashboard: "1"
  annotations:
    grafana_folder: Applications
data:
  webapp.json: |
    { "uid": "webapp-overview", "title": "Webapp Overview", "panels": [] }

サイドカーのアプローチは、チーム間で最もよくスケールします。ダッシュボードを追加するために、Grafana の values を編集する人は誰もいません。

アラート

アラートのプロビジョニングファイルは、アラートのガイドの YAML 形式を使って、alerting キーから指定できます。

alerting:
  contactpoints.yaml:
    secret:
      apiVersion: 1
      contactPoints:
        - orgId: 1
          name: team-slack
          receivers:
            - uid: team-slack-1
              type: slack
              settings:
                url: ${SLACK_WEBHOOK_URL}
                recipient: '#alerts'
  policies.yaml:
    apiVersion: 1
    policies:
      - orgId: 1
        receiver: team-slack

secret: のラッパーは、そのファイルを ConfigMap ではなく Secret に置きます。お使いのバージョンでの正確な形は、チャートの values.yaml を確認してください。アラートルールは、同じキー、またはサイドカーの alerts の設定から指定できます。

永続化とレプリカ

persistence:
  enabled: true
  size: 5Gi
replicas: 1

永続ボリューム上の SQLite は、1 つのレプリカをサポートします。高可用性のためには、grafana.ini で Grafana を PostgreSQL に向け、replicas を増やします。

Flux でデプロイする

Flux を使う場合、チャートは HelmRelease になり、上の values は spec.values に入ります。

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: grafana
  namespace: monitoring
spec:
  interval: 10m
  chart:
    spec:
      chart: grafana
      version: "<chart-version>"
      sourceRef:
        kind: HelmRepository
        name: grafana
        namespace: flux-system
  valuesFrom:
    - kind: ConfigMap
      name: grafana-values

Git での values の変更は、自動的にロールアウトされます。HelmRepository、remediation、ドリフト検出については、Flux のシリーズの Helm のガイドを参照してください。

確認する

kubectl get pods -n monitoring
kubectl port-forward svc/grafana 3000:80 -n monitoring &
curl -s http://localhost:3000/api/health
kubectl logs deploy/grafana -n monitoring -c grafana | grep -i provisioning

ダッシュボードやデータソースが欠けている場合は、まずプロビジョニングのログの行を確認し、次に、サイドカーのログ(-c grafana-sc-dashboard)で、ラベルや namespace の問題を確認してください。

人気のガイド