Helmでk8sからGrafana Lokiを使ってみる

9/15/2020

オートスケールするECS環境でログを収集する必要が出てきたので、
将来的な可視化も想定しGrafana Lokiを試してみました。
ログ収集エージェントはfluent-bitを使います。

Helmについて

HelmはKubernetes(以下 k8s)のパッケージマネージャ。
aptやyumのようにインストールしたk8sリソースをパッケージ管理できる。

https://github.com/helm/helm

helmコマンドからリポジトリを追加し、そのリポジトリ内に存在するチャートをインストールすることでk8sクラスタにデプロイが可能。

Grafana Lokiについて

可用性の高いマルチテナントログ集約システム。
今回の構成ではログの保存を担当する。
https://github.com/grafana/loki

システム構成(予定)

・k8sクラスタ(EKS)
grafana
|
grafana loki
|
fluent-bit

・ログ収集対象のコンテナ(ECS)
nginx
|
AWS FireLens

今回の記事ではk8sクラスタのみを作り、EKSではなくローカルで自身のpodのログを取るところまで。
AWSは今後Productionに載せる際に使います。

環境構築

一旦ローカルのMac上で動かします。

// minikube install & start

$ brew install minikube
$ minikube start

// helm install

$ brew install helm

// リポジトリにlokiのチャートを追加

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

// 既にlokiを登録済みの場合は古いチャートをアップデート

$ 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!⎈
----------------------------------------

// loki namespaceを作成

$ kubectl create ns loki
$ kubectl get ns
----------------------------------------
NAME              STATUS   AGE
default           Active   3m36s
kube-node-lease   Active   3m38s
kube-public       Active   3m38s
kube-system       Active   3m38s
loki              Active   13s
----------------------------------------

// fluent-bit, grafana, lokiをk8sクラスタにデプロイする
// loki-stackチャートの情報を見ると、複数のチャートが依存している。

$ helm inspect chart loki/loki-stack
----------------------------------------
apiVersion: v1
appVersion: v1.6.0
dependencies:
- condition: loki.enabled
  name: loki
  repository: file://../loki
  version: ^0.30.0
- condition: promtail.enabled
  name: promtail
  repository: file://../promtail
  version: ^0.23.0
- condition: fluent-bit.enabled
  name: fluent-bit
  repository: file://../fluent-bit
  version: ^0.1.0
- 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
- condition: filebeat.enabled
  name: filebeat
  repository: https://helm.elastic.co
  version: ~7.8.0
- condition: logstash.enabled
  name: logstash
  repository: https://kubernetes-charts.storage.googleapis.com/
  version: ~2.4.0

...以下略
----------------------------------------

// conditionでenable true or falseを管理しているが、valuesでも確認できる。

$ 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.7.0

prometheus:
  enabled: false

...以下略
----------------------------------------

promtail等は不要、fluent-bitとgrafanaは使いたい。
インストール時のコマンドでoptionから指定も出来るが、設定はファイルとして出力して指定し、-fでインストール時に設定を上書きする。

$ helm inspect values loki/loki-stack > config.yml
$ vi config.yml

$ helm install -n loki loki/loki-stack -f config.yml --generate-name
----------------------------------------
coalesce.go:160: warning: skipped value for filters: Not a table.
NAME: loki-stack-1600588270
LAST DEPLOYED: Sun Sep 20 16:51:12 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.
----------------------------------------

// 作成されたリソースの確認

$ helm list -n loki
----------------------------------------
NAME                 	NAMESPACE	REVISION	UPDATED                             	STATUS  	CHART            	APP VERSION
loki-stack-1600588270	loki     	1       	2020-09-20 16:51:12.482686 +0900 JST	deployed	loki-stack-0.40.1	v1.6.0
----------------------------------------

$ kubectl get all -n loki
----------------------------------------
NAME                                                 READY   STATUS    RESTARTS   AGE
pod/loki-stack-1600588270-0                          1/1     Running   0          9m24s
pod/loki-stack-1600588270-fluent-bit-loki-9pt79      1/1     Running   0          9m24s
pod/loki-stack-1600588270-grafana-79864ccc8f-jh4bw   1/1     Running   0          9m24s

NAME                                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/loki-stack-1600588270            ClusterIP   10.102.247.30   <none>        3100/TCP   9m24s
service/loki-stack-1600588270-grafana    ClusterIP   10.106.200.51   <none>        80/TCP     9m24s
service/loki-stack-1600588270-headless   ClusterIP   None            <none>        3100/TCP   9m24s

NAME                                                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/loki-stack-1600588270-fluent-bit-loki   1         1         1       1            1           <none>          9m24s

NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/loki-stack-1600588270-grafana   1/1     1            1           9m24s

NAME                                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/loki-stack-1600588270-grafana-79864ccc8f   1         1         1       9m24s

NAME                                     READY   AGE
statefulset.apps/loki-stack-1600588270   1/1     9m24s
----------------------------------------

// grafanaのadminパスワードを取得
$ kubectl get secrets -n loki
----------------------------------------
NAME                                                TYPE                                  DATA   AGE
default-token-x27qq                                 kubernetes.io/service-account-token   3      23m
loki-stack-1600588270                               Opaque                                1      10m
loki-stack-1600588270-fluent-bit-loki-token-664rx   kubernetes.io/service-account-token   3      10m
loki-stack-1600588270-grafana                       Opaque                                3      10m
loki-stack-1600588270-grafana-test-token-rkrkd      kubernetes.io/service-account-token   3      10m
loki-stack-1600588270-grafana-token-kclfz           kubernetes.io/service-account-token   3      10m
loki-stack-1600588270-token-vkmb4                   kubernetes.io/service-account-token   3      10m
sh.helm.release.v1.loki-stack-1600588270.v1         helm.sh/release.v1                    1      10m
----------------------------------------

loki-stack-1600588270-grafanaがgrafanaが使用しているsecretsリソースとなる。
このような出力の場合、以下のコマンドでパスワードを取得する

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

// ポートフォワーディングを設定し localhost:3000 でブラウザからアクセスする

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

email or username:admin
password:先ほど取得したパスワード

grafana_top

// 作り直す時

$ helm uninstall loki-stack-1600588270
$ helm install -n loki loki/loki-stack -f config.yml --generate-name

左のExprolerから上のDataSourceでLokiを選択し、Log labelsを選ぶとk8sクラスタ上のログが確認できます。

grafana_explore_log

prometheusも同様に起動時にconfigで有効にすると、grafanaからmetricsを取得できます。

©️ 2020 ふじい Dev-Remo-Work.