Red Hat OpenShift on IBM CloudにPrometheusを追加インストールする（組み込みOperator編）

# 目的

OpenShiftには標準でPrometheusが組み込まれていますが、収集したメトリクスが永続化されないため、実運用で使用するには難しいところがあります。そこで、せっかくOpenShiftには組み込みのOperator Hubがあるので、そこから追加でPrometheusをインストールしてみます。

なお、この目的であればPrometheusではなくIBM Cloud Monitoring with Sysdigを使えばよいとIBMさんは言うかもしれませんが、PrometheusのPromQLがもつ柔軟な表現力や、各種Exporterとの連携でさまざまなメトリクスを収集できることはやはり捨てがたいです。

また、Prometheus Operatorはまだ挙動不審なところや情報不足なところがあるため、利用は自己責任でお願いします。

## 前提

* 検証環境: Red Hat OpenShift on IBM Cloud 4.3

# 手順

## Operatorの確認

Webコンソールから確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/4b0d4b1a-2223-55a5-952a-a39d7749f82e.png)

## Operatorのサブスクライブ

ここからはCLIで進めます。Operatorをサブスクライブします。

```yaml
$ oc create -f - <<EOF
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: prometheus
spec:
  channel: beta
  installPlanApproval: Auto
  name: prometheus
  source: community-operators
  sourceNamespace: openshift-marketplace
  startingCSV: prometheusoperator.0.32.0
EOF
```

## RBACの設定

``prometheus-k8s``というServiceAccountが出来ていますが、なぜか何のClusterRoleも割り当てられていません。なので、手動でClusterRoleとClusterRoleBindingを設定します。

```
$ oc get sa prometheus-k8s
NAME             SECRETS   AGE
prometheus-k8s   2         3m29s
```

```yaml
$ oc create -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: ${ClusterRole名}
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - nodes/proxy
  - services
  - endpoints
  - pods
  - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - get
- apiGroups:
  - "extensions"
  resources:
  - ingresses/status
  - ingresses
  verbs:
  - get
  - list
  - watch
- nonResourceURLs:
  - "/metrics"
  verbs:
  - get

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: ${好きな名前}
subjects:
- kind: ServiceAccount
  name: prometheus-k8s
  namespace: ${サブスクライブしたネームスペース}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: ${ClusterRole名}
EOF
```

## Prometheusインスタンスの作成

Prometheusのインスタンスを作成します。今回は収集したメトリクスをFile Storageに永続化します。

```yaml
$ oc create -f - <<EOF
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: server
  labels:
    prometheus: k8s
spec:
  replicas: 1
  serviceAccountName: prometheus-k8s
  securityContext: {}
  serviceMonitorSelector: {}
  ruleSelector: {}
  alerting:
    alertmanagers: []
  retention: 400d # メトリクスの保存期間
  storage:
    volumeClaimTemplate:
      metadata:
        labels:
          billingType: hourly # またはmonthly
          region: jp-tok # リージョン名
          zone: tok02 # ゾーン名
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
        storageClassName: ibmc-file-bronze-gid # ストレージクラス名
EOF
```

永続ボリュームは事前定義されたPersistentVolumeClaimには対応しておらず、動的プロビジョニングになります。

Prometheusは非rootユーザーで実行されるため、ストレージクラスは-gid付きのものを使用してください。また、bronzeだと遅すぎるので、実環境ではsilverやgoldを使用することをお勧めします。

数分程度待つとPodが起動します。

```
$ oc get pods | grep ^prometheus-server
prometheus-server-0                             3/3     Running     1          114s
```

## File StorageをNFS v3化（オプション）

File StorageのマウントをNFS v3にします。これはIBM Cloudでの推奨です。

```
$ _pv=$(oc get pv | grep prometheus-server-db-prometheus-server-0 | awk '{ print $1 }')
$ oc patch pv/${_pv} -p '{"spec":{"mountOptions":["nfsvers=3","hard","intr","lookupcache=none"]}}'
```

## スクレイプ対象の追加

この段階では何もスクレイプしていませんのでスクレイプ対象を追加します。これには2つ方法があります。

* CRDで定義
* AdditionalScrapeConfigsで定義

CRDはスクレイプ対象に応じてPodMonitor、ServiceMonitor等があり、それをOpenShiftのリソースとして定義します。AdditionalScrapeConfigsは従来のPrometheusの設定ファイルをSecret化して指定します。

OpetatorならCRDでやりたいところですが、情報が少ないため、試行錯誤になりがちです。一方Prometheusの設定ファイルはいくらでもネットに情報があり、ノウハウが豊富です。今回はAdditionalScrapeConfigsを使用します。

簡単のため、Prometheus自身のメトリクスを収集するサンプルです。

```yaml:additional-scrape-config.yaml
- job_name: prometheus
  static_configs:
  - targets:
    - localhost:9090
```

これをSecret化します。

```
$ oc create secret generic prometheus-scrape-config --from-file additional-scrape-config.yaml --dry-run -o yaml | oc replace --force -f -
```

そしてPrometheusインスタンスの``additionalScrapeConfigs``でシークレット名とファイル名を指定します。

```
$ oc edit prometheus/server
```
```yaml
spec:
  additionalScrapeConfigs: # 追加
    name: prometheus-scrape-config # 追加
    key: additional-scrape-config.yaml # 追加
```

これでしばらく待つとスクレイプが開始します。

スクレイプ対象を追加する場合は、Secretを再作成すれば、prometheus-config-reloaderが自動で取り込んでくれます（最大数分待ちますが）。