TheKoguryo's 기술 블로그

 Version 2024.04.01
1.5.2.4.1 EFK(Elasticsearch, Fluentd, Kibana)

오픈 소스로 쿠버네티스 로그 모니터링을 하는 데 가장 많이 사용되는 구성으로 다음 세가지 구성을 확인해 봅니다.

  • Elasticsearch: 수집저장된 로그를 검색 및 분석하는 역할 수행
  • Fluentd 또는 Fluent Bit: 쿠버네티스 클러스터에서 로그를 수집하는 역할을 수행
  • Kibana: 로그를 쿼리하고, 시각화 해주는 역할 수행

여기서는 Fluent Bit를 사용하는 예시입니다.

Elastic Search + Kibana 설치
  1. 설치용 namespace를 만듭니다.

    kubectl create ns logging
    
  2. Helm Chart를 통해 설치하기 위해 저장소를 등록합니다. 본 예제에서는 Bitnami Helm Chart 저장소를 사용합니다.

    helm repo add bitnami https://charts.bitnami.com/bitnami
    
  3. 설정값 정의

    Helm Chart를 설치시 설정가능한 파라미터 목록을 참고하여 변경하고자 하는 값을 입력합니다.

  4. elasticsearch helm chart 설치

    helm install elasticsearch -f values.yaml bitnami/elasticsearch --version 19.9.5 -n logging
    
  5. 설치

    아래와 같이 설치되며, 실제 컨테이너가 기동하는 데 까지 약간의 시간이 걸립니다.

    $ helm install elasticsearch -f values.yaml bitnami/elasticsearch --version 19.9.5 -n logging
    NAME: elasticsearch
    LAST DEPLOYED: Wed Jul  5 01:59:09 2023
    NAMESPACE: logging
    STATUS: deployed
    ...
    
      Elasticsearch can be accessed within the cluster on port 9200 at elasticsearch.logging.svc.cluster.local
    
      To access from outside the cluster execute the following commands:
    
        kubectl port-forward --namespace logging svc/elasticsearch 9200:9200 &
        curl http://127.0.0.1:9200/    
    
  6. 설치된 elastic search 내부 주소와 포트를 확인합니다. 이후 Fluentd에서 로그 전송을 위해 사용할 주소입니다.

    • 주소: elasticsearch.logging.svc.cluster.local
    • 포트: 9200
  7. Pod가 모두 기동할때 까지 기다립니다.

    kubectl get pod -n logging --watch
    
Fluent Bit 구성
  1. FluentBit Helm Chart 저장소를 추가합니다.

    helm repo add fluent https://fluent.github.io/helm-charts
    
  2. ElasticSearch로 로그를 포워딩하기 위한 설정값을 작성합니다.

    • Replace_Dots On: 다음과 같이 labels의 key에 app.kubernetes.io와 같이 *.*이 포함된 경우 ElasticSearch 전송시 오류가 발생합니다. 이를 방지하기 위해 추가합니다.

      apiVersion: v1
      kind: Pod
      metadata:
        ...
        labels:
          ...
          app.kubernetes.io/name: storefront
          ...
      
    • Suppress_Type_Name On: ElasticSearch 8에서 _type 관련 오류가 발생하는 것을 방지하기 위해 추가합니다.

      cat <<EOF > myvalues.yaml
      config:
        outputs: |
          [OUTPUT]
              Name es
              Match *
              Host elasticsearch.logging.svc.cluster.local
              Port 9200
              tls Off
              tls.verify Off
              Retry_Limit False
              Logstash_Format On
              Logstash_Prefix logstash
              Trace_Error On
              Replace_Dots On
              Suppress_Type_Name On    
      EOF
      
  3. OKE 클러스터에 FluentBit을 설치합니다.

    helm upgrade --install fluent-bit fluent/fluent-bit -f myvalues.yaml -n logging
    
Kibana 설정
  1. 설치한 kibana을 웹 브라우저로 접속합니다. ingress로 지정한 주소로 접속합니다.

  2. Welcome to Elastic 화면이 나오면 Explore on my own을 클릭하여 홈으로 이동합니다.

  3. 왼쪽 상단 내비게이션 메뉴에서 Analytics > Discover 를 클릭합니다.

    Kibana Discover

  4. 인덱스 패턴을 만들기 위해 Create data view를 클릭합니다.

  5. 인덱스 패턴을 생성합니다.

    오른쪽에서 보듯이 Fluent Bit에서 전송된 로그는 logstash-로 시작합니다.

    • Name: logstash-*

    • Index pattern: logstash-*

    • Timestamp field: @timestamp

    image-20230705114229548

  6. 데이타 뷰가 추가된 결과를 볼 수 있습니다.

    image-20230705113029235

  7. 왼쪽 상단 내비게이션 메뉴에서 Analytics > Discover 를 클릭합니다.

  8. 생성한 인덱스 패턴을 통해 수집된 로그를 확인할 수 있습니다.

    • 테스트 앱의 로그를 확인하기 위해 Add filter를 클릭하여 namespace_name=default 로 지정합니다.

    image-20230705113456157

  9. 테스트 앱을 접속합니다.

  10. 로그 확인

    아래와 같이 kibana에서 테스트 앱의 로그를 확인할 수 있습니다.

    image-20230705113937021

  11. EFK를 통해 OKE 상의 로그를 수집하는 예시였습니다. EFK에 대한 상세 내용은 제품 관련 홈페이지와 커뮤니티 사이트를 참고하기 바랍니다.



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 5 Jul 2023