こんにちは、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 <none> 3100/TCP 88s
service/loki-stack-1584929978-grafana ClusterIP 10.98.201.214 <none> 80/TCP 88s
service/loki-stack-1584929978-headless ClusterIP None <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 <none> 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 username
にadmin
、password
に上記で取得した値を入れてログインします。
ログインしたら、左側にある「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