Helmでk8sからGrafana Lokiを使ってみる
9/15/2020

オートスケールするECS環境でログを収集する必要が出てきたので、
将来的な可視化も想定しGrafana Lokiを試してみました。
ログ収集エージェントはfluent-bitを使います。
Helmについて
HelmはKubernetes(以下 k8s)のパッケージマネージャ。
aptやyumのようにインストールしたk8sリソースをパッケージ管理できる。
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:先ほど取得したパスワード
// 作り直す時
$ helm uninstall loki-stack-1600588270
$ helm install -n loki loki/loki-stack -f config.yml --generate-name
左のExprolerから上のDataSourceでLokiを選択し、Log labelsを選ぶとk8sクラスタ上のログが確認できます。
prometheusも同様に起動時にconfigで有効にすると、grafanaからmetricsを取得できます。

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