Kubernetes - Loki를 활용한 쿠버네티스 로그 확인

2025. 11. 23. 14:02·Container & DevOps

Loki?

출처: https://lapee79.github.io/article/loki-kubernetes-logging/

  • 로키(Loki) 는 쿠버네티스 환경에서 로그를 수집, 저장, 조회하기 위한 오픈소스 로그 관리 시스템이다.
  • 프로메테우스(Prometheus) 가 “메트릭”을 수집한다면, 로키는 “로그(log)”를 수집한다.
  • 하지만 로키는 Elasticsearch처럼 로그 전체를 인덱싱하지 않고, 라벨(Label) 만 인덱싱하고 로그 본문은 그대로 저장해서 저장공간 절약과 속도 향상을 얻는다.

Promtail?

PLG 구조를 이해하기 전에 Promtail 개념을 먼저 알아야한다.

Promtail은 쿠버네티스나 리눅스 서버에서 생성되는 로그 파일을 수집해 Loki로 전송하는 로그 수집 에이전트이다. Loki의 “수집기(Collector)” 역할이라고 보면 된다.

 

Promtail은 쿠버네티스 클러스터를 구성하는 모든 노드에 설치되며 각 노드에서 발생하는 로그를 스트림 형태의 데이터로 로키로 전달한다. 저장된 로그는 LogQL을 통해 조회할 수 있다.

Promtail 주요 역할

Promtail의 주요 역할은 다음과 같다.

역할  설명
로그 수집(Log scraping) 노드의 /var/log/containers/ 또는 /var/log/pods/ 같은 경로에서 로그 파일을 감시하고, 새 로그가 생기면 읽는다.
라벨(Label) 추가 각 로그에 “이 로그가 어디서 왔는지”를 나타내는 라벨을 붙인다. 예: {namespace="default", pod="flask-abc123", container="app"}
파싱(Parsing) 로그 내용을 구조화한다. 예를 들어 JSON 로그라면 필드를 인식하거나, 타임스탬프·레벨(INFO/ERROR 등)을 추출한다.
전송(Shipping) 정제된 로그를 HTTP API로 Loki의 /loki/api/v1/push 엔드포인트에 보낸다.

Promtail 동작 흐름

  1. DaemonSet 형태로 모든 노드에 배포된다.
    (즉, 각 노드에 Promtail Pod 하나씩 존재한다.)
  2. 각 Promtail이 해당 노드의 Pod 로그 파일을 수집한다.
    → /var/log/pods/<pod_name>/<container_name>.log
  3. 수집한 로그에 라벨을 추가한다.
    • 예시: namespace, pod, container, node, app
  4. 라벨이 붙은 로그를 Loki에 HTTP 요청으로 전송한다.
    • 전송 대상: http://<loki-service>.<namespace>:3100/loki/api/v1/push

Promtail 설정 파일(promtail.yaml) 구조

기본 적인 Promtail의 yaml 파일 구조는 다음과 같다.

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml   # 수집 위치 저장 (중복 방지)

clients:
  - url: http://loki.myloki:3100/loki/api/v1/push   # 로그 전송 대상 Loki

scrape_configs:
  - job_name: kubernetes-pods
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app]
        target_label: app
      - source_labels: [__meta_kubernetes_namespace]
        target_label: namespace
      - source_labels: [__meta_kubernetes_pod_name]
        target_label: pod

scrape_configs 블록을 통해 Promtail이 무엇을, 어떤 라벨로, 어떻게 수집할지를 정의한다.

 

PLG 구조

출처: https://devocean.sk.com/experts/techBoardDetail.do?ID=163964

구성요소 역할 설치 위치
Promtail 각 노드의 로그를 수집해서 Loki로 전송 쿠버네티스 노드 (DaemonSet)
Loki 수집된 로그 저장 및 조회 API 제공 중앙 서버(쿠버네티스 서비스로 배포)
Grafana Loki에 저장된 로그를 시각화, 대시보드로 확인 별도 Pod 혹은 외부 서버

 

Loki 설치

Helm을 통해 Loki를 설치한다.

 

작업 디렉토리를 다음과 같이 준비한다.

mkdir loki
cd loki

 

Grafana Helm 저장소를 추가한다.

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

Grafana 팀이 배포하는 Helm 차트들을 Helm 저장소에 등록한다.

 

헬름 리포지토리에서 Loki를 검색한다.

helm search repo loki

차트 이름 설명
grafana/loki 단일 Loki 인스턴스용
grafana/loki-stack Loki + Promtail + Grafana 등을 한 번에 설치
grafana/loki-distributed 마이크로서비스 구조의 대규모 Loki 배포용
grafana/promtail 로그 수집 전용 Promtail 설치용

 

다음 명령어를 통해 Helm 차트를 다운로드하고 압축을 해제한다.

Loki와 Promtail이 필요하기에 해당 패키지를 설치하고, 이미 설치된 Grafana는 추후 Values.yaml에서 제외시키면 된다.
helm pull grafana/loki-stack
tar xvfz loki-stack-2.9.11.tgz
mv loki-stack loki-stack-2.9.11
cd loki-stack-2.9.11

 

원본을 카피하여 테스트에 사용할 설정 yaml 파일을 만든다.

cp values.yaml my-values.yaml

 

위에서 언급했듯이, Loki와 Promtail만 켜고 나머지(프로메테우스, 그라파나 등)는 꺼둔다. (이전 테스트에서 이미 설치했기 때문.)

test_pod:
  enabled: true
loki:
  enabled: true
promtail:
  enabled: true
fluent-bit:
  enabled: false
grafana:
  enabled: false
prometheus:
  enabled: false
filebeat:
  enabled: false
logstash:
  enabled: false

 

Loki가 설치될 네임스페이스를 생성하고, 정상 생성되었는지 확인한다.

kubectl create namespace myloki
kubectl get namespace

 

다음 명령어를 통해 헬름을 활용해 로키를 설치한다.

helm install --namespace myloki --generate-name grafana/loki-stack -f my-values.yaml

 

정상적으로 로키가 설치됐는지 확인한다.

위와 같이 정상적으로 생성된 것을 확인할 수 있다.

 

Loki 테스트를 위한 서비스 실행

로그를 생성할 파드를 생성한다. 전에 생성한 Flask를 활용한 디플로이먼트, 서비스, 인그레스를 활용했다.

Deployment, Service, Ingress  생성

kubectl apply -f flask-deploy.yml
kubectl apply -f flask-service.yml
kubectl apply -f flask-ingress.yml

 

정상적으로 생성됐는지 다음과 같이 확인한다.

kubectl apply -f flask-ingress.yaml

 

kubectl get ingress

 

참고로 인그레스는 다음과 같이 정의되어 있다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: flask-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /test02(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: flask-service
            port:
              number: 80

 

따라서, https://127.0.0.1:2000/test02에 접속하여 정상 동작하는지를 확인하면 된다.

위와 같이 정상적으로 동작하는 것을 확인할 수 있다.

 

Loki를 통한 로그 확인

로키를 활용하기 위해 머저 그라파나에 접속 후 로키 데이터 소스를 추가해준다.

 

검색창에 Loki를 검색하고 데이터 소스의 Loki를 클릭한다.

 

[Create a Loki data source]를 클릭한다.

 

 Name과 URL을 입력해준다. URL에는 http://<loki-서비스-이름>.<네임스페이스>:<로키 사용 포트>과 같이 입력해준다.(기본포트는 3100)

 

다음을 보면 로키의 서비스 이름은 Loki-stack-1763467110인 것을 확인할 수 있다.

kubectl get svc -n myloki

 

URL을 입력하고 [Save & Test]를 클릭한다.

 

위와 같이 연동 후 그라파나에 접속 후 [Explore] 클릭 후 데이터 소스 선택 창에서 Loki를 선택 후 오른쪽 상단에서 Code를 선택하고, 자신이 보고 싶은 파드를 입력하면 파드의 로그를 볼 수 있다. 참고로 입력 방식은 {pod="파드 이름"}이다.

 

Reference

  • https://kubernetes.io/ko/docs/home/
  • 정철원, ⌜한권으로 배우는 도커&쿠버네티스⌟, 한빛미디어(주), 2024, 556쪽
 

 

 

'Container & DevOps' 카테고리의 다른 글
  • Kubernetes - krew를 이용한 플러그인 관리
  • Kubernetes - Kubespray를 이용한 Kubernetes Cluster 구축
  • Kubernetes - Grafana를 활용한 모니터링 데이터 시각화
  • Kubernetes - Prometheus를 통한 모니터링 데이터 수집
SummerToday
SummerToday
summertoday 님의 블로그 입니다.
  • SummerToday
    SummerToday
    SummerToday
  • 전체
    오늘
    어제
  • 인기 글

  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리자
    • 분류 전체보기 (62)
      • OS & Network (4)
      • Cloud (11)
      • Container & DevOps (41)
      • Database (4)
      • Develop (0)
      • IaC (2)
  • 태그

    s2s vpn
    MariaDB
    CI/CD
    gitops
    점프 계정
    container
    Galera Cluster
    aws
    CloudWatch
    Kubernetes
    argocd
    K8S
    tailscale
    AmazonSNS
    EIP
    Grafana
    계정 관리
    Eni
    cloud
    openebs
  • hELLO· Designed By정상우.v4.10.3
SummerToday
Kubernetes - Loki를 활용한 쿠버네티스 로그 확인
상단으로

티스토리툴바