Grafana LokiをMinikubeで試す

[Grafana Loki](https://github.com/grafana/loki)をHelmチャートを使ってインストールする。

|コンポーネント|バージョン|
|---|---|
|Minikube|v1.3.1|
|Kubernetes|v1.15.2|
|Helm|v2.14.4|
|loki-stackチャート|0.15.0|
|Grafanaチャート|3.8.1|
|Grafana|6.2.5|

## 準備

Minikubeを起動する。

```shell
minikube start
```

Minikubeで`ingress`のアドオンを有効にする。

```shell
minikube addons enable ingress
```

MinikubeのIPアドレスを確認する。

```shell
minikube ip
```

`/etc/hosts`にMinikubeのIPを追記する。各コンポーネントへのIngress経由でのアクセスをパスで分けようとすると、パスのリライトやリダイレクトの整合性をとるのが難しいので、仮想ホストを分けた方が楽。

```:/etc/hosts
192.168.99.141  grafana.minikube
```

Grafana LokiとGrafanaをデプロイする先のNamespaceを作成する。

```shell
kubectl create ns monitoring
```

`helm`を初期化し、クラスターに`tiller`をデプロイする。

```shell
helm init
```

## Grafana Loki

- https://github.com/grafana/loki/tree/master/production/helm

Helmリポジトリを追加する。

```shell
helm repo add loki https://grafana.github.io/loki/charts
helm repo update
```

Lokiのチャートを確認する。

```shell-session
$ helm search loki
NAME           	CHART VERSION	APP VERSION	DESCRIPTION
loki/loki      	0.13.0       	0.0.1      	Loki: like Prometheus, but for logs.
loki/loki-stack	0.15.0       	0.0.1      	Loki: like Prometheus, but for logs.
loki/promtail  	0.11.0       	0.0.1      	Responsible for gathering logs and sending them to Loki
$
```

loki-stackがまとめてインストールするためのチャートで、loki、promtailは個別にインストールするためのチャート。valuesを確認すると、loki-stackのほうはvaluesで設定できるところが少ない（PersistentVolumeも設定できない）ので、いろいろ設定したい場合はそれぞれ個別にインストールした方がよさそう。今回はloki-stackでやってみる。

```shell-session
$ helm inspect values loki/loki-stack
loki:
  enabled: true

promtail:
  enabled: true

grafana:
  enabled: false
  sidecar:
    datasources:
      enabled: true
  image:
    tag: 6.3.0-beta2

prometheus:
  enabled: false
  server:
    fullnameOverride: prometheus-server

$
```

デフォルトのままインストールする。

```shell:コマンド
helm upgrade --install loki --namespace=monitoring loki/loki-stack
```

```shell-session:実行例
$ helm upgrade --install loki --namespace=monitoring loki/loki-stack
Release "loki" does not exist. Installing it now.
NAME:   loki
LAST DEPLOYED: Wed Aug 14 15:56:32 2019
NAMESPACE: monitoring
STATUS: DEPLOYED

RESOURCES:
==> v1/ClusterRole
NAME                       AGE
loki-promtail-clusterrole  0s

==> v1/ClusterRoleBinding
NAME                              AGE
loki-promtail-clusterrolebinding  0s

==> v1/ConfigMap
NAME                  DATA  AGE
loki-loki-stack-test  1     0s
loki-promtail         1     0s

==> v1/DaemonSet
NAME           DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR  AGE
loki-promtail  1        1        0      1           0          <none>         0s

==> v1/Pod(related)
NAME                 READY  STATUS             RESTARTS  AGE
loki-0               0/1    ContainerCreating  0         0s
loki-promtail-9zwnd  0/1    ContainerCreating  0         0s

==> v1/Role
NAME           AGE
loki           0s
loki-promtail  0s

==> v1/RoleBinding
NAME           AGE
loki           0s
loki-promtail  0s

==> v1/Secret
NAME  TYPE    DATA  AGE
loki  Opaque  1     0s

==> v1/Service
NAME           TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)   AGE
loki           ClusterIP  10.97.36.183  <none>       3100/TCP  0s
loki-headless  ClusterIP  None          <none>       3100/TCP  0s

==> v1/ServiceAccount
NAME           SECRETS  AGE
loki           1        0s
loki-promtail  1        0s

==> v1/StatefulSet
NAME  READY  AGE
loki  0/1    0s

==> v1beta1/PodSecurityPolicy
NAME           PRIV   CAPS      SELINUX           RUNASUSER  FSGROUP    SUPGROUP  READONLYROOTFS  VOLUMES
loki           false  RunAsAny  MustRunAsNonRoot  MustRunAs  MustRunAs  true      configMap,emptyDir,persistentVolumeClaim,secret
loki-promtail  false  RunAsAny  RunAsAny          RunAsAny   RunAsAny   true      secret,configMap,hostPath


NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.

See http://docs.grafana.org/features/datasources/loki/ for more detail.

$
```

## Grafana

Grafanaのチャートを確認する。

```shell-session
$ helm search grafana
NAME          	CHART VERSION	APP VERSION	DESCRIPTION
stable/grafana	3.8.1        	6.2.5      	The leading tool for querying and visualizing time series...
$
```

valuesファイルを作成する。

```yaml:grafana-values.yaml
ingress:
  enabled: true
  hosts:
    - grafana.minikube
persistence:
  enabled: true
  storageClassName: "standard"
  size: 1Gi
```

Grafanaをインストールする。

```shell:コマンド
helm upgrade --install grafana --namespace monitoring -f grafana-values.yaml stable/grafana
```

```shell-session:実行例
$ helm upgrade --install grafana --namespace monitoring -f grafana-values.yaml stable/grafana
Release "grafana" does not exist. Installing it now.
NAME:   grafana
LAST DEPLOYED: Wed Aug 14 16:05:23 2019
NAMESPACE: monitoring
STATUS: DEPLOYED

RESOURCES:
==> v1/ClusterRole
NAME                 AGE
grafana-clusterrole  0s

==> v1/ClusterRoleBinding
NAME                        AGE
grafana-clusterrolebinding  0s

==> v1/ConfigMap
NAME          DATA  AGE
grafana       1     0s
grafana-test  1     0s

==> v1/PersistentVolumeClaim
NAME     STATUS  VOLUME                                    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
grafana  Bound   pvc-185e05f7-98e2-45c8-9581-b73e3c7ddf70  1Gi       RWO           standard      0s

==> v1/Pod(related)
NAME                      READY  STATUS    RESTARTS  AGE
grafana-6f7f8fd676-hfxd5  0/1    Init:0/1  0         0s

==> v1/Role
NAME          AGE
grafana-test  0s

==> v1/RoleBinding
NAME          AGE
grafana-test  0s

==> v1/Secret
NAME     TYPE    DATA  AGE
grafana  Opaque  3     0s

==> v1/Service
NAME     TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
grafana  ClusterIP  10.101.117.247  <none>       80/TCP   0s

==> v1/ServiceAccount
NAME          SECRETS  AGE
grafana       1        0s
grafana-test  1        0s

==> v1beta1/Ingress
NAME     HOSTS             ADDRESS  PORTS  AGE
grafana  grafana.minikube  80       0s

==> v1beta1/PodSecurityPolicy
NAME          PRIV   CAPS      SELINUX   RUNASUSER  FSGROUP   SUPGROUP  READONLYROOTFS  VOLUMES
grafana       false  RunAsAny  RunAsAny  RunAsAny   RunAsAny  false     configMap,emptyDir,projected,secret,downwardAPI,persistentVolumeClaim
grafana-test  false  RunAsAny  RunAsAny  RunAsAny   RunAsAny  false     configMap,downwardAPI,emptyDir,projected,secret

==> v1beta1/Role
NAME     AGE
grafana  0s

==> v1beta1/RoleBinding
NAME     AGE
grafana  0s

==> v1beta2/Deployment
NAME     READY  UP-TO-DATE  AVAILABLE  AGE
grafana  0/1    1           0          0s


NOTES:
1. Get your 'admin' user password by running:

   kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana.monitoring.svc.cluster.local

   From outside the cluster, the server URL(s) are:
     http://grafana.minikube


3. Login with the password from step 1 and the username: admin

$
```

上記出力に従い、`admin`のパスワードを確認しておく。

## Lokiの設定

以下のURLからGrafanaにアクセスしてログインする。

- http://grafana.minikube/

データソースとしてLokiを設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86449/70d9855c-bac0-3fbc-a293-7deec6b3d88d.png)

Exploreからログを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86449/16c4c0ae-9aff-810e-3d3d-5633b774022d.png)

##  参考リンク

- [MinikubeにPrometheusとGrafanaをHelmチャートでデプロイする](https://qiita.com/sotoiwa/items/993990edf2bb98af7c1d)
- https://grafana.com/docs/features/datasources/loki/
- https://medium.com/orangesys/grafana-logging-using-loki-276d04e0981c