[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