[K8S] CI/CD Pipeline, 모니터링, 로깅 시스템 구축 프로젝트 - 로깅 시스템 구축

mDev_97·2023년 10월 30일
0

Kubernetes

목록 보기
10/10
post-thumbnail

📌 프로젝트 주제에 대한 자세한 설명은 [K8S] CI/CD Pipeline, 모니터링, 로깅 시스템 구축 프로젝트 - 프로젝트 소개 게시글을 확인해주세요.

이번 게시글에서는 클러스터와 애플리케이션의 상태를 추적하기 위한 로깅 시스템을 구축하는 것입니다.
로그를 사용하여 발생하는 모든 문제를 식별하고 디버깅을 수행할 수 있으며,
애플리케이션과 시스템 성능에 대한 통찰력을 얻을 수 있습니다.
또한, 클러스터와 애플리케이션의 로그를 수집하고 분석하면 병목 현상을 식별하고 더 나은 성능을 위해
배포를 최적화하는 데 도움이 될 수 있습니다.

쿠버네티스는 로그를 관리하고 분석하기 위한 기본 솔루션이 부족합니다.
하지만, 쿠버네티스는 컨테이너 엔진에서 제공하는 로그를 표준 스트림으로 전송합니다.
이를 위해서 Grafana Loki와 같은 중앙 집중식 로깅 솔루션을 사용하여 쿠버네티스 클러스터의 모든 로그를 한 곳에서 수집하고 집계할 수 있습니다.

중앙 집중식 로깅 솔루션을 사용하면 다음을 수행할 수 있습니다.

  • 클러스터에 수행된 감사 작업
  • 애플리케이션 및 클러스터 문제 해결
  • 성능 모니터링 전략에 대한 통찰력

로깅 시스템 구축

Loki는 프로메테우스에서 영감을 받아 수평 확장이 가능하고 가용성이 높은 다중 테넌트 로그 집계 시스템입니다.
이러한 Loki는 로그 처리를 담당하고, 모니터링 시스템 구축 단계에서 배포한 Grafana 대시보드를
사용하여 로그를 시각화하고, 쿼리를 실행하고, 경고하는 시스템 구축을 진행해보겠습니다.

Helm을 사용하여 Loki 설정

모니터링 시스템 구축 단계에서 Helm을 사용하여 간편하게 그라파나를 배포하였습니다.
그렇기에 Loki도 Helm을 사용하여 간편하게 설정해보도록 하겠습니다.

GCP 클라우드 셸에 접속하여 아래의 명령어를 사용하여 Grafana Helm 차트를 추가합니다.

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

다음 코드를 사용하여 Helm 차트를 업데이트합니다.

helm repo update

이 때, 아래의 명령어를 입력하면 Loki에 사용 가능한 차트를 확인할 수 있습니다.

helm search repo loki

아래에 보이는 것과 같이 선택할 수 있는 몇 가지 대안이 있습니다.
프로젝트에서는 grafana/loki 를 사용할 예정입니다.

이제 Loki를 배포하기 위한 grafana/loki Helm 차트를 설치합니다.
이 때, 권한을 더 효과적으로 제어하고 리소스의 소비를 계속 확인하는 데에 도움을 주기 위해서는
로깅 시스템은 별도의 환경을 만드는 것이 좋습니다.

이를 위해서 loki 라는 새로운 네임 스페이스를 만들어주도록 하겠습니다.

kubectl create ns loki

Loki는 쿠버네티스 클러스터 로그를 별도로 저장하기 위해서 S3 호환 객체 스토리지 솔루션이 필요합니다.
하지만, 이번 프로젝트에서는 단순화하기 위해서 MinIO를 사용합니다.
이를 활성화하기 위해서는 Loki Helm 차트의 Value 파일을 수정해야 합니다.

모니터링 시스템 구축 단계에서와 같이 values-loki.yaml 파일을 생성하고 아래의 설정을 작성해줍니다.

minio:
  enabled: true

이후 다음 명령을 사용하여 loki 네임스페이스에 grafana/loki 차트를 설치합니다.
또한, 이 명령을 통해서 Loki, Grafana Agent, MinIO를 설치합니다.

해당 프로젝트에서는 --set loki.auth_enabled=false를 통해서
Grafana Loki 인증에 프록시 사용을 방지하기 위한 플래그를 사용하여 단순화 시켰습니다.

helm upgrade --install --namespace loki logging grafana/loki -f values-loki.yaml --set loki.auth_enabled=false

위의 명령어를 통한 출력은 아래와 같습니다.

위에서 진행한 Loki 설치가 잘 되었는지는 아래의 명령어를 통해서 확인할 수 있습니다.

kubectl get all -n loki


Helm을 사용하여 Grafana 설정

앞에서는 Loki와 Grafana Agent를 설치하였습니다.
이를 Grafana 프론트엔드를 설정해주어야 하는데, 우리는 프로젝트를 진행하면서
프로메테우스와 그라파나를 사용해 모니터링 환경을 구축하는 과정에 있어서 Grafana를 설치하였습니다.

그라파나를 설치하지 않으신 분들은 아래의 명령어를 통해서 그라파나를 설치해줍니다.

helm upgrade --install --namespace=monitoring loki-grafana grafana/grafana

Grafana에서 데이터 소스 구성

이제 모든 로깅 스택 구성 요소가 준비되었으므로 Loki를 쿠버네티스 로그를 시각화하는 데에
필요한 Grafana 데이터 소스로 구성해주겠습니다.

그라파나를 설치하여 배포되었다면 아래의 명령어를 통해서 Grafana의 IP를 확인하고
브라우저를 사용해 Grafana UI에 접근해줍니다.

kubectl get all -n monitoring

메인 홈에서 Data Sources를 클릭해줍니다.

Data Sources에서 Logging & document databases에서 Loki를 클릭하여 데이터 소스로 추가합니다.

이제 다음 화면이 중요합니다.
Grafana가 Loki 백엔드에 엑세스하는 데에 사용할 URL을 입력해야 합니다.
이때 HTTP URL은 FQDN(정규화된 도메인 이름)이어야 합니다.

우리 프로젝트에서 Loki의 네임스페이스는 loki이고, Grafana의 네임스페이스는 monitoring으로
서로 다른 네임스페이스이기 때문에 URL을 http://loki-gateway.loki.svc와 같이 입력해주셔야 합니다.

URL을 입력한 후에는 다른 필드는 디폴트로 유지하고 Save & test 버튼을 눌러줍니다.
아래와 같이 "Data source successfully connected" 라는 메시지가 표시되면
모든 설정은 성공적으로 된 것입니다.


Grafana에서 로그 관리

위에서와 같이 Loki를 Grafana의 데이터 소스로 구성하면 UI에서 로그를 관리할 수 있습니다.
그럼 이번에는 Grafana Loki를 사용하여 로그를 쿼리하고 해당 로그에서 측정학목을 생성하고
마지막으로 측정항목을 기반으로 알림을 설정하는 방법을 알아보겠습니다.

Loki에서는 PromQL과 비슷하게 LogQL을 사용하여 쿠버네티스 레이블과 레이블 셀렉터를 사용하여
특정 로그 스트림을 선택할 수 있습니다.
또한, LogQL을 사용하면 로그 쿼리메트릭 쿼리라는 두 가지 유형의 쿼리를 실행할 수 있습니다.

Grafana에서 로그 쿼리를 수행

그럼 이제 로그 쿼리를 수행하는 것부터 시작해보기 위해
왼쪽 메뉴에서 Explore로 이동합니다.

그럼 왼쪽 위에서 Loki를 선택해주고 오른쪽 상단의 code 탭을 통해서 레이블 브라우저에 아래의 LogQL을 입력해줍니다.

{stream="stderr"} |= ``

이제 오른쪽 상단에 있는 Run query 버튼을 누르면 아래와 같은 출력이 나타납니다.
상단에는 로그의 양이 표시되고, 하단에는 kubectl logs 명령어를 사용했을 때 나타나는 실제 로그가 표시됩니다.

Grafana에서 메트릭 쿼리를 수행

위에서는 {stream="stderr"} |= `` 쿼리를 통해서 사용된 코드만을 검토하였습니다.

LogQL에서는 {stream="stderr"} |= `level=error` 를 통해서 level이 error인 포함된 로그만 가져오는 것과 같이 정규식을 파이프하여 로그를 필터링할 수 있습니다.

하지만, 여전히 로그 쿼리입니다.
메트릭 쿼리를 옫기 위해서는 특정 조건의 발생을 수량화하는 함수를 사용해야 합니다.

count_over_time({stream="stderr"} |= `level=error` [5m])

위와 같이 특정 시간 5분동안 로그 쿼리의 발생을 수량화하는 것입니다.
이제 위의 쿼리를 입력하고 Run query 버튼을 통해 실행해줍니다.

쿼리를 실행한 후에 위의 사진을 보면
상단에는 질의한 LogQL 쿼리에 대한 간략한 설명이 있고, 하단엔은 로그가 선 그래프로 표시되어 있습니다.
이러한 표시는 보기를 원하는 대로 사용자 정의할 수 있습니다.
아래와 같이 Add to dashboard 버튼을 눌러 이 패널을 대시보드에 추가하겠습니다.

아래 이미지에는 로깅 스트림의 오류 측정항목을 보여줍니다.


로그에서 알림을 설정

사실 Grafana에서는 클러스터의 여러가지 정보를 시각화하는 기능도 중요하지만
유용한 기능 중 하나는 바로 강력한 경고 시스템입니다.

알림을 설정하기 위해서는 좌측에 있는 벨 모양 아이콘을 클릭하여 알림에 접근하고
Manage alert rules를 통해 새로운 알림을 생성해보겠습니다.

그런 다음 New Alert Rule을 클릭하면 아래와 같은 화면으로 이동합니다.
위에서 사용했던 LogQL 쿼리를 사용하여 경고를 설정합니다.

count_over_time({stream="stderr"} |= `level=error` [5m])

그런 다음 알림을 위한 임계값을 400으로 설정합니다.
그럼 위의 사진과는 다르게 400애 빨간선이 생기게 되는 것을 볼 수 있습니다.

알람 규칙을 만드는 과정을 아직 로그에 대한 설계를 조금 더 진행해야 하기 때문에
프로젝트를 향상시키는 과정에서 추가로 작성을 진행하도록 하겠습니다.

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글