【解説】GrafanaをKubernetesで実際に運用してみる

#目次

1. はじめに
- Grafanaの基本
- Kubernetesクラスターの作成
- Grafanaサービスの作成
- Grafanaのテスト
- Grafanaの拡張
- Grafanaストレージ
- 最後のMetricFireについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/989aa506-b35b-4e95-3f9b-40152fbdb33a.png)

#1. はじめに

Grafanaは、メトリック分析、モニタリング、視覚化のためのオープンソースプラットフォームです。 この記事では、Grafanaの基本を探った後、GrafanaをKubernetesにデプロイする方法を学びます。 Grafanaをデプロイするために使うことができるコーディング例も紹介させてもらいます。

#2. Grafanaの基本
いきなり始める前に、Grafanaで何ができるかを理解していきましょう。 Grafanaは、さまざまなデータソースからメトリックを取得することができ、 ソースごとに、データを抽出して解釈する特定のシンタックスとクエリエディターがあります。

Grafanaは、Prometheus、Mysql、MSSQL、PostgreSQL、Influx DB、Graphite、ElasticSearchなどの複数のデータソースをサポートしていると共に、Google Stackdriver、Azure Monitor、AWS CloudWatchなどの一部のクラウド管理サービスからデータを読み込むこともできます。 [適切なプラグイン](https://grafana.com/grafana/plugins?type=datasource)を使用すると、Grafanaを拡張して、他のデータストアやオンラインソースを追加することもできる便利なツールです。 インフラストラクチャとアプリケーション（ディスクI / O使用率、CPU、メモリなど）の時系列データは、最初に分析ツールにロードされ、分析されていくという流れになります。
さらに、Grafanaを使用すると、[ダッシュボードを簡単に作成および編集](https://www.metricfire.com/blog/grafana-dashboards-from-basic-to-advanced)できるのも魅力の一つです。 

自分でGrafanaのインストールし、設定していくのが大変だと思う方は心配しないでも大丈夫です。これから説明する少し面倒臭いプロセスを経ずとも[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes)を通じてGrafanaを使用できます。また、質問などがある場合は、直接[MetricFireにご相談](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes)することも可能です。

#3. Kubernetesクラスターの作成

Grafanaの仕組みをよりよく理解するために、Grafanaを使用してKubernetesクラスターを監視していきます。 マネージドクラウドクラスターやMinikubeを使用して構いません。 今回のチュートリアルでは、Google CloudのKubernetesサービスであるGKE（Google Kubernetes Engine）を使用します。 GKEを使用している場合は、Google Cloudプロジェクトを請求先アカウントにリンクする必要があります。 また、[Kubernetes API](https://console.cloud.google.com/apis/api/container.googleapis.com/)を有効にして、Google Cloud SDKをインストールする必要があります。

別のクラウドプロバイダーを使用する場合は、Google Cloud Platform（GCP）に固有の一部のコマンドを除いて、ここに示す手順とほぼ同じです。

インストールと設定が完了したら、以下を使用して続けていきます。

```gcloud container clusters create mycluster --zone europe-west1-b
```

選択したクラスター名の「mycluster」を変更して、必ず優先ゾーンを使用してください。

```
NAME      LOCATION        MASTER_VERSION   MASTER_IP     MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS
mycluster europe-west1-b   1.13.11-gke.9   34.77.193.73  n1-standard-1  1.13.11-gke.9  3          RUNNING
```
Minikubeクラスタを使用している場合は、[正式の手順](https://kubernetes.io/docs/tasks/tools/install-minikube/)に従って最初にインストールする必要があります。 次に、以下を使用してクラスターを作成します。

```minikube start 
```

これでクラスターが起動して実行されたので、Kubernetesコマンドラインツールkubectlをインストールする必要があります。 インストールは非常に簡単です。 Debian / Ubuntuを使用している場合は、次のコマンドを実行してください。

```
sudo apt-get update && sudo apt-get install -y apt-transport-https

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update

sudo apt-get install -y kubectl
```

#4. Grafanaサービスの作成

デプロイを作成するために、Docker Hubからの[公式のGrafanaイメージ](https://hub.docker.com/r/grafana/grafana/)（v5.4.3）を使用します。

```kubectl create deployment grafana --image=docker.io/grafana/grafana:5.4.3
```

次を使用して、イメージがデプロイされたかどうかを確認できます。

```kubectl get deployments
```

すると、次のような出力が表示されます。

| Name            | Type | CLUSTER-IP    | EXTERNAL-IP | PORT(S)   | Age |
|:---------------------|:------:|:-------:|:---------:|:-----:|:---:|
| kubernetes |  ClusterIP  |  10.27.240.1    |    <none>  |   443/TCP  |        100m |

次に、LoadBalancerサービスタイプを使用してGrafanaサービスを公開します。

```kubectl expose deployment grafana --type=LoadBalancer --port=80 --target-port=3000 --protocol=TCP
```


315/5000
3000は、カスタム構成をセットアップしていない場合にGrafanaが表示するデフォルトのHTTPポートです。 今回、簡単にするために、この内部ポートをTCPを使用して外部ポート80にマッピングします。 ロードバランサーの作成には数分かかる場合があります。 展開が公開されたことを確認するには、次のように入力します。

```kubectl get service grafana
```

ここで、ロードバランサーの外部IPを確認できるはずです。

| Name            | Type | CLUSTER-IP    | EXTERNAL-IP | PORT(S)   | Age |
|:---------------------|:------:|:-------:|:---------:|:-----:|:---:|
| grafana    |    LoadBalancer  | 10.27.252.155   |      35.205.13.61 |           80:32471/TCP  | 92s|

スケーリングなど、デプロイされたサービスで他の操作を実行することもできます。

```kubectl scale deployment grafana --replicas=2
```

これで、デフォルトポート（80）で同じIPにアクセスすると、Grafanaの認証ページが表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/4ff6af29-94bd-18e9-d806-ed16197b4c17.png)

#5. Grafanaのテスト

デフォルトのログイン/パスワードはadmin / adminです。 最初のログイン後にこれらの資格情報を変更するように求められます。 
また、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes) 通じて行なった場合、今までの煩わしいセットアップを行うことなく、この時点から直接開始することも出来るので、おすすめです。

Grafanaインスタンスをテストするために、データソースを追加できます。 最も簡単なのは、Grafana TestDataソースを追加することです。これは、Grafana機能の検証をより簡単かつ高速にするテスト目的の偽のデータソースです。

[Create your first data source]をクリックして[TestData DB]を選択し、[Save and test]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/38a488d9-2628-444f-fccd-7d12436fe006.png)

[Create a new dashboard]をクリックすると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/97aaaef0-f831-5aae-2a8d-ab690ec1ca7f.png)

テストデータを視覚化したパネルを表示するには、「Graph」または「Heatmap」などを選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/e85652f5-54a4-2127-8e61-4cf641fbe85a.png)


#6. Grafanaの拡張

プラグインを使用して、デフォルトのインストールを拡張できます。 デフォルトでは多くのプラグインがインストールされていますが、必要に応じてプラグインを追加できます。 高度なGrafanaチュートリアルで、Grafanaダッシュボードとプラグインの構築の詳細を確認できます。

プラグインには、パネル、データソース、アプリの3種類があります。 Grafana Kubernetes Appのようなプラグインをインストールするには、次のコマンドを実行する必要があります。

```grafana-cli plugins install grafana-kubernetes-app
```

次に、以下を使用してGrafanaサービスを再起動します。

```service grafana-server restart```

コンテナを使用するため、コンテキストで実行するコマンドは次のとおりです。

```kubectl exec -it grafana-96fd979c-kjfhr grafana-cli plugins install grafana-kubernetes-app```

もちろん、ポッドの名前をgrafana-96fd979c-kjfhrに変更する必要があります。 アプリがインストールされたら、サービスを再起動する代わりに、デプロイメントを0にスケーリングしてから、1つ以上のレプリカにスケーリングできます。

```kubectl scale deployment grafana --replicas=0```

```kubectl scale deployment grafana --replicas=1```

コンテナ内のストレージは一時的なものであるため、ポッドをスケーリングまたは強制終了すると、インストールが失われます。 次のセクションでは、永続的なGrafanaストレージを使用してこの問題を回避する方法を説明していきたいと思います。

#7. Grafanaストレージ

ポッドのスケーリング、再起動、強制終了などの操作を実行する場合でも、Grafanaデータの一部はクラスターに保持する必要があります。

まず、永続ボリュームを使用するGrafanaデプロイメントを作成する必要があります。

```
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: grafana
  name: grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
      - image: grafana/grafana:5.4.3
        name: grafana
        ports:
        - containerPort: 3000
          name: http

        volumeMounts:
          - name: grafana-storage
            mountPath: /var/lib/grafana
      volumes:
        - name: grafana-storage
          persistentVolumeClaim:
            claimName: grafana-storage
      securityContext:
        runAsNonRoot: true
        runAsUser: 65534
        fsGroup: 472

```

上記の展開では、volume / var / lib / grafanaを使用しています。

次に、永続ボリュームのクレームを作成します。

```
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: grafana-storage
spec:
  accessModes:
- ReadWriteOnce
  resources:
requests:
storage: 1Gi
```

これは、さまざまな構成をニーズに合わせて調整できます。

ボリュームクレームとデプロイメントを作成したら、デプロイメントを公開するためにロードバランサーサービスを作成する必要があります。

```
apiVersion: v1
kind: Service
metadata:
  name: grafana
  labels:
    app: grafana
spec:
  type: LoadBalancer
  ports:
  - port: 3000
    protocol: TCP
    targetPort: http
  selector:
    app: grafana
```

Kubernetesマニフェストファイルは、それぞれgrafana-deployment.yaml、grafana-pvc.yaml、grafana-service.yamlに保存されています。

最後のステップは、Kubernetesオブジェクトを作成することです。

```kubectl create -f grafana-deployment.yaml -f grafana-pvc.yaml  -f grafana-service.yaml ```

このステップでは、ポート3000のロードバランサIPでクラスタに到達できます。Kubernetesアプリのインストール手順を繰り返して、永続性が機能していることを確認できます。

```kubectl exec -it  grafana-96fd979c-kjfhr  grafana-cli plugins install grafana-kubernetes-app```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/36868e06-e1ce-c8e8-ef32-e630f1e53673.png)

#8. 最後にMetricFireについて

GrafanaをKubernetesクラスターにデプロイする方法をStep by Stepで説明させていただきました。  Grafanaは高い汎用性と柔軟性を持ち、特定のニーズに適応させることができ、データの監視、分析、または視覚化が必要な場合に最適です。 
自分でGrafanaを始めてみるのもいいかもしれませんが、セットアップ、またはその後の管理のことを考えると、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes)を使用してGrafanaの使用をすることをお勧めします。MetricFireはKufernetesに加えて、GrafanaはクラウドとPrometheusまたはGraphiteの監視プラットフォームを提供します。これらはすべて、手頃な価格で使いやすい最新のプラットフォームで利用できます。

[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes)を試して、Grafanaダッシュボードの作成を開始してみてください。 また、Grafanaが何ができるかについて質問がある場合は、[デモ](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Deploying%20Grafana%20to%20Kubernetes)も無料で行なってくるとのことです。