Kubernetesにprometheusとgrafanaを入れる

投稿者: | 9月 11, 2022

Kubernetesを学習にあたりいくつかの選択肢がある。

  • クラウドを使う(eks,aks,Googleなど)
  • minikubeやkindを使う

などが一番手っ取り早い環境。

クラウドを使う場合、基本全部がクラウドで不自由のない環境が手に入るが、コストがかかる。ワンショットで使う分には問題ないが、運用系で長期に検証しなければならないような立ち上げっぱなしで使うことは難しい。minikubeやkindを使う場合は、手元でサクッと作る場合には一番の選択肢だが、ネットワーク周りの制約が大きい。特に複数の環境と連携させる場合には少しコツが必要かもしれない。

Vanilla Kubernetesやk3sを使う場合、一度ちゃんと構成を作ってしまえば、クラウドでできるような環境が一通りできる。しかし、その敷居は結構高い。自分の場合は、1VMでできる https://github.com/masezou/k8s-study-vanilla を作ってしまったので、敷居の高さはなくなった。(実はhttps://github.com/masezou/k8s-study-vanilla はあまり使っておらず、サーバを複数に分けて、マルチノードに対応したものを使っている。需要があれば公開したいが需要はなさそう。結局コツがパラメーターになってしまい、そのパラメーターはもはや自分しかわからない。)

で自作で作る場合のもう一つの問題は、ノード自体の管理も自分で行う必要がある。特にリソース不足を起こしやすいのがCPUとディスク容量だったりする。特にディスク容量は、local-pathやlonghornを使っている場合、腹持ちのディスクを使うので、ディスクの容量不足は要注意である。この手のリソースを管理するためには、やはりprometheusなどにパラメータを保存をしておいてgrafanaで監視するのが一番かと。

閑話休題

テストに使った環境は、https://github.com/masezou/k8s-study-vanillaである。ちなみにこの構築は、M1 MacのVMware Fusionで作ってみた。つまりarm64で作ってみた。もちろんamd64でも動作するはず。

以下で結構簡単にprometheusとgrafanaが構成できる。以下のコマンドをコピペする。やっていることは、helmのレポジトリを登録して、helmでのインストールをしている。インストールの完了をまってから(kubectl waitは地味に便利)、サービスを表示させている。

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
kubectl create namespace monitoring
helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring
kubectl -n monitoring wait pod -l "app=kube-prometheus-stack-operator" --for condition=Ready
kubectl -n monitoring get svc

以下のようなserviceができあがる。

UntitledImage

あとは、grafanaなどをポートフォワードしたりすれば使える。https://github.com/masezou/k8s-study-vanilla 環境は、metallbでloadbalancerが使えるので、以下のコマンドでLoadbalancerに渡す。ポートフォワードするのは簡単なんだけど、ポート番号をいちいち振り向けないと行けないので地味に面倒。loadbalancerはIPアドレスがふんだんに使える?プライベートネットワークだと便利。

kubectl -n monitoring patch svc prometheus-kube-prometheus-prometheus -p '{"spec":{"type": "LoadBalancer"}}'
kubectl -n monitoring patch svc prometheus-kube-state-metrics -p '{"spec":{"type": "LoadBalancer"}}'
kubectl -n monitoring patch svc prometheus-grafana -p '{"spec":{"type": "LoadBalancer"}}'

こんな感じでloadbalancerに紐づけてみた。

UntitledImage

state-metrix、prometheusとgrafanaにそれぞれアクセスができる。

state-metricsへのアクセス

http://172.16.155.21:8080

Kubernetesの内部メトリック情報が取れる。

UntitledImage

 

prometheusへのアクセス

上記の場合、http://172.16.155.20:9090/ へアクセスをすると、お馴染みのprometheusの画面が出てくる。

UntitledImage

データを早速取り始めている。

UntitledImage

Grafanaへのアクセス

おまちかねのGrafanaへのアクセス。Grafanaへは上記の場合、以下でアクセスができる。

http://172.16.155.22/

UntitledImage

さて、ログイン、パスワードは、以下のコマンドで調べられる。(実はhelmのvalue.yamlに書いてあり、固定なのだが。)

ログイン名

kubectl get secret -n monitoring prometheus-grafana -o yaml | grep admin-user | cut -d ":" -f 2 | tr -d " " | base64 --decode ; echo

パスワード

kubectl get secret -n monitoring prometheus-grafana -o yaml | grep admin-password | cut -d ":" -f 2 | tr -d " " | base64 --decode ; echo

UntitledImage

ダッシュボードも設置済み。

UntitledImage

少し経つとデータが入ってくるのがわかる。

UntitledImage

あとは、「さいきょうのだっしゅぼーど」を作っていく。

ところで、このprometheusのデータは、emptyDir (https://kubernetes.io/ja/docs/concepts/storage/volumes/#emptydir)に保存をされてしまい、永続性には難があるので、ちゃんと運用をするならPersistant Volumeに保存をすることをおすすめする。

それをする場合は、helmのvalue.yamlで以下を設定する。とりあえず、自分はlocal-pathで容量を5GBにしてみた。(これがいいとは限らない。)以下のstorage.yamlを入れればよさそう。

cat storage.yaml
alertmanager:
alertmanagerSpec:
## Storage is the definition of how storage will be used by the Alertmanager instances.
## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/storage.md
##
storage:
volumeClaimTemplate:
spec:
storageClassName: local-path
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
# selector: {}
prometheus:
prometheusSpec:
## Prometheus StorageSpec for persistent data
## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/storage.md
##
storageSpec:
## Using PersistentVolumeClaim
##
volumeClaimTemplate:
spec:
storageClassName: local-path
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
# selector: {}
thanosRuler:
thanosRulerSpec:
## Storage is the definition of how storage will be used by the ThanosRuler instances.
## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/storage.md
##
storage:
volumeClaimTemplate:
spec:
storageClassName: local-path
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
# selector: {}

PVCにデータを保存をすることができた。

UntitledImage

 

やろうやろうと思っていたのだが、なかなかやらなかったことができた。あとは、散乱するprometheusの情報を一箇所にまとめたい(まとめた方がいい?)のだが。それはまだ先かと。リソースが足りなくなったとかの必要がない限りやらないんですね。

コメントを残す