Helmを使ってGrafana Lokiの環境を試してみた

AvatarPosted by

こんにちは、SREの川野です。
今回はGrafana Lokiをk8sクラスタ(Minikube)上で試してみたので、ご紹介します!

Grafana Lokiとは

前回の記事で触れているので、概要を知りたい方はこちら↓を見ていただければと思います。

Helmとは

一言でいうと、Kubernetes(以下、k8sと表記します)のパッケージマネージャです。
k8sリソースのインストールと管理を効率化します。apt/yum/homebrewのk8s版みたいなイメージになります。

GitHub https://github.com/helm/helm

リポジトリによってチャートが管理されており、チャートがk8sのマニフェストをまとめているという構成になっています。
Helm CLIを使ってローカルにリポジトリを追加し、そのリポジトリ内で管理されているチャートをインストールすることでk8sクラスタにリソースをデプロイすることができます。

環境構成について

今回は、MinikubeにHelmを使ってLoki環境の構築を行います。

  • デプロイ先
    Minikube v1.5.2(ローカルマシンはMacを使用)
  • デプロイツール
    Helm v3.1.2
    (補足) 以下のロギングスタックの構成を構築するために、loki/loki-stackの version: 0.32.1 のチャートを使用します。
  • ロギングスタックの構成(Minikubeにデプロイするもの)
    – Promtail : ログを収集してLokiに送信するエージェント
    – Loki : ログの保存とクエリの処理を行うメインサーバー
    – Grafana : ログの照会、表示を行う監視ツール

環境構築

https://github.com/grafana/loki/tree/master/production/helm の手順を参考にしています。

手順0. Minikubeをインストールします。

こちらを参考にしてください。(説明は省略します)

Minikubeが起動できたら以下手順に進んでください。

手順1. Helmをインストールします。

今回Macを使用しているのでbrewを使ってインストールすることができます。

$ brew install helm
(出力省略)

以下のバージョンがインストールされたことを確認します。

$ helm version
version.BuildInfo{Version:"v3.1.2", GitCommit:"d878d4d45863e42fd5cff6743294a11d28a9abce", GitTreeState:"clean", GoVersion:"go1.14"}

手順2. チャートのリポジトリを追加します。

以下のコマンド実行して、lokiのチャートがあるリポジトリを追加します。

$ helm repo add loki https://grafana.github.io/loki/charts
"loki" has been added to your repositories

lokiという名前でチャートが登録されていることを確認します。

$ helm repo list
NAME    URL
loki    https://grafana.github.io/loki/charts

手順3. チャートのリポジトリの更新をします。

既にチャートのリポジトリが登録済みである場合は古くなっているかもしれないので更新します。
記事の手順に沿ってインストールしたばかりであれば以下のように最新状態であることが確認できます。

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "loki" chart repository
Update Complete. ⎈ Happy Helming!⎈

手順4. k8sクラスタにnamespaceを作ります。

namespaceを作成し、その仮想クラスタ上で作業します。

$ kubectl create ns loki
namespace/loki created

作成したnamespaceのlokiがあることを確認します。

$ kubectl get ns
NAME              STATUS   AGE
default           Active   264d
kube-node-lease   Active   264d
kube-public       Active   264d
kube-system       Active   264d
loki              Active   6s

手順5. loki, grafana, promtailをk8sクラスタにデプロイします。

今回使用するチャートはlokiリポジトリのloki-stackになります。

以下コマンドを実行してチャートの情報を確認します。

$ helm inspect chart loki/loki-stack
apiVersion: v1
appVersion: v1.3.0
dependencies:
- condition: loki.enabled
  name: loki
  repository: file://../loki
  version: ^0.6.0
- condition: promtail.enabled
  name: promtail
  repository: file://../promtail
  version: ^0.6.0
- condition: fluent-bit.enabled
  name: fluent-bit
  repository: file://../fluent-bit
  version: ^0.0.1
- condition: grafana.enabled
  name: grafana
  repository: https://kubernetes-charts.storage.googleapis.com/
  version: ~3.8.15
- condition: prometheus.enabled
  name: prometheus
  repository: https://kubernetes-charts.storage.googleapis.com/
  version: ~9.3.0
description: 'Loki: like Prometheus, but for logs.'
home: https://grafana.com/loki
icon: https://github.com/grafana/loki/raw/master/docs/logo.png
kubeVersion: ^1.10.0-0
maintainers:
- email: lokiproject@googlegroups.com
  name: Loki Maintainers
name: loki-stack
sources:
- https://github.com/grafana/loki
version: 0.32.1

このチャートは複数のチャート(上記でいうとloki, promtail, fluent-bit, grafana, prometheus)と依存関係を持つ構成だということがわかります。さらにconditionを使うことでこれらのチャートを使用するかどうかの選択ができるようになっています。

values.yaml で変数定義しており、condition で指定している変数は以下のようになっていることを確認できます。

$ helm inspect values loki/loki-stack
loki:
  enabled: true

promtail:
  enabled: true

fluent-bit:
  enabled: false

grafana:
  enabled: false
  sidecar:
    datasources:
      enabled: true
  image:
    tag: 6.6.0

prometheus:
  enabled: false

granfana.enabledの値がfalse になっているため、以下のインストールコマンド実行時に--set grafana.enabled=trueというオプションを追加して有効化します。

$ helm install -n loki loki/loki-stack --generate-name --set grafana.enabled=true
NAME: loki-stack-1584929978
LAST DEPLOYED: Mon Mar 23 11:19:38 2020
NAMESPACE: loki
STATUS: deployed
REVISION: 1
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.

k8sクラスタにデプロイされていることを確認します。

$ helm list -n loki
NAME                    NAMESPACE   REVISION    UPDATED                                 STATUS      CHART               APP VERSION
loki-stack-1584929978   loki        1           2020-03-23 11:19:38.829032 +0900 JST    deployed    loki-stack-0.32.1   v1.3.0

また、k8sコンポーネントの各リソースが作成されていることを確認できます。

$ kubectl get all -n loki
NAME                                                READY   STATUS    RESTARTS   AGE
pod/loki-stack-1584929978-0                         1/1     Running   0          88s
pod/loki-stack-1584929978-grafana-87c5fd6ff-7gxhg   1/1     Running   0          88s
pod/loki-stack-1584929978-promtail-xw25h            1/1     Running   0          88s


NAME                                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/loki-stack-1584929978            ClusterIP   10.99.151.239           3100/TCP   88s
service/loki-stack-1584929978-grafana    ClusterIP   10.98.201.214           80/TCP     88s
service/loki-stack-1584929978-headless   ClusterIP   None                    3100/TCP   88s

NAME                                            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/loki-stack-1584929978-promtail   1         1         1       1            1                     88s

NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/loki-stack-1584929978-grafana   1/1     1            1           88s

NAME                                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/loki-stack-1584929978-grafana-87c5fd6ff   1         1         1       88s

NAME                                     READY   AGE
statefulset.apps/loki-stack-1584929978   1/1     88s

手順6. grafanaのadminユーザのパスワードを取得します。

grafanaのadminパスワードを取得するために生成されたsecretsリソースを確認します。loki-stack-1584929978-grafanaがgrafanaが使用しているsecretsリソースになります。

$ kubectl get secrets -n loki
NAME                                             TYPE                                  DATA   AGE
default-token-dqjq9                              kubernetes.io/service-account-token   3      6m24s
loki-stack-1584929978                            Opaque                                1      3m
loki-stack-1584929978-grafana                    Opaque                                3      3m
loki-stack-1584929978-grafana-test-token-qxtjh   kubernetes.io/service-account-token   3      3m
loki-stack-1584929978-grafana-token-bd92f        kubernetes.io/service-account-token   3      3m
loki-stack-1584929978-promtail-token-xvmz8       kubernetes.io/service-account-token   3      3m
loki-stack-1584929978-token-7d2qg                kubernetes.io/service-account-token   3      3m
sh.helm.release.v1.loki-stack-1584929978.v1      helm.sh/release.v1                    1      3m

grafanaのadminパスワードを取得します。

$ kubectl get secret -n loki loki-stack-1584929978-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
mY1X6RuFHuo1D82M4xZZwBXuyoBKGtgOjmi23bRD

手順7. grafanaにブラウザでアクセスします。

grafanaにブラウザでアクセスできるようにするために、grafanaのserviceの受けている80番ポートをローカルホストの3000番ポートにポートフォワーディングします。

$ kubectl port-forward -n loki service/loki-stack-1584929978-grafana 3000:80
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000

するとブラウザで、localhost:3000でアクセスするとgrafanaのログイン画面が表示されるはずです。
表示されたら、email or usernameadminpasswordに上記で取得した値を入れてログインします。

ログインしたら、左側にある「Exproler」を選択し、既にLokiがDataSourceとして登録されているので、「Loki」を選択した状態で「Log labels」を選ぶことでk8sクラスタ上のログの確認をすることができます。

おわりに

今回はHelmのloki/loki-stackチャートを使用して手軽にLoki環境の構築をすることができました。

このチャートでは他に、values.yaml の設定値を変更することで、Ingressを使ってlokiのエンドポイントをhttpsにしたり、promtailでsyslogやsystemd-journalログの送受信を行うようにすることができるようなので、また別の機会に試してみようと思います!

参考文献

https://github.com/grafana/loki/tree/master/production/helm
https://qiita.com/sotoiwa/items/993990edf2bb98af7c1d
https://qiita.com/sotoiwa/items/804155aca5ec6d52bac0