Helmを使ってPrometheus環境を構築したよ

## はじめに
prometheusを初めて扱ったので備忘録として記事を作成しました
## Helm
- helmとはKubernetes用のパッケージマネージャという理解でOK
- アプリが簡単にデプロイできる点とカスタマイズできる点がめちゃ便利
- values.yamlでアプリのパラメータを管理し、このファイルをマニフェストが参照してk8sオブジェクトが作成される
- チャート＝クラスでリリース＝インスタンスみたいな理解でOK
## Helmインストール
スクリプトを実行して最新のhelmをインストールする場合
```shell
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
```
## kube-prometheus-stack
k8sへpromethuesのインストール手段は様々あるが、[kube-prometheus-stackチャート](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack)を使用すると、デフォルトでalertmanager,grafana,exporterなど必要なコンポーネントも一括してデプロイしてくれるので便利。

## kube-prometheus-stackインストール
１. レポジトリ追加
まずは使用するレポジトリprometheus-communityをローカルに追加します。
```shell
helm repo add prometheus-community https://prometheus- community.github.io/helm-charts
helm repo update
```
２. カスタマイズ
以下のコマンドでvalues.yamlを抽出し、カスタマイズする
```shell
helm show values prometheus-community/kube-prometheus-stack > values.yaml
vi values.yaml
```
３. インストール
名前空間を作成し、任意のリリース名で編集したvalues.yamlをもとにインストールする。
```shell
kubectl create ns monitoring
helm install [RELEASE_NAME] -f values.yaml prometheus-community/kube-prometheus-stack -n monitoring
```
４. インストール確認
```shell
kubectl get pod -n monitoring
alertmanager-kube-prometheus-stack-alertmanager-0           2/2     Running   0          30s
kube-prometheus-stack-grafana-*                             3/3     Running   0          30s
kube-prometheus-stack-kube-state-metrics-*                  1/1     Running   0          30s
kube-prometheus-stack-operator-*                            1/1     Running   0          30s
kube-prometheus-stack-prometheus-node-exporter-*            1/1     Running   0          30s
prometheus-kube-prometheus-stack-prometheus-0               2/2     Running   0          30s
```
## 備考
- デフォルトではprometheusで収集したデータやgrafanaのダッシュボードなどはPODの再起動によって消えてしまうのでデータ永続化のために、Persistent Volumeを作成する必要がある
- [Prometheus公式](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects:~:text=CAUTION%3A%20Non,filesystem%20for%20reliability.)にはストレージにNFSを使用することは非推奨となっているが、kube-prometheus-stackの前身である[prometheus-operator](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/storage.md#manual-storage-provisioning)にはNFSの使用例が記載されている。使っていいのか不安だったのでローカルストレージを使いました
- 収集したメトリクスはデフォルトで10日後に削除されるので、必要に応じてvalues.yamlのprometheus.prometheusSpec.retentionを変更する
- kube-prometheus-stackをアンインストールする場合、CRDや作成したPV、PVCは残ってしまうので手動で削除する必要がある
```shell
helm uninstall kube-prometheus-stack -n monitoring
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
```
## 終わりに
初めてprometheusを扱ったが、kube-stack-prometheusを使用することで簡単にリソース監視環境を構築することができた。改善できる点としては、デフォルトの設定だと必要ないメトリクスまで収集してしまいストレージを圧迫してしまうので、必要なもののみ収集する設定するができたらよかった。また独自のクエリ言語PromeQLに手こずった。PromeQLについての記事も今度書こうと思います。

:::note info
不明点、間違っている点ありましたら、ご指摘ください🙏
:::