OpenShift環境にGrafanaを導入する

# はじめに

[OpenShift 4.11でGrafana UIは廃止](https://access.redhat.com/ja/solutions/6999327)されたことにより、デフォルトでOpenShift環境にGrafanaが存在しなくなりました。
そのため、本記事ではOpenShift4.11以降でGrafanaを導入する手順を説明します。

```shell
❯ oc get deployment -n openshift-monitoring
NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
cluster-monitoring-operator             1/1     1            1           4h3m
kube-state-metrics                      1/1     1            1           3h23m
openshift-state-metrics                 1/1     1            1           3h23m
prometheus-adapter                      2/2     2            2           3h23m
prometheus-operator                     1/1     1            1           3h24m
prometheus-operator-admission-webhook   2/2     2            2           3h50m
telemeter-client                        1/1     1            1           3h23m
thanos-querier                          2/2     2            2           3h23m
```

これから説明する手順を一通りやると、OpenShiftのPrometheusと連携したGrafanaダッシュボードを作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/343cc890-d519-da93-9dcb-6347cebefaa2.png)

# 設定手順

## 1. 事前準備
### 1.1 プロジェクト作成

今回は特定のプロジェクト上にGrafana OperatorとGrafanaインスタンスをデプロイします。
そのため、デプロイ用のプロジェクトを作成しておきます。

```shell
❯ oc new-project grafana
Now using project "grafana" on server "https://xsss.com:6443".

❯ oc project
Using project "grafana" on server "https://xsss.com:6443"
```

## 2. Grafanaの構築
### 2.1 Grafana Operatorの導入

まず、Grafana Operatorのインストール方法を説明します。
Openshift Web Consoleを開き、管理者向け画面のメニューからOperatorHubをクリックします。

![スクリーンショット 2023-10-02 15.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/62d2de00-3d54-b703-ea0d-76196d170899.png)

検索ボックスにGrafanaと入力すると、Grafana Operatorが表示されるので、クリックします。

![スクリーンショット 2023-10-02 15.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/c7ed1a56-6e90-1363-79a3-cd711416e36d.png)

インストール選択する画面となるので、チャネル等を選択します。
(日本語がおかしい部分もありますが)、以下の通り選択し、インストールをクリックします。
| 項目                  | 値                                     |
|---------------------|--------------------------------------|
| 更新チャネル           | alpha                                |
| インストールモード        | クラスターの特定のnamespace                  |
| インストール済のnamespace  | grafana                              |
| 更新の承認              | 自動                                  |


![スクリーンショット 2023-10-02 15.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/8ea5f475-1a0f-feb3-0bd3-bb86343904cb.png)

以下のようなインストール中の画面が表示されます。

![スクリーンショット 2023-10-02 15.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/23f50c77-1082-27e1-289b-50b559e16a1c.png)

インストールが完了すると以下のような画面となります。

![スクリーンショット 2023-10-02 15.16.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/9569331c-9ec5-d748-7809-2108c9c195df.png)


### 2.2 Grafana の導入

ここから、Grafanaをインストールしてきます。

Openshift Web Consoleを開き、メニューからインストール済のOperatorを選択し、Grafana Operatorをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/0ff88247-9ef9-fe4e-0204-d5fc80d61983.png)

Grafanaインスタンスの作成をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/06b48897-335a-78e1-ade2-a51b9d1782ed.png)

今回はデフォルトのままで作成します。

> :warning: **Adminユーザー名やパスワードを変更したい場合はYAMLビューに切り替えて、`spec.security.admin_user`と`spec.security.admin_password`を変更してください)**


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/6f9230ed-7720-eb8a-fab5-a810e265876e.png)



以下の通り、pod(grafana-a-deployment-5bcd5dbd48-k7cfq)、service(grafana-a-service)とservice account(grafana-a-sa)が作成されいていることがわかります。
```shell
❯ oc get pod -n grafana
NAME                                                 READY   STATUS    RESTARTS   AGE
grafana-a-deployment-5bcd5dbd48-k7cfq                1/1     Running   0          38s
grafana-operator-controller-manager-c749dd5b-z6pqj   1/1     Running   0          6d2h

❯ oc get service -n grafana
NAME                                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
grafana-a-service                           ClusterIP   xxx.xx.xx.xxx   <none>        3000/TCP   3m13s
grafana-operator-operator-metrics-service   ClusterIP   xxx.xx.xx.xxx   <none>        8443/TCP   10d

❯ oc get sa -n grafana
NAME                                  SECRETS   AGE
builder                               1         10d
default                               1         10d
deployer                              1         10d
grafana-a-sa                          1         55s
grafana-operator-controller-manager   1         10d
```

routeは作成しないため、
```shell
❯ oc get route -n grafana
No resources found in grafana namespace.
```

以下のようなかたちで自分で作成します。
```
❯ oc create route edge --service=grafana-a-service -n grafana
route.route.openshift.io/grafana-a-service created

❯ oc get route -n grafana
NAME                HOST/PORT                                                                   PATH   SERVICES            PORT      TERMINATION   WILDCARD
grafana-a-service   grafana-a-service-grafana.apps.xxx.xxx.xxx.xxx.com          grafana-a-service   grafana   edge          None
```

`https://grafana-a-service-grafana.apps.xxx.xxx.xxx.xxx.com`を開くと、以下のような画面が表示されれば成功です。
デフォルトのままであれば、以下の値を入力することでログインできます。

| 項目         | 値  |
|-------------------|--------|
| Email or username | root   |
| Password          | start  |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/94871be1-bfe0-bdca-e9da-7f8bb72eec47.png)

ログインできると以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/618fd430-ad9c-42e6-8a89-f1118f7a8d4a.png)

## 3. GrafanaとPrometheusの連携

ここからはOpenShiftにデフォルトでデプロイされているPrometheusと連携する方法を説明していきます。

```shell
❯ oc get deployment -n openshift-monitoring
NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
cluster-monitoring-operator             1/1     1            1           11d
kube-state-metrics                      1/1     1            1           11d
openshift-state-metrics                 1/1     1            1           11d
prometheus-adapter                      2/2     2            2           11d
prometheus-operator                     1/1     1            1           11d
prometheus-operator-admission-webhook   2/2     2            2           11d
telemeter-client                        1/1     1            1           11d
thanos-querier
```

### 3.1 GrafanaサービスアカウントにPrometheusへのアクセス権の付与

まず、garanaのサービスアカウント(grafana-a-sa)にcluster-monitoring-viewポリシーを適用します。
```shell
❯ oc adm policy add-cluster-role-to-user cluster-monitoring-view -z grafana-a-sa -n grafana
clusterrole.rbac.authorization.k8s.io/cluster-monitoring-view added: "grafana-a-sa"
```

grafanaサービスアカウント(garafana-a-sa)のtokenを作成します。
```shell
❯ oc sa new-token grafana-a-sa -n grafana
xxxxtokenxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

### 3.2 Grafanaデータソースの作成

OpenShift Web Consoleを開き、Grafana Data Sourceのインスタンスを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/519c7cd2-ee82-a2cf-d9f2-26c095d1b166.png)


YAMLビューに切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/70e8ed7d-29f1-4716-e4f2-cad39eae30ad.png)

以下のYAMLを参考にhttpリクエストの認証としてヘッダーにTokenを利用するようにします。
```yaml
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDatasource
metadata:
  name: grafanadatasource-sample
  namespace: grafana
spec:
  datasource:
    jsonData:
      timeInterval: 5s
      tlsSkipVerify: true
      httpHeaderName1: 'Authorization'
    access: proxy
    editable: true
    isDefault: true
    name: prometheus
    secureJsonData:
        httpHeaderValue1: 'Bearer xxxxtokenxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    type: prometheus
    url: 'https://thanos-querier.openshift-monitoring.svc.cluster.local:9091'
  instanceSelector:
    matchLabels:
      dashboards: grafana-a
  plugins:
    - name: grafana-clock-panel
      version: 1.3.0
```

次にData Sourceが正常に登録されているか確認します。

Grafanaを開き、左の<マークをクリックしてメニューを表示させたあと、Configuration下のData Sourcesを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/8aaf984a-040a-0f9e-1c3c-467ec0bcad2e.png)

下記のようにPrometheusと表示されればおｋです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/7b996547-65ab-c959-fd4c-4cd32fc88296.png)

## 4. Grafana上にダッシュボードを作成する
Prometheusのデータを使ってOpenShiftが提供していたダッシュボードを作ってみます。
[こちら](https://github.com/hirokoji/grafana-dashboad-samples/blob/main/openshift-samples/pod-dashboard.json)から`pod-dashboard.json`をダウンロードしてください。


左のメニューからDashboardsのBrowseをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/b3e684a2-790d-3e2c-7aba-078820624cf9.png)
右側のNewからImportをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/f80aa7cf-f165-632f-c16a-fb36d810b26f.png)

Upload JSON fileをクリックし、先程ダウンロードした`pod-dashboard.json`をアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/f4f2059e-711f-6b70-de38-837bf5102504.png)

以下のような画面が表示されたら、そのままImportをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/36e47740-f2eb-ba3a-b080-5de30560c176.png)

以下のような画面が出れば成功です。
namespaceがdefaultのままだと表示されないので、`openshift-monitoring`を選択すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/a6183b8f-c95d-d575-c134-fde66bd52581.png)

そのnamespaceに存在するpodのリソース状況可視化できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/343cc890-d519-da93-9dcb-6347cebefaa2.png)





# 参考
- [Custom Grafana dashboards for Red Hat OpenShift Container Platform 4](https://www.redhat.com/en/blog/custom-grafana-dashboards-red-hat-openshift-container-platform-4)