devops

Promtail - Loki을 이용하여 쿠버네티스 Container 로그파일 모니터링하기 본문

DevOps/Monitoring

Promtail - Loki을 이용하여 쿠버네티스 Container 로그파일 모니터링하기

vata500 2023. 12. 27. 23:31
반응형

우리 팀에선 Loki-Prometheus-Grafana 스택으로 서비스 로그와 메트릭을 Grafana에 통합하여 모니터링하고 있다. 특히, Loki는 Container의 stdout, stderr 로그를 생성된 파드 기준으로 Promtail을 통해 수집하는데, debug 로그는 컨테이너 내부에서. log 파일 형태로 저장한다.

디버그 로그파일인 service.log

서비스 로그 레벨은 3으로 설정되어 있어, 문제가 생길 때마다 컨테이너에 있는 debug 파일을 확인하는게 아주 번거롭다. 그렇다고 로그레벨 수정을 위해 실행 중인 서비스를 재실행할 수 도 없었기에,  retention을 최대한 줄이더라도 debug 로그를 수집할 필요가 있었다.

 이 로그 파일을 로깅하기 위해서 고민했던 방식은 크게 3가지였다. 

  1. hostpath로 노드에 컨테이너 로그 파일을 저장하여 Promtail로 로깅
  2. PVC를 활용하여 로그 파일 저장하여 Promtail로 로깅
  3. emptydir로 로그 파일 저장하여 같은 파드 내의 Promtail sidecar로 로깅

첫번째는 Promtail이 기본적으로 노드 별로 추가적인 scrapeConfig 설정이 가능했기 때문에 고민했던 방법이다. 그러나 hostpath로 마운트된 노드 볼륨에 로그파일을 적재하면, 파드의 라이프사이클에 맞춰 삭제하는 테스크가 필요했다. 만약 삭제가 되지 않을 경우에 노드의 볼륨 문제가 발생할 수 있어 주의해야 했다. 

두 번째는 외부 볼륨을 통한 로그 파일 관리가 가능하다면, 노드에 영향을 주지 않고도 로그 파일을 한 곳에 적재할 수 있겠다는 판단이 들었다. 그러나, Promtail의 PV 접근이 까다롭고 클러스터 내에서 해결할 수 있는 문제가 아니었다.

결국, 세번째 방법인 파드의 emptydir 볼륨을 이용해서 로그파일을 저장하고, Promtail을 sidecar 컨테이너로 실행하여 로깅하는 것으로 결정했다.

이 방법은 emptydir 볼륨은 파드의 라이프사이클과 동일하기에, 파드와 함께 삭제될 수 있었고 같은 파드 내에서 서비스 컨테이너와 함께 실행된 Promtail도 emptydir 볼륨에 접근이 가능했기 때문에 간단했다.

구현 순서에 대해서 간단히 설명하자면,

Configmap을 이용하여 Promtail Config.yml 생성

Promtail이 실행될 때 사용할 config 파일을 configmap으로 선언한다고 보면 된다. 아래와 같이 실행될 서비스의 네임스페이스, loki의 gateway 주소, job-name과 쿼리 될 레이블, 그리고 log파일의 경로를 선언해 준다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: promtail-sidecar-config-map
  namespace: {{ namespace }}
data:
  config.yml: |
      server:
        http_listen_port: 9080
        grpc_listen_port: 0
        log_level: "debug"
      positions:
        filename: /tmp/positions.yaml
      clients: 
        - url: {{ loki-url }}
      scrape_configs:
        - job_name:  {{ job-name }}
          static_configs:
            - targets:
                - localhost
              labels:
                app: {{ app }}
                __path__: {{ log-path }}

Helm chart에서 emptydir 볼륨 마운트 + Promtail Sidecar 추가 + configmap 볼륨 마운트

  volumes:
  - name: log-volume
    emptyDir: {}
		# emptyDir 선언, log 파일을 적재할 공간 
		# promtail sidecar와 서비스 컨테이너가 같이 공유함
  - name: config
    configMap:
      name: promtail-sidecar-config-map
		# configmap을 통해 config파일을 지정
  ...
      - name: promtail-sidecar
      volumeMounts:
        - name: log-volume
          mountPath: /log
  	   	  # log 파일이 저장되는 volume 마운트
        - name: config
          mountPath: /etc/promtail
		  # configmap을 통해 지정된 config를 mountPath에 저장
  ...
      - name: fn
      volumeMounts:
        - name: log-volume
          mountPath: /log
		  # 서비스 컨테이너가 저장할 log volume 마운트, /log 경로에 저장

참고로 grafana/promtail의 config는 /etc/promtail/config.yml를 호출하기 때문에 경로와 파일명을 맞춰야 한다.


Promtail 로그

위 설정을 통해서 /log/service.log라는 로그파일을 수집하는 Promtail 컨테이너 로그를 확인할 수 있다.

반응형
Comments