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も同時にインストールするようになっている。