K8S
의 로그 시스템을 찾던 도중 Loki
를 알게 되었습니다. ELK
와 같은 다른 로그 시스템들도 있었지만 Loki
가 학습곡선이 낮고 ELK
등과 비교해 초기 관리요소가 적었으며 Loki
가 고가용성 수평확장에 용이하도록 설계되어 k8s
와 잘 맞아떨어지기에 로그 시스템으로 Loki
를 선택하였습니다. 그래서 이번 블로그에서는 Loki
의 아키텍쳐와 간단한 실습 방법을 공유하고자 합니다.
이번 블로그는
KodeKloud 의 Mastering Grafana Loki
를 기반으로 실습하였습니다.
Promtail
은 자신의 서버의 로그가 업데이트되면 Loki
에게 변경사항을 알려준다 (push 한다). 참고로 FluentD
, Logstash
도 Promtail
와 같은 역할을 할 수 있다.
Loki
는 일종의 데이터 관리 서버로서, Promtail
이 전달한 로그를 수집하여 자신이 지정한 DB 공간에 저장한다. DB 저장 가능 공간은 로컬, s3, GCS 등이 있다. (실행해보면 디폴트는 로컬로 되어 있다.)
그라파나
는 데이터를 GUI 로 볼 수 있는 앱이다. 그라파나를 통해 로키가 관리하는 데이터를 확인하고 쿼리를 날려 정보를 확인할 수 있다.
Loki
와 promtail
을 간단히 띄워보고 이후에 k8s 를 통해 띄워보겠습니다.
우분투 기준으로 작성하였습니다.
loki 와 promtail, grafana 를 직접 실행시켜서 동작을 확인해보겠습니다.
Loki
및 promtail
다운로드
다운로드 관련 참조 링크 : https://github.com/grafana/loki/releases/
$ wget https://github.com/grafana/loki/releases/download/v2.8.6/loki-linux-amd64.zip
$ unzip loki-linux-amd64.zip
$ chmod a+x loki-linux-amd64
$ wget https://github.com/grafana/loki/releases/download/v2.8.6/promtail-linux-amd64.zip
$ unzip promtail-linux-amd64.zip
$ chmod a+x promtail-linux-amd64
$ wget https://raw.githubusercontent.com/grafana/loki/v2.8.6/cmd/loki/loki-local-config.yaml
$ wget https://raw.githubusercontent.com/grafana/loki/v2.8.6/clients/cmd/promtail/promtail-local-config.yaml
# Loki 실행
$ sudo ./loki-linux-amd64 -config.file loki-local-config.yaml
# 다른 터미널에서 Promtail 실행
$ sudo ./promtail-linux-amd64 -config.file promtail-local-config.yaml
해보면 promtail 에서 아래와 같은 warn 메세지가 나올 수 있다.
해당 메세지는 loki 에서의 수용량 제한(4mb/s)을 초과하는 메세지를 promtail 에서 전송하고 있다는 뜻이다.$ sudo ./promtail-linux-amd64 -config.file promtail-local-config.yaml ===== ... level=warn ts=2023-11-23T10:18:45.635262317Z caller=client.go:419 component=client host=localhost:3100 msg="error sending batch, will retry" status=429 tenant= error="server returned HTTP status 429 Too Many Requests (429): Ingestion rate limit exceeded for user fake (limit: 4194304 bytes/sec) while attempting to ingest '4532' lines totaling '1048565' bytes, reduce log volume or contact your Loki administrator to see if the limit can be increased" ...
나와 같은 에러가 난다면
Loki
의 수용량 제한을 늘려주자.
아래와 같이 loki 의 config 파일을 수정하고 로키를 재시작하면 된다.# loki-local-config.yaml limits_config: ingestion_rate_mb: 15 ingestion_burst_size_mb: 30
그라파나는 데이터를 GUI 로 볼 수 있게 해주는 프로그램이다. 그라파나를 통해서 Loki
의 결과를 확인해보자.
우선 아래와 같이 도커를 통해 그라파나를 실행해주자.
# 도커를 통한 그라파나 실행.
## 실행되는데 약 10초정도 걸릴 수 있다.
$ docker run -d --name=grafana -p 3000:3000 --add-host host.docker.internal:host-gateway grafana/grafana
이후에 브라우저를 통해 그라파나에 접속해보자.
# 초기 id/passwrod: admin
아래처럼 Data Sources 에서 Loki
를 선택하고 경로를 다음과 같이 넣어주자.
Loki DB URL
: http://host.docker.internal:3100
이후 아래와 같이 저장한다.
그 다음 explore
로 들어가면 Loki
를 통한 로그 결과를 확인할 수 있다.
Loki
를 helm
을 통해 쿠버네티스에 설치하여 사용할 수 있습니다. helm 을 통해 grafana, loki, promtail 을 한번에 설치해보겠습니다.
grafana, loki, promtail 을 설치하는 helm chart 를 사용해 설치합니다.
# grafana 에서 지원하는 helm chart 를 가져옵니다.
$ helm repo add grafana https://grafana.github.io/helm-charts
# 레포를 최신으로 갱신합니다.
$ helm repo update
# loki 라는 레포를 찾습니다.
$ helm search repo loki
...
grafana/loki-stack 2.9.11 v2.6.1 Loki: like Prometheus, but for logs.
...
# 찾은 레포중에 grafana, loki, protail 을 지원하는 차트의 values.yaml 을 얻습니다.
$ helm show values grafana/loki-stack > values.yaml
# grafana 를 추가하도록 values.yaml 수정
$ vim values.yaml
## grafana:
## enabled: false => true
# 헬름 차트 install
$ helm install --values values.yaml loki-stack grafana/loki-stack
# 포트포워딩 3111 => 3000
$ kubectl port-forward deployments/loki-stack-grafana 3111:3000
아래처럼 브라우저로 접속합니다.
# 설치된 grafana 의 password 를 가져옵니다.
$ kubectl get secrets loki-stack-grafana -o jsonpath="{.data.admin-password}" | base64 --decode
## => Us5iM9xO7pefEdPlAloZQOBylCJlxtxrhLYM7df
그라파나에 로그인합니다.
# userId: admin
# password: Us5iM9xO7pefEdPlAloZQOBylCJlxtxrhLYM7df
이를 통해 Loki
와 연동하여 그라파나를 통해 로그를 확인할 수 있습니다.
참고 자료:
로키 관련 가이드 유튜브 영상
Loki 공식 사이트