k3s上にhelmを用いてprometheusを導入

先日来、学習用のk3sクラスタを構築してますが、ここにhelmを用いてprometheusを入れてみました。
kube-prometheus-stackを使ってみます。このkube-prometheus-stackとprometheus operatorとの関係性がよく分かってないんですけど、、、、

# １．ソフトウェア構成
※AWS上の4インスタンスに構築したk3sクラスタ構成
Debian GNU/Linux 11
k3s version v1.23.8+k3s1 (53f2d4e7)
go version go1.17.5
Longhorn v1.3.0

# ２．導入手順
prometheus-communityのレポジトリを追加します。
```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
```
valuesファイルを取得します。
```bash
helm inspect values prometheus-community/kube-prometheus-stack > prometheus_values.yaml
```
valuesファイルをお好みに合わせて修正します(後述)。
valuesファイルを修正したら、名前空間を作成した後にhelm installをします。
```bash
kubectl create ns prometheus
helm install prometheus -f .\prometheus_values.yaml prometheus-community/kube-prometheus-stack -n prometheus
```

# ３．valuesファイルの変更点
今回、以下のように変えてみました。
まず、データ永続化のために以下三か所のコメントを外し、longhornを使用するようにしました。
```yaml:prometheus_values.yaml(抜粋)
alertmanager:
  alertmanagerSpec:
    storage:
      volumeClaimTemplate:
        spec:
          storageClassName: longhorn
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 1Gi
          #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: longhorn
           accessModes: ["ReadWriteOnce"]
           resources:
             requests:
               storage: 1Gi
         #selector: {}

thanosRuler:
  thanosRulerSpec:
    storage:
      volumeClaimTemplate:
        spec:
          storageClassName: longhorn
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 1Gi
        #selector: {}
```
また、nodeSelectorを指定できるところはラベルを指定して、適切なノードで配置されるようにしました。たまたまノードにlonghorn-nodeというものを指定していたのでそれをそのまま使いましたが、本来はprometheus配置用に別のラベルを作っておいた方がいいのかもしれません。
```yaml
  nodeSelector:
    longhorn-node: 'true'
```
また、抽出したvaluesファイルにgrafanaとkube-state-metrics用のnodeSelectorの項がありません。ありませんが、[リンク先のissueによると「追記してあげたら問題なく動く」](https://github.com/prometheus-community/helm-charts/issues/1853)という事なので追記します。
```yaml
grafana:
  #add nodeSelector
  nodeSelector:
    longhorn-node: 'true'

kube-state-metrics:
  #add nodeSelector
  nodeSelector:
    longhorn-node: 'true'
```

# ４．UIにアクセス
PrometheusのUIにアクセスしてみましょう。サービス`
prometheus-kube-prometheus-prometheus`でUIが公開されているので、これをポートフォワーディングしてみます。Lensを使ってイージーにやっちゃいました。
![スクリーンショット 2022-07-27 100523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/d37d5980-59c7-597c-7112-a319bba504c4.png)
さらにgrafanaのUIにもアクセスしてみましょう。サービス`prometheus-grafana`をこれまたLensでイージーにポートフォワーディングするとログイン画面が出てきます。
![スクリーンショット 2022-07-27 grafana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729695/6aed5023-7d2a-33af-04ef-dde2906bfe35.png)
adminのパスワードは、`prom-operator`です。実はvaluesファイルに書いてあったりします。
```yaml
grafana:
  adminPassword: prom-operator
```
しかしLens、便利ですね。

https://k8slens.dev/

# ５．まとめ
kube-prometheus-stackを使って、PrometheusとGrafanaなど一式をk3sに導入しました。その際、データ永続化のためにlonghornを利用するようにしました。また、Prometheusなどが稼働するノードをnodeSelectorで指定してみました。
UIアクセスはLensを使って簡単にやってみました。

しかし、まだまだPrometheusというかk3sで何のパラメーターを見ればよいのか分かってないです。勉強が足りませんね、という初心者らしい一言でこの記事を締めたいと思います。