새소식

AWS/EKS

[PKOS Study 4주차] k8s Logging - PLG Stack

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 PKOS 2기 Study 내용 요약

해당 Kubernetes Study 는 '24단계 실습으로 정복하는 쿠버네티스' 책을 기반으로 진행 중입니다.

 

이번 포스팅에서는 쿠버네티스 로깅을 위해 사용하는 PLG Stack 에 대해 알아보겠습니다.

 

PLG Stack

PLG 는 Promtail + Loki + Grafana 를 사용하여 구성하는 로그 통합 시스템을 지칭합니다.

PLG 외에도 로그 통합 시스템으로는 EFK (Elasticsearch + FluentD + Kibana) 가 유명합니다.



0. 실습 목표

  1. PLG Stack 설치 후 연동하여 컨테이너 로그 확인



1. Loki

로키는 오픈소스로
전체 로그 파일 단위로 인덱싱하지 않고 레이블 기반의 메타데이터만 인덱싱해서 자원 사용량(Memory)이 현저히 적은 것이 특징

 

로키는 다양한 에이전트(Promtail, FluentD 등)으로부터 전달받은 로그를 자체 데이터스토어에 저장합니다.
PromQL 과 비슷한 LogQL 을 제공하여 원하는 로그를 빠르게 조회할 수 있는 장점이 있습니다.

 

1.1. Loki Install

  • Helm 설치 기준
kubectl create ns loki

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

 

Loki Helm Template 파일 수정

  • Persistence : 로키 파드가 재시작되어도 로그 유지
  • size : Test이기에 20Gi 로 사용 / 실제 개별 환경에서는 적절한 용량 관리 필요
cat <<EOT > ~/loki-values.yaml
persistence:
  enabled: true
  size: 20Gi

serviceMonitor:
  enabled: true
EOT

 

Helm Install

helm install loki grafana/loki --version 2.16.0 -f loki-values.yaml --namespace loki

 

 

2. Promtail

Promtail 은 데몬셋으로 실행되며, 운영 중인 모든 노드에 자동으로 설치.
중앙에 있는 로키 서버에 각 노드에서 발생하는 모든 노드를 내보내는 에이전트 역할

 

2.1. Promtail Install

Helm 으로 설치

  • Config Client : 로키 파드와 연결하기 위한 로키 서비스 이름과 포트 번호
  • volumes : 로키에 전송할 파드 로그의 위치 (cri-o, containerD 를 사용하는 경우, /var/log/pods 에 저장)
cat <<EOT > ~/promtail-values.yaml
serviceMonitor:
  enabled: true
config:
  serverPort: 3101
  clients:
    - url: http://loki-headless:3100/loki/api/v1/push
#defaultVolumes:
#  - name: pods
#    hostPath:
#      path: /var/log/pods
EOT

helm install promtail grafana/promtail --version 6.0.0 -f promtail-values.yaml --namespace loki

 

 

2.2. Log 생성용 nginx 파드 배포

helm repo add bitnami https://charts.bitnami.com/bitnami

cat <<EOT > ~/nginx-values.yaml
metrics:
  enabled: true

  service:
    port: 9113

  serviceMonitor:
    enabled: true
    namespace: monitoring
    interval: 10s
EOT

helm install nginx bitnami/nginx --version 13.2.27 -f nginx-values.yaml

 

 

nginx 접속 로그 생성

kubectl get svc nginx

 

 

NGINX_ELB=$(kubectl get svc nginx -o yaml | grep hostname | cut -d ' ' -f7)
echo $NGINX_ELB

while true; do curl -s $NGINX_ELB -I | head -n 1; date; sleep 1; done

 

 

3. Grafana

3.1. Grafana Install

Grafana 는 이전 포스팅에서 사용했던 Prometheus Stack Helm 으로 설치했습니다.

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

# Grafana Ingress yaml
cat <<EOT > ~/monitor-values.yaml
grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator

  ingress:
    enabled: true
    ingressClassName: alb

    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/group.name: "monitoring"

    paths:
      - /*
EOT

# Namespace 생성
kubectl create ns monitoring

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack -f monitor-values.yaml --namespace monitoring

 

3.2. Grafana + Loki 연동

kubectl get ingress -n monitoring kube-prometheus-stack-grafana
  • 접속 정보
    ID: admin
    PW: prom-operator

 

 

Add data Source

 

URL 에 Loki Service Endpoint 입력 후 'Save & Test'

http://loki-headless.loki:3100/

 

 

Explore 에서 Loki 연동 확인

 

Loki Dashboard 추가

  • Loki Dashboard ID: 15141

 

로키에서 수집된 전체 로그를 그라파나에서 확인할 수 있습니다.

Contents

포스팅 주소를 복사했습니다