[Grafana] Loki (with k8s)

Loki๋Š” Grafana์—์„œ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋กœ๊ทธ ์ˆ˜์ง‘ ๋„๊ตฌ๋‹ค.
๋กœ๊ทธ๋ฅผ ์Œ“๊ณ , ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋กœ๊ทธ ์ €์žฅ์šฉ ์˜คํ”ˆ์†Œ์Šค๋กœ๋Š” ๋‹จ์—ฐ ์ตœ๊ณ  ์ค‘ ํ•˜๋‚˜๋‹ค.

์Šคํ† ๋ฆฌ์ง€ ์˜ต์…˜์€ ๋‹ค์–‘ํ•˜๋‹ค. ์‹ฑ๊ธ€ ๋…ธ๋“œ์— ๊ทธ๋ƒฅ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ , minio๋„ ์žˆ๊ณ , s3 ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๋‹จ์ผ๋…ธ๋“œ์— NFS๋ฅผ ํ†ตํ•ด์„œ ๊ตฌ์„ฑํ•ด๋ณด๊ณ , ๊ทธ๋ผํŒŒ๋‚˜ ๋Œ€์‹œ๋ณด๋“œ๊นŒ์ง€ ์—ฐ๊ฒฐํ•ด๋ณด๋Š” ๊ฒƒ๊นŒ์ง€๋ฅผ ํ•ด๋ณธ๋‹ค.




์•„ํ‚คํ…์ณ

Loki๋Š” ์ˆ˜ํ‰ ํ™•์žฅ์„ ์ง€์›ํ•˜๋Š” ๋กœ๊ทธ ์ €์žฅ์†Œ๋‹ค.

https://grafana.com/docs/loki/latest/get-started/architecture/
Loki์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…์€ ์ธ๋ฑ์Šค์™€ ์ฒญํฌ๋‹ค. ์ € 2๊ฐ€์ง€์˜ ํ˜•ํƒœ๋กœ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

์ฒญํฌ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋กœ๊ทธ๋ฅผ ์••์ถ•ํ•ด์„œ ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๋งํ•˜๊ณ , ์ธ๋ฑ์Šค๋Š” ๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„์˜ ๋ฐ์ดํ„ฐ์…‹์„ ๋งํ•œ๋‹ค.

์ธ๋ฑ์Šค๋Š” ์˜ˆ์ „์—๋Š” BoltDB๋ผ๋Š”๊ฑธ ์ผ๋Š”๋ฐ, ๊ทธ๊ฑด ๋‹จ์ข…ํ–ˆ๊ณ  TSDB๋ผ๋Š” Prometheus ์›์‚ฐ์˜ ํฌ๋งท์„ ์“ด๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ข‹๋‹ค.
https://grafana.com/docs/loki/latest/get-started/architecture/




helm์œผ๋กœ ์„ค์น˜ํ•˜๊ธฐ

์šฐ์„  helm์œผ๋กœ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

๊ทธ๋ฆฌ๊ณ  ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.

vi loki-single.yaml

deploymentMode: SingleBinary
loki:
  auth_enabled: false
  ingester:
    wal:
      flush_on_shutdown: true
  commonConfig:
    replication_factor: 1
  storage:
    type: 'filesystem'
  schemaConfig:
    configs:
    - from: "2024-01-01"
      store: tsdb
      index:
        prefix: loki_index_
        period: 24h
      object_store: filesystem # we're storing on filesystem so there's no real persistence here.
      schema: v13
memberlist:
  service:
    publishNotReadyAddresses: true
singleBinary:
  replicas: 1
read:
  replicas: 0
backend:
  replicas: 0
write:
  replicas: 0

๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ์ƒ์„ฑ์„ ๋•Œ๋ ค์ค€๋‹ค.

kubectl create namespace loki
helm install --values loki-single.yaml loki grafana/loki -n loki

๊ทธ๋ฆฌ๊ณ  ์ข€ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€

๋‹ค ์ด๋ ‡๊ฒŒ Running์ด ๋˜๋ฉด ์ž˜ ๋œฌ ๊ฒƒ์ด๋‹ค.




PVC ๋ฌธ์ œ ํ•ด๊ฒฐ (์˜จํ”„๋ ˆ๋ฏธ์Šค์˜ ๊ฒฝ์šฐ)

ํด๋ผ์šฐ๋“œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์“ฐ๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์˜จํ”„๋ ˆ๋ฏธ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ณต์‹๋ฌธ์„œ๋งŒ ๋”ฐ๋ผ์น˜๋‹ค๊ฐ€๋Š” ๋Œ€๊ฐ€๋ฆฌ๊ฐ€ ๊นจ์ง„๋‹ค.

0/1 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ํ”ํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

https://blog.naver.com/sssang97/223495801532
๋ถ™์ผ ๋ณผ๋ฅจ ์—†๋‹ค๊ณ  ์ฐก์ฐก๊ฑฐ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

๋‚ด ๊ฒฝ์šฐ์—๋Š” NFS๋ฅผ ์“ฐ๊ณ  ์žˆ์–ด์„œ ๊ทธ๋ƒฅ ๊ทธ๊ฑฐ๋กœ ๋ถ™์˜€๋‹ค.

apiVersion: v1 
kind: PersistentVolume
metadata:
  labels:
    app.kubernetes.io/component: single-binary
    app.kubernetes.io/instance: loki
    app.kubernetes.io/name: loki
  name: nfs-pv-loki
  namespace: loki
spec:
  storageClassName: nfs
  capacity:
    storage: 15Gi 
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.2 
    path: /home/nfs/loki

๋ณผ๋ฅจ ๋งŒ๋“ค๊ณ  ๋ ˆ์ด๋ธ”๋„ ์ข€ ๋‹ฌ์•„์ฃผ๋ฉด ๋œ๋‹ค.
๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ๋Š” ์ตœ์†Œ 10G์งœ๋ฆฌ ๋ณผ๋ฅจ์ด ํ•„์š”ํ•˜๋‹ค.


๊ธฐ๋ณธ ๊ตฌ์„ฑ์—์„œ ํ—ฌ๋ฆ„ ์Šคํƒ์€ storage-loki๋ผ๋Š” pvc๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ๊ทธ๊ฒŒ ๋ฐ”์ธ๋”ฉ๋˜๋ฉด ์ž˜ ๋  ๊ฒƒ์ด๋‹ค.




์ง์ ‘ API ์ฐ”๋Ÿฌ์„œ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

ํ•œ๋ฒˆ ์ง์ ‘ ์ฐ”๋Ÿฌ์„œ Loki๊ฐ€ ์ž˜ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•ด๋ณด์ž.

loki ์Šคํƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ClusterIP๋ฅผ ํ†ตํ•œ ๋‚ด๋ถ€์ ‘๊ทผ๋งŒ์„ ๊ถŒ์žฅํ•˜๊ธฐ์—, ๋‚ด๋ถ€์—์„œ k8s dns๋กœ ์ฐ”๋Ÿฌ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ €๋Œ€๋กœ๋ฉด pod ํ•˜๋‚˜ ๋„์šฐ๊ณ  ๋“ค์–ด๊ฐ€์„œ ์จ์•ผํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๊ธฐ์—” ์˜ ๊ท€์ฐฎ๋‹ค.

ํ˜ธ์ŠคํŠธ์—์„œ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํฌํŠธํฌ์›Œ๋“œ์ข€ ์—ด๊ณ 

kubectl port-forward --namespace loki svc/loki-gateway 3100:80

API๋กœ ๋ฐ”๋กœ ์ฐ”๋Ÿฌ๋ณด๋ฉด ๋œ๋‹ค.

curl "http://127.0.0.1:3100/loki/api/v1/query_range" --data-urlencode 'query={job="test"}' -H X-Scope-OrgId:foo | jq .data.result

์ด๊ฑด ์ฟผ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” API๋‹ค. ์•„์ง ์•„๋ฌด๊ฒƒ๋„ ์•ˆํ–ˆ์œผ๋‹ˆ ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค.


curl -H "Content-Type: application/json" -XPOST -s "http://127.0.0.1:3100/loki/api/v1/push"  \
--data-raw "{\"streams\": [{\"stream\": {\"job\": \"test\"}, \"values\": [[\"$(date +%s)000000000\", \"fizzbuzz\"]]}]}" \
-H X-Scope-OrgId:foo

์ด๋ ‡๊ฒŒ json ํ˜•ํƒœ๋กœ ๋ง์•„์„œ ๋กœ๊ทธ๋ฅผ ์Œ“์„ ์ˆ˜ ์žˆ๋‹ค.

job์€ loki์—์„œ ๋กœ๊ทธ๋ฅผ ๋ฌถ๋Š” ๋‹จ์œ„๋‹ค. ๋ณดํ†ต ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ ๋‹จ์œ„๋ฅผ ํ•˜๋‚˜์˜ job์œผ๋กœ ์žก๊ณ  ๋กœ๊ทธ๋ฅผ ์“ธ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์กฐํšŒํ•˜๋ฉด ๋ฐ€์–ด๋„ฃ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.




Grafana์— ์—ฐ๋™ํ•ด๋ณด๊ธฐ

๊ทธ๋ผํŒŒ๋‚˜์— ๋Œ€ํ•ด์„œ๋Š” ์•ฝ๊ฐ„ ์•Œ๊ณ , ์ด๋ฏธ ๊ตฌ์„ฑํ•ด๋†จ๋‹ค๊ณ  ์ „์ œํ•œ๋‹ค.

๊ทธ๋ผํŒŒ๋‚˜ ๋Œ€์‹œ๋ณด๋“œ๋กœ ์ด๋™ํ•ด์„œ connection์„ ๋จผ์ € ๋“ฑ๋กํ•ด์ค€๋‹ค.


http://loki-gateway.loki.svc.cluster.local

๊ทธ๋ฆฌ๊ณ  ๋Œ€์ถฉ ์ด๋Ÿฐ์‹์˜ k8s dns๋ฅผ ์ž˜ ์ถ”์ถœํ•œ๋‹ค.
helm์œผ๋กœ ๋„์šธ ๋•Œ๋„ ์•Œ๋ ค์ฃผ๊ณ , ๋‚ด๊ฐ€ ์œ„์— ์ ์–ด๋†“์€๋Œ€๋กœ ํ–ˆ์œผ๋ฉด ์ด๋ ‡๊ฒŒ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.


URL์— ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ ๊ณ 


Save & Test๋ฅผ ๋ˆ„๋ฅธ๋‹ค.
์ด๋ ‡๊ฒŒ ๋œจ๋ฉด ์ž˜ ๋œฌ ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ ๋ช‡๊ฐ€์ง€ ์ด์œ ๋กœ ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

loki์— ์ธ์ฆ์ด ์ผœ์ ธ์žˆ๋‹ค๊ฑฐ๋‚˜, networkpolicy๊ฐ€ ๊ฑธ๋ ค์žˆ๋‹ค๊ฑฐ๋‚˜, ๊ทธ๋ƒฅ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜. ์›์ธ์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ •ํ™•ํ•œ ์›์ธ์€ ๊ทธ๋ผํŒŒ๋‚˜ ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ๋ณด๋Š”๊ฒŒ ์ •ํ™•ํ•˜๋‹ค.

์•„๋ฌดํŠผ ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€๊ฐ€ ๋˜๋ฉด ๋œ ๊ฒƒ์ด๋‹ค.

๊ทธ๊ฑธ ๋Œ€์‹œ๋ณด๋“œ์— ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ

Add visualization์„ ๋ˆ„๋ฅดใ…—


๋กœํ‚ค ์„ ํƒ


๊ทธ๋Ÿผ ํŽธ์ง‘์ฐฝ์ด ๋œฌ๋‹ค.


์กฐํšŒํ•  ๋กœ๊ทธ ํ•„ํ„ฐ๋ฅผ ์ ์ ˆํžˆ ๊ฑธ๊ณ 


์–ด๋–ป๊ฒŒ ๋ณผ์ง€๋ฅผ ์ •ํ•œ๋‹ค.


ํ…Œ์ด๋ธ”์€ ๋ญ ์ด๋ ‡๊ฒŒ ๋œจ๊ณ 


Logs๋Š” ์ด๋ ‡๊ฒŒ ๋œฌ๋‹ค.

Logs๊ฐ€ ๋Œ€์ฒด๋กœ ๋” ๋‚˜์€๊ฑฐ๊ฐ™๋‹ค.


์•„๋ฌดํŠผ ๋ญ๋กœ๋“  ์ €์žฅํ•˜๋ฉด


๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ด์ œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.


Logs์˜ ๊ฒฝ์šฐ์—๋Š” ์˜ต์…˜๋„ ์ข€ ์žˆ๋‹ค.

์ด๋Ÿฌ๋ฉด ์•ž๋‹จ์€ ๋Œ€์ถฉ ๋œ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” Promtail์„ ํ†ตํ•ด ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•ด์„œ Loki๋กœ ์˜๋Š”๊ฑธ ํ•ด๋ณด๊ฒ ๋‹ค.

https://blog.naver.com/sssang97/223518925037



์ฐธ์กฐ
https://grafana.com/docs/loki/latest/setup/install/helm/
https://whchoi98.gitbook.io/k8s/observability/loki
https://github.com/grafana/loki/issues/7907
https://github.com/grafana/loki/issues/10529
https://github.com/grafana/loki/issues/9756