티스토리 뷰

 

내가 막 입사했을 때만해도 로그 관리 자체가 안되고 있었다.

 

Cloud Watch를 뒤적거리던가, ArgoCD 대시보드에서 컨테이너에 접근해서 로그를 파악했다.

 

.... 그래서 DevOps 관리자 분과 가장 먼저 협업한 것이 로그 파이프라인 구성이었다.

 

내가 한 일은 다음과 같다.

 

1. Application 단에서 발생한 로그를 어느 단위로 남길 것인지 판단하고 필요한 정보를 검토

2. 검토된 정보들을 로그로 만들어 JSON 형태로 남김

3. LogQL 쿼리로 Loki 데이터를 쿼리해서 Grafana에 대시보드를 추가

 

DevOps 관리자분은 따로 작업하셨어서 어떤 일을 했었는지 정확히 알기 어려웠는데, 이번 기회에 잘 알게 됐다.

 

DevOps 관리자분이 한 일은 다음과 같다.

 

1. JSON 형태의 로그가 생성됐을 때 읽어 올 수 있는 로그 수집기를 구성

2. 로그 데이터를 저장하고, 이를 효율적으로 검색할 수 있도록 하는 Loki를 구성

3. 데이터 저장소를 S3로 설정

4. Grafana에 Loki를 연동

 

이 과정을 차근 차근 알아보려고 한다.

 

Grafana Loki 란?

Loki는 Prometheus 에서 영감을 받아 수평 확장이 가능하고 가용성이 높은 다중 테넌트 로그 집계 시스템입니다 . Loki는 메트릭 대신 로그에 초점을 맞추고 풀 대신 푸시를 통해 로그를 수집한다는 점에서 Prometheus와 다릅니다.
Loki는 매우 비용 효율적이고 확장성이 뛰어나도록 설계되었습니다. 다른 로깅 시스템과 달리 Loki는 로그 내용을 색인화하지 않고 로그에 대한 메타데이터만 각 로그 스트림에 대한 레이블 세트로 색인화합니다. 로그 데이터는 압축되어 Amazon Simple Storage Service(S3) 또는 Google Cloud Storage(GCS)와 같은 객체 저장소에 청크로 저장되거나 심지어 개발이나 개념 증명을 위해 파일 시스템에 저장됩니다. 작은 인덱스와 고도로 압축된 청크는 작업을 단순화하고 Loki 비용을 크게 낮춥니다.
https://grafana.com/docs/loki/latest/get-started/overview/

 

 

여기서 주목할 점은 Grafana Loki는 로그를 집계/쿼리할 수 있도록 지원해주는 시스템이라는 것이다. 

 

위 그림에서도 확인할 수 있는데, Agent를 통해 로그를 수집하는 부분은 따로 있다.

 

주로 사용되는 로그 수집기는 Promtail 이다. 

 

위 그림을 조금 더 세분화해서 그려보면 다음과 같다.

 

 

노드 별로 Daemonset으로 Promtail을 띄워주면, Loki에서 지정한 위치에 로그가 저장된다.

 

1. Promtail 설정

https://grafana.com/docs/loki/latest/send-data/promtail/cloud/eks/#run-the-promtail-client-on-aws-eks

2. Loki 설정

https://grafana.com/docs/loki/latest/setup/install/helm/

3. Loki S3 경로 설정

https://grafana.com/docs/loki/latest/setup/install/helm/configure-storage/

 

Terraform으로는 별로 할게 없다. helm_release로 위 파일들을 구성해주면 끝이다.

 

위 설정이 제대로 된다면 아래와 검색하면 아래와 같이 pod가 조회된다.

> kubectl get -n monitoring pods
NAME                                                              READY   STATUS    RESTARTS   AGE
loki-0                                                            1/1     Running   0          21d
loki-promtail-5wtl2                                               1/1     Running   0          25d
loki-promtail-97mfj                                               1/1     Running   0          32h
loki-promtail-nxx2m                                               1/1     Running   0          21d
loki-promtail-pv2mv                                               1/1     Running   0          16h
loki-promtail-pxg2s                                               1/1     Running   0          2d
loki-promtail-t87pn                                               1/1     Running   0          5d15h

 

현재 로그를 쿼리해보면 아래와 같이 구성된다.

{
  "_timestamp": "2024-07-07T09:00:31.111Z",
  "app": "backend-prod",
  "code": "0",
  "container": "default",
  "filename": "/var/log/pods/backend-7778ddfcf-nsklz_68355e9e-7e86-44a4-b8df-b47317bd00b7/default/0.log",
  "id": "undefined",
  "instance": "backend-prod",
  "job": "prod/backend-prod",
  "level": "INFO",
  "logger_name": "com.logging.LogMessageManager",
  "message": "LOG",
  "method": "GET",
  "namespace": "prod",
  "node_name": "ip-10-1-31-4.ap-northeast-2.compute.internal",
  "parameter": "{}",
  "pod": "backend-7778ddfcf-nsklz",
  "stream": "stdout",
  "url": "/api/"
}

Grafana에서 Loki를 연동하고 적절한 쿼리를 만들어서 대시보드를 만들면 된다.

 

최종 결과물은 아래와 같이 구성된다.

 

 

조금 더 자세한 과정을 보고 싶으면 아래의 링크를 추천한다.

https://jennifersoft.com/ko/blog/kubernetes/2024-01-17-kubernetes-17/

마치며

현재 서비스에서는 모니터링과 지표 관리를 위해서 Grafana를 사용하고 있다.

 

하지만 Grafana 까지 내용을 다루기엔 너무 광범위해진다.

 

그리고 로그 처리를 위한 Loki 구축은 크게 어렵지가 않고, 레퍼런스도 많다.

 

그래서 이번 예제 코드는 간단히 정리했다.

 

이제 사내 k8s 구성요소를 모두 정리했다.

 

이젠 진짜 BE 업무에 전념하려고한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함