TheKoguryo's 기술 블로그

 Version 2024.04.01
1.5.3.3.3 FluentBit로 OKE 로그 전송하기

EFK 구성에서 ElasticSearch와 Kibana 대신 OpenSearch와 OpenSearch Dashboard를 사용합니다.

FluentBit 설치
  1. FluentBit 사이트의 권장에 따라 Helm Chart로 설치합니다.

  2. FluentBit Helm Chart 저장소를 추가합니다.

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

    • myvalues.yaml
    config:
      outputs: |
        [OUTPUT]
            Name es
            Match kube.*
            Host amaaaaaavsea7yia3enl6q6yrwekrd7qpi3yqaphhcvwowtmzftkt45jel7a.opensearch.ap-chuncheon-1.oci.oraclecloud.com
            Port 9200
            tls On
            tls.verify Off
            Retry_Limit False
            Logstash_Format On
            Trace_Error On
    
        [OUTPUT]
            Name es
            Match host.*
            Host amaaaaaavsea7yia3enl6q6yrwekrd7qpi3yqaphhcvwowtmzftkt45jel7a.opensearch.ap-chuncheon-1.oci.oraclecloud.com
            Port 9200
            tls On
            tls.verify Off
            Retry_Limit False
            Logstash_Format On
            Trace_Error On    
    
  4. OKE 클러스터에 FluentBit을 설치합니다.

    kubectl create ns logging
    helm upgrade --install fluent-bit fluent/fluent-bit -f myvalues.yaml -n logging 
    

테스트

  1. 테스트 앱을 배포합니다.

    kubectl create deployment docker-hello-world --image=scottsbaldwin/docker-hello-world:latest
    kubectl expose deployment docker-hello-world --name docker-hello-world-svc --port 80 --type LoadBalancer
    
  2. 테스트 앱을 호출합니다.

  3. 테스트 Pod가 배포된 노드에 있는 fluentbit 로그를 확인합니다.

    $ kubectl get pod -o wide
    NAME                                  READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
    docker-hello-world-84ddf58f67-jpvrt   1/1     Running   0          10m   10.244.1.8   10.0.10.196   <none>           <none>
    $ kubectl get pod -o wide -n logging
    NAME               READY   STATUS    RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
    fluent-bit-2n42h   1/1     Running   0          8s    10.244.0.8     10.0.10.226   <none>           <none>
    fluent-bit-4wpl2   1/1     Running   0          13s   10.244.1.9     10.0.10.196   <none>           <none>
    fluent-bit-mwgtm   1/1     Running   0          21s   10.244.0.137   10.0.10.233   <none>           <none>
    
    • 로그 확인
    $ kubectl logs -f fluent-bit-4wpl2 -n logging
    [2022/10/16 10:24:42] [error] [output:es:es.0] error: Output
    {"took":2,"errors":true,"items":[{"create":{"_index":"logstash-2022.10.16","_type":"_doc","_id":"olBT4IMBFcJImGmyDCZo","status":400,"error":{"type":"mapper_parsing_exception","reason":"object mapping for [kubernetes.labels.app] tried to parse field [app] as object, but found a concrete value"}}}]}
    [2022/10/16 10:24:42] [ warn] [engine] failed to flush chunk '1-1665915881.614422791.flb', retry in 8 seconds: task_id=0, input=tail.0 > output=es.0 (out_id=0)
    [2022/10/16 10:24:43] [ info] [input:tail:tail.0] inotify_fs_add(): inode=142531708 watch_fd=11 name=/var/log/containers/fluent-bit-4wpl2_logging_fluent-bit-ef61bf4637f1e7fb66c939894d854ff3c097c771ea0a44ffb9b1d758691eb952.log
    
  4. 다음과 같은 에러가 나는 것을 알수 있습니다.

    object mapping for [kubernetes.labels.app] tried to parse field [app] as object, but found a concrete value
    
    • 쿠버네티스에 배포된 앱을 보면, label이 app, app.kubernetes.io와 같이 사용하고 있는데, app을 텍스트 필드로 처리하는데, app 밑에 .kubernetes.io인 label을 처리하는 opensearch와 elasticsearch에서 문제가 있는 것으로 보입니다.

    • label app을 k8s-app과 같이 바꿔거나, 아래 링크에 있는 것처럼 app_와 같이 변경하는 방법으로 해결할 수 있습니다. 매뉴얼한 변경은 쉽지 않으므로, Replace_Dots On을 사용하여 해결할 수 있습니다.

재설치

  1. OpenSearch로 로그를 포워딩하기 위한 설정값을 작성합니다. Replace_Dots On을 추가합니다.

    • 앞선 테스트로 만들어진 index의 포맷과 차이로 인한 오류를 막기 위해 Prefix로 변경합니다.

      • 예시) Logstash_Prefix logstash-rd
    • myvalues.yaml

    config:
      outputs: |
        [OUTPUT]
            Name es
            Match kube.*
            Host amaaaaaavsea7yia3enl6q6yrwekrd7qpi3yqaphhcvwowtmzftkt45jel7a.opensearch.ap-chuncheon-1.oci.oraclecloud.com
            Port 9200
            tls On
            tls.verify Off
            Retry_Limit False
            Logstash_Format On
            Logstash_Prefix logstash-rd
            Trace_Error On
            Replace_Dots On
    
        [OUTPUT]
            Name es
            Match host.*
            Host amaaaaaavsea7yia3enl6q6yrwekrd7qpi3yqaphhcvwowtmzftkt45jel7a.opensearch.ap-chuncheon-1.oci.oraclecloud.com
            Port 9200
            tls On
            tls.verify Off
            Retry_Limit False
            Logstash_Format On
            Logstash_Prefix logstash-rd
            Trace_Error On
            Replace_Dots On    
    
  2. OKE 클러스터에 FluentBit을 설치합니다.

    helm upgrade --install fluent-bit fluent/fluent-bit -f myvalues.yaml -n logging 
    

재테스트

  1. 테스트 앱을 다시 호출합니다.

  2. 테스트 Pod가 배포된 노드에 있는 fluentbit 로그를 확인합니다. 이전 처럼 에러가 발생하지 않습니다.

    • 로그 확인
    $ kubectl logs -f fluent-bit-zxz4w
    Fluent Bit v1.9.9
    * Copyright (C) 2015-2022 The Fluent Bit Authors
    * Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
    * https://fluentbit.io
    
    [2022/10/16 10:55:58] [ info] [fluent bit] version=1.9.9, commit=5c03b2e555, pid=1
    ...
    
    [2022/10/16 10:56:57] [ info] [input:tail:tail.0] inotify_fs_add(): inode=134676887 watch_fd=10 name=/var/log/containers/fluent-bit-zxz4w_logging_fluent-bit-88634ee26035df508682e483e8f3e27f64a288b9fce37a3b61510bfc4d438181.log
    
OpenSearch Dashboard 설정
  1. SSH 터널링을 통해 jumpbox VM으로 접속하지 않은 경우 다시 접속합니다.

  2. SSH 터널링이 되어 있으므로, 로컬에서 브라우저로 OpenSearch Dashboard에 접속을 확인합니다.

    • 접속주소: https://localhost:5601
  3. 왼쪽 상단 내비게이션 메뉴에서 OpenSearch Dashboards > Discover 를 클릭합니다.

    image-20220603163755397

  4. Create index pattern을 클릭합니다.

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

    아래쪽에 보이는 소스 중에서 앞서 만든 index prefix로 시작하는 logstash-rd 소스를 사용합니다.

    • Index pattern name: logstash-rd-*

    • Time field: timestamp

      image-20221016201519926

      image-20221016201608731

  6. 인덱스 패턴이 추가된 결과를 볼 수 있습니다.

    • labels의 app.kubernetes.io가 app_kubernetes_io로 필드명이 등록된 것을 볼 수 있습니다.

    image-20221016201828280

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

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

  9. 로그 확인

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

    image-20221016202214936



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

Last updated on 16 Oct 2022