kind で作った Kubernetes クラスタに Grafana をデプロイする方法を解説します。

Prometheus のデプロイ

前回の記事 の内容に沿って kind クラスタを立ち上げ、Prometheus をデプロイします。

Grafana の管理者パスワードを Secret としてデプロイする

Grafana の管理者のユーザー名とパスワードを Secret としてデプロイします。 ここでは管理者名を admin、パスワードを password としています。

Secret にはデータを base64 エンコードした値 を入力します。

$ echo -n admin | base64
YWRtaW4=

grafana-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: grafana
type: Opaque
data:
  username: YWRtaW4=
  password: cGFzc3dvcmQ=
$ # kind 0.11.0 + Kubernetes 1.21.1
$ kubectl apply -f grafana-secret.yaml 
secret/grafana created

Grafana の DataSource の設定をデプロイする

Grafana から Prometheus にアクセスするため、DataSource を設定します。 DataSource は Web UI から追加することもできますが、Provisioning 機能 を使って設定ファイルの形で管理することもできます。

Prometheus には Pod の IP アドレスでもアクセスできますが、Service が動作していればサービス名でアクセスできます。

grafana-datasource.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana-datasource
data:
  prometheus.yaml: |
    apiVersion: 1
    datasources:
      - name: Prometheus
        type: prometheus
        url: http://prometheus:9090
        isDefault: true    
$ kubectl apply -f grafana-datasource.yaml 
configmap/grafana-datasource created

Grafana の Pod をデプロイする

Grafana を実行するための Pod をデプロイします。 ユーザー名とパスワードを Secret から、DataSource の設定を ConfigMap から読み込みます。

Provisioning の設定ファイルのサンプルは /usr/share/grafana/conf/provisioning にあるので、ディレクトリをマウントして同じ場所に配置しています。

grafana.yaml

apiVersion: v1
kind: Pod
metadata:
  name: grafana
spec:
  containers:
    - name: grafana
      image: grafana/grafana:7.5.7
      env:
        - name: GF_SECURITY_ADMIN_USER
          valueFrom:
            secretKeyRef:
              name: grafana
              key: username
        - name: GF_SECURITY_ADMIN_PASSWORD
          valueFrom:
            secretKeyRef:
              name: grafana
              key: password
        - name: GF_PATHS_PROVISIONING
          value: /usr/share/grafana/conf/provisioning
      volumeMounts:
        - name: datasources
          mountPath: /usr/share/grafana/conf/provisioning/datasources
          readOnly: true
  volumes:
    - name: datasources
      configMap:
        name: grafana-datasource
        items:
          - key: prometheus.yaml
            path: prometheus.yaml
$ kubectl apply -f grafana.yaml 
pod/grafana created

Grafana の起動時に GF_<SectionName>_<KeyName> という名前の環境変数がある場合、 この値は設定ファイルの値より優先して読み込まれます(マニュアル)。

したがって、上記の内容は grafana.ini に次の設定を書くことに相当します。

[security]
admin_user = admin
admin_password = password

[paths]
provisioning = /usr/share/grafana/conf/provisioning

ブラウザで動作を確認する

Grafana は デフォルト で 3000 番ポートで通信を待機します。

$ kubectl exec -it grafana -- sh
/usr/share/grafana $ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 :::3000                 :::*                    LISTEN      
/usr/share/grafana $ wget -q -O - http://localhost:3000/
<!DOCTYPE html>
...

kubectl port-forward を使えばブラウザから動作を確認できます。

$ kubectl port-forward grafana 3000
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000

Grafana の Explore タブを開き、PromQL クエリを入力すると収集した Prometheus のメトリクスを確認できます。

補足

Grafana コンテナの設定ファイルの構成は次の方法で確認できます。

$ docker run -it --rm --entrypoint="/bin/sh" grafana/grafana:7.4.3
/usr/share/grafana $ find conf -type d
conf
conf/provisioning
conf/provisioning/notifiers
conf/provisioning/dashboards
conf/provisioning/datasources
conf/provisioning/plugins
/usr/share/grafana $ ls conf/provisioning/datasources/
sample.yaml

sample.yaml の内容は 公式マニュアル と同じです。

参考資料