Helm とプロビジョニングの values で Grafana を Kubernetes にデプロイする
データソース、ダッシュボード、設定のすべてが values ファイルから来る、Helm チャートで Grafana を実行します。
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 の問題を確認してください。
人気のガイド
-
Grafana をコードとして運用する:全体像 ファイルに置けるもの、API が必要なもの、そしてそれらがどう組み合わさるか。 -
grafana.ini と環境変数で Grafana サーバーを設定する 設定ファイルの場所、上書きの順序、設定を Git に保つ方法を理解します。 -
JSON ファイルからダッシュボードをプロビジョニングする ディスクからダッシュボードを読み込み、ディレクトリからフォルダーを対応付け、変更を失わずに作成します。 -
アラートルール、コンタクトポイント、通知ポリシーをプロビジョニングする アラートのパイプライン全体を YAML で定義し、コードのようにレビューしてバージョン管理します。 -
コマンドラインからプロビジョニングを再読み込み、確認、トラブルシューティングする Grafana が何を読み込んだかを調べ、再起動せずに再読み込みし、よくあるプロビジョニングのエラーを修正します。