kube-prometheus-stackではじめるk8sクラスタ死活監視
Table of Contents
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-grafana
やkube-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
次に、カスタムした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による障害の通知を行ってみようと思う。
参考文献
Read other posts