はじめに
今回はおうちk8sにprometheusを入れて、grafanaでメトリクスの値を確認したいと思います。

実装
prometheusのhelmをリポジトリに追加
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
インストール
$ helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring
確認
$ kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-prometheus-kube-prometheus-alertmanager-0 2/2 Running 0 25m
prometheus-grafana-57888d6d7f-6trrh 3/3 Running 1 (71m ago) 75m
prometheus-kube-prometheus-operator-69b78696c4-4z2fb 1/1 Running 0 54m
prometheus-kube-state-metrics-d85c885bd-hb4r6 1/1 Running 3 (73m ago) 75m
prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 0 25m
prometheus-prometheus-node-exporter-7c7dp 1/1 Running 0 75m
prometheus-prometheus-node-exporter-pksgn 1/1 Running 0 75m
prometheus-prometheus-node-exporter-rs788 1/1 Running 0 75m
namespaceを新たに追加
$ kubectl create ns monitoring
prometheus-community/kube-prometheus-stackの設定をvalus.yamlに出力
$ helm show values prometheus-community/kube-prometheus-stack > values.yaml
出力したvalues.yamlの以下のハイライトの部分を変更します。
・・・【略】・・・
grafana:
enabled: true
namespaceOverride: ""
forceDeployDatasources: false
forceDeployDashboards: false
defaultDashboardsEnabled: true
defaultDashboardsTimezone: utc
defaultDashboardsEditable: true
adminPassword: prom-operator
rbac:
pspEnabled: false
ingress:
enabled: true
annotations: {}
kubernetes.io/ingress.class: nginx
labels: {}
## Hostnames.
## Must be provided if Ingress is enable.
hosts:
- grafana.test.com
hosts: []
path: /
## TLS configuration for grafana Ingress
tls: []
# - secretName: grafana-general-tls
# hosts:
# - grafana.example.com
・・・【略】・・・
変更した設定を更新します。
$ helm upgrade -i prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
-f values.yaml \
--wait
grafanaで確認
まだアドレスが割り当てられていない。
$ kubectl get ingress -n monitoring
NAME CLASS HOSTS ADDRESS PORTS AGE
prometheus-grafana <none> * 80 33m
そしてCLASS が <none> になっていて、Ingressリソースに対応するIngress Controllerが認識できない。
以下のようにnginxのIngressクラスを割り当てます。
$ kubectl annotate ingress prometheus-grafana -n monitoring kubernetes.io/ingress.class=nginx
ingress.networking.k8s.io/prometheus-grafana annotated
アドレスの割り当て
$ cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: ingress-address-pool
namespace: metallb-system
spec:
addresses:
- 192.168.3.100-192.168.3.200
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: ingress-l2-advertisement
namespace: metallb-system
spec:
ipAddressPools:
- ingress-address-pool
EOF
$ kubectl get ingress -n monitoring
NAME CLASS HOSTS ADDRESS PORTS AGE
prometheus-grafana <none> * 192.168.3.100 80 13d
これでアクセスできるようになったので、アクセスする。
http://192.168.3.100/
でブラウザでアクセスできる。
grafanaのパスワードは以下で求められる
$ kubectl get secret prometheus-grafana -n monitoring -o jsonpath='{.data.admin-password}' | base64 --decode; echo
grafanaのダッシュボードに一覧があるので、以下のようなダッシュボードが見ることができる。

その他、気になること
pathの設定について
上記のvalues.yamlよりingressは以下のような設定になる。
ingress:
enabled: true
annotations: {}
kubernetes.io/ingress.class: nginx
labels: {}
## Hostnames.
## Must be provided if Ingress is enable.
hosts:
- grafana.test.com
hosts: []
path: /
## TLS configuration for grafana Ingress
tls: []
# - secretName: grafana-general-tls
# hosts:
# - grafana.example.com
でpathのところは
path: /grafana
のようにはできない。
アクセスするとエラーになる。(http://192.168.3.100/loginにリダイレクトされるから)
一つの外部ipに対して、
http://192.168.3.100/grafana/
とか、
http://192.168.3.100/wordpress/
で分けたいと思っているけど、できない。