개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 리소스 로깅과 모니터링 - EFK를 활용한 k8s 로그 모니터링

nineDeveloper 2021. 1. 19.
728x90

EFK를 활용한 k8s 로그 모니터링

이 글은 다음 사이트를 기반해 작성 됐습니다
https://akomljen.com/get-kubernetes-logs-with-efk-stack-in-5-minutes/

GCP를 활용해 GKE 1.15.12를 만들고 EFK 설치 과정을 진행


1. EFK 개요

EFK는 각각 다음과 같은 의미를 갖고 있다
엘라스틱스택은 주로 비츠나 로그스태시를 사용하는 것이 일반적이지만
쿠버네티스에서는 fluentd를 사용해서 수집하는 것이 유행인 듯 하다

  • E: Elasticsearch 데이터베이스 & 검색엔진
  • L: Logstash 데이터 수집기, 파이프라인(여기서는 F: Fluentd를 대신 사용한다)
  • K: Kibana 그라파나의 역할, 대시보드 (SIEM, 머신러닝, Alert)​

쿠버네티스에서 EFK를 사용하면 프로메테우스가 주로 메트릭을 수집해 성능을
모니터링하는 것과는 다르게 도커의 각 포드의 로그들을 수집하고
시각화 및 분석할 수 있는 플랫폼을 만들 수 있다


2. 헬름 차트 기본

여기서는 헬름에 대한 내용은 다루지 않는다
조대협님 블로그 글이 매우 잘 돼 있으니 참고하기 바란다

https://bcho.tistory.com/1337


3. 헬름차트로 EFK 설치하기

다음 명령을 사용하여 heml 차트 초기화 및 es-operator를 설치한다

# 헬름 초기화
$ helm init

# 레파지토리 추가
$ helm repo add akomljen-charts \ https://raw.githubusercontent.com/komljen/helm-charts/master/charts/

logging 네임스페이스 생성

$ kubectl create ns logging
$ helm install es-operator \
    --namespace logging \
    akomljen-charts/elasticsearch-operator # 3.x 헬름을 사용하는 경우 명령 형식이 조금 다르다

설치 후에 포드가 잘 돌고 있는지 확인한다

$ kubectl get pods -n logging
NAME                                                  READY     STATUS    RESTARTS   AGE
es-operator-elasticsearch-operator-568667668b-b6z2v   1/1       Running   0          33s

쿠버네티스에 사용자 정의된 리소스가 잘 추가됐는지 확인한다
여기서 엘라스틱서치 클러스터 api가 잘 보이는지 확인한다

$ kubectl get CustomResourceDefinition
NAME                                         CREATED AT
backendconfigs.cloud.google.com              2019-10-31T23:36:26Z
elasticsearchclusters.enterprises.upmc.com   2019-10-31T23:54:55Z
managedcertificates.networking.gke.io        2019-10-31T23:36:58Z
scalingpolicies.scalingpolicy.kope.io        2019-10-31T23:36:58Z
updateinfos.nodemanagement.gke.io            2019-10-31T23:36:58Z

helm을 사용해 efk를 설치한다

helm install efk \
    --namespace logging \
    akomljen-charts/efk

logging 네임스페이스에 정상적으로 efk 관련 포드들이 잘 올라왔는지 확인한다

$ kubectl get pods -n logging
NAME                                                  READY     STATUS    RESTARTS   AGE
efk-kibana-6cf88598b6-xlkv2                           1/1       Running   0          5m
es-client-efk-cluster-545d4ddb9-mp8d6                 1/1       Running   0          5m
es-data-efk-cluster-default-0                         1/1       Running   0          5m
es-master-efk-cluster-default-0                       1/1       Running   0          5m
es-operator-elasticsearch-operator-568667668b-b6z2v   1/1       Running   0          6m
fluent-bit-pglgq                                      1/1       Running   0          5m

크론잡의 스케줄러를 확인하면 1시간 마다 실행되는 curator를 확인할 수 있다

$ kubectl get cronjob -n logging
NAME                        SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
efk-elasticsearch-curator   0 1 * * *   False     0        <none>          5m

4 키바나 서비스 접속

다음 명령어로 서비스의 타입을 로드밸런스로 변경하거나 GCP를 사용하는 경우에는 포트포워딩 기능을 사용하여 접속할 수 있다
http://<IP>:443으로 접속한다

$ kubectl edit svc efk-kibana -n logging

ClusterIP -> LoadBalancer 로 efk-kibana 의 type 변경
port 는 443 -> 80 으로 변경

...
spec:
  ...
  ports:
  - port: 80
  ...
  type: LoadBalancer
  ...

efk-kibana 서비스에 LoadBalancer EXTERNAL-IP 가 할당됐는지 확인하고 80포트로 접속

$ kubectl get svc -n logging efk-kibana
NAME          TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
efk-kibana    LoadBalancer   10.36.12.78   34.64.184.167   80:31911/TCP   25m

최초 접속시 index 패턴을 정의해야 한다
Management 메뉴에 들어가서 "kubernetes_cluster-*"이라는 패턴을 입력하고 Next step을 누른다

두 번째 항목에서는 @timestamp를 고르고 "Create index pattern"을 클릭한다

인덱스 패턴을 올바로 정의했다면 Discover 메뉴에서 수집되는 데이터의 항목을 확인할 수 있다
전체 쿠버네티스 클러스터에서 모든 포드의 로그를 수집해서 다음과 같이 뿌려진다

Kibana를 사용해 데이터를 시각화하는 실습을 진행
여기서는 간단히 애플리케이션의 로그의 수를 세는 단순한 시각화를 진행하도록 한다
로그를 분석해서 파싱할 수 있는 기능을 더한다면 더 세부적인 그래프를 그릴 수 있다

키바나에서 대시보드를 꾸밀 때 꼭 사용해야 하는 세 가지 메뉴가 있다
왼쪽 메뉴를 살펴보면 Discover, Visualize와 Dashboard 다


Discover

디스커버는 데이터를 관찰할 수 있도록 도와주는 메뉴다
내부에서 데이터가 어떻게 생겼는지 확인할 수 있고 오른쪽 상단에서는 원하는 시간을 선택하면 그 시간이 반영돼서 시각화된다
이 시간 설정은 다른 메뉴의 시각화 창에도 영향을 준다
현재는 Last 24Hours로 세팅돼 있다


Visualize

비주얼라이즈는 작업실로 보면 된다
시각화하고 실시간으로 모니터링하기 위해 그림을 그리는 작업실이다
이 작업실에서는 다양한 차트를 그릴 수 있다


Dashboard

대시보드는 비주얼라이즈에서 작업한 그래프를 게시할 수 있는 전시장이다
아직 비주얼라이즈에서 그린 그림이 없으므로 당장은 그림을 올릴 수 없다
그림을 모두 그린 후 배치하면 실시간으로 모니터링 가능한 대시보드가 완성된다


총 발생한 로그 수 나타내기

먼저 비주얼라이즈에 가서 + 버튼을 눌러서 Metric이라는 유형을 선택한다
메트릭은 간단히 숫자를 나타내기 편리한 그림이다

metric 선택

그리고 지난 번에 만든 인덱스 패턴인 kubernetes_cluster-*를 선택한다
이 부분은 비주얼라이즈로 그래프를 표현할 때 모두 공통된 내용이므로 앞으로 생략하겠다

그래프를 그릴 인덱스 선택

메트릭은 별도로 건드려주지 않아도 총 갯수를 표시한다
아무런 수정 없이 상단의 save 메뉴를 사용해 이름을 "[K8S]총 로그 발생 수"로 정의하고 Save를 클릭한다

저장이 완료되면 가장 상단의 visualize 링크를 클릭해 visualize 처음 화면으로 나갈 수 있다
나오면 방금 생성한 차트를 확인할 수 있다

비주얼라이트 목록에 추가된 메트릭 확인


네임스페이스별 로그 발생 수

다시 비주얼라이즈에서 추가 버튼을 클릭하고 이번엔 Pie 차트를 선택한다
그 다음에 나오는 인덱스 패턴은 kubernetes_cluster-*를 고른다

파이 차트에서 Split Slices를 선택하고 다음 그림과 같이 옵션을 조정해준다
네임스페이스 별로 숫자를 세고 내림차순으로 최대 10개까지 표현하겠다는 의미다
재생 버튼을 눌러야 적용돼서 오른쪽 그래프에 나타난다
현재는 네임스페이스가 4개 밖에 없어서 더이상 표현되지는 않는다
그리고 "[K8S]네임스페이스별 로그 발생 수"라고 저장한다


시간 흐름에 따른 네임스페이스별 로그 발생량

시간을 표현하려면 Time Series 항목을 사용하는 것이 좋다
비주얼라이즈에서 비주얼 빌더를 선택하자

비주얼 빌더로 들어와 하단에 Group By를 Terms로 변경한다

현재는 시간 흐름에 따른 로그 발생량을 보여주는 데 Terms로 나눠준다고 세팅하고 분류 기준을 kubernetes.namespace_name으로 변경하면 네임스페이스 별로 나뉘어서 그래프가 표현되는 모습을 확인할 수 있다
"[K8S]시간 흐름에 따른 네임스페이스별 로그 발생 수"라고 저장하자


로그 발생 수가 많은 포드 TOP10

마지막으로 포드 별로 로그 발생량을 집계해서 확인해보도록 하자
비주얼라이즈에서 데이터 테이블을 선택한다

Split Rows를 추가하고 pod_name을 기준으로 Terms를 설정하고 내림차순으로 20개를 표현하도록 설정한다
그리고 재생 버튼을 누르면 테이블이 표현되는 모습을 볼 수 있다
"[K8S] 로그 발생수 TOP10 포드"라는 이름으로 저장한다


대시보드에 장식하기

그리고 대시보드로 이동해 새로운 대시보드를 만들고 Add를 클릭해 지금까지 만든 그래프를 더하도록 하자

18

지금까지 간단히 로그의 발생 수를 집계하는 그래프를 시각화해봤다
쿠버네티스의 로그를 좀더 세부적 파싱해 분석하도록 만든다면 좀더 다양한 시각화를 표현할 수 있을 것이다

728x90

댓글

💲 추천 글