k8sクラスタにGrafanaとPrometheusによる監視を導入する手引


できたもの

下記リポジトリのcharts/kube-prometheus-stackをベースに作成する。

上記helm chartを利用することで、よくあるGrafana × Prometheus × Node Exporterの監視スタックが簡単に構成できる。

この記事では紹介しないが、kube-prometheus-stackにはAlertmanagerも含まれているので、設定次第では例えば「Podのdownを検知してメール通知する」といったこともできる。

手順

helm経由でインストール

# リポジトリ追加
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

kubectl create ns monitoring
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack -n monitoring

基本上記で完了。

kube-prometheus-stack-grafanakube-prometheus-stack-prometheusといったサービスはClusterIPなので、ポートフォワードなりNodePortなりで外部に公開してやればコンソールにアクセスが出来る。

# ex)grafanaをNodePortの30000ポートで公開
kubectl patch svc -n monitoring kube-prometheus-stack-grafana -p '{"spec": {"type": "NodePort", "ports": [{"nodePort": 30000, "port": 80, "targetPort": 3000, "protocol": "TCP"}]}}'

ただ、デフォルトだとgrafanaのデータが永続化されず、Podが再起動する度にユーザの情報などが消えて不便だったので、PVを用意することにした。

データの永続化

PV作成

monitoring-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: grafana-pv
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  persistentVolumeReclaimPolicy: Retain
  storageClassName: grafana-nfs
  volumeMode: Filesystem
  nfs:
    server: {NASのIP}
    path: "/k8s/grafana"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: prometheus-pv
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Gi
  persistentVolumeReclaimPolicy: Retain
  storageClassName: prometheus-nfs
  volumeMode: Filesystem
  nfs:
    server: {NASのIP}
    path: "/k8s/prometheus"

上記リソースを作成しておく。

valuesの編集をしてインストール

続いて、helmのvalues.yamlを変更していく。

# kube-prometheus-stackはuninstallしておく
helm show values prometheus-community/kube-prometheus-stack > values-monitoring.yaml

下記のとおりに書き換える

values-monitoring.yaml
...
grafana:
  enabled: true
  ...
  deploymentStrategy: # 追加
    type: Recreate
  persistence:
    enabled: true
    type: pvc
    storageClassName: grafana-nfs
    accessModes:
    - ReadWriteOnce
    size: 2Gi
    finalizers:
    - kubernetes.io/pvc-protection
  initChownData:
    enabled: false
...
  defaultDashboardsTimezone: Asia/Tokyo # タイムゾーン変更
...
prometheus:
  prometheusSpec:
  ...
    storageSpec: # {}を消す
    ...
      volumeClaimTemplate:
        spec:
          storageClassName: prometheus-nfs # NFSを利用するように指定
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 10Gi
        # selector: {} # コメントアウト

initChownDataをfalseにする理由は、以下のエラーが出たため

Events:
  Type     Reason   Age                       From     Message
  ----     ------   ----                      ----     -------
  Warning  BackOff  4m36s (x1798 over 6h34m)  kubelet  Back-off restarting failed container init-chown-data in pod kube-prometheus-stack-grafana-697d484d96-clb78_monitoring(17196f8f-5aba-4a94-8383-49d8e9fbdc5b)

↓参考ページ

Init:CrashLoopBackOff due to error on the init-chown-data container when persistence is enabled · Issue #752 · grafana/helm-charts

When the persistence is enabled, the pod goes into a Init:CrashLoopBackOff state, where its init-chown-data container fails with: chown: /var/lib/grafana: Operation not permitted It seems this is a...

github.com favicon image github.com

次に、カスタムしたvaluesファイルを含めてインストール

helm install kube-prometheus-stack -f values-monitoring.yaml prometheus-community/kube-prometheus-stack -n monitoring

確認

すべてのpodが立ち上がっていることを確認。

$ kubectl get pods -n monitoring
NAME                                                        READY   STATUS    RESTARTS   AGE
alertmanager-kube-prometheus-stack-alertmanager-0           2/2     Running   0          32h
kube-prometheus-stack-grafana-64b9f759d6-drm62              3/3     Running   0          32h
kube-prometheus-stack-kube-state-metrics-74cbfdbd75-tdvrv   1/1     Running   0          32h
kube-prometheus-stack-operator-55f9799bcb-wrc54             1/1     Running   0          32h
kube-prometheus-stack-prometheus-node-exporter-9g5xj        1/1     Running   0          32h
kube-prometheus-stack-prometheus-node-exporter-cqxhq        1/1     Running   0          32h
kube-prometheus-stack-prometheus-node-exporter-m5rmn        1/1     Running   0          32h
prometheus-kube-prometheus-stack-prometheus-0               2/2     Running   0          32h

アンインストール方法

grafanaのpv関連はhelm側で面倒を見てくれないので、手動で消す

helm uninstall kube-prometheus-stack -n monitoring
kubectl delete -n monitoring pvc kube-prometheus-stack-grafana
kubectl delete pv grafana-pv
kubectl delete crd alertmanagerconfigs.monitoring.coreos.com
kubectl delete crd alertmanagers.monitoring.coreos.com
kubectl delete crd podmonitors.monitoring.coreos.com
kubectl delete crd probes.monitoring.coreos.com
kubectl delete crd prometheusagents.monitoring.coreos.com
kubectl delete crd prometheuses.monitoring.coreos.com
kubectl delete crd prometheusrules.monitoring.coreos.com
kubectl delete crd scrapeconfigs.monitoring.coreos.com
kubectl delete crd servicemonitors.monitoring.coreos.com
kubectl delete crd thanosrulers.monitoring.coreos.com

おわりに

kube-prometheus-stackを使うことで簡単にk8sの監視を始めることができた。

次回はAlertmanagerによる障害の通知を行ってみようと思う。

参考文献