모니터링/prometheus

fluent-bit

김붕어87 2023. 10. 18. 14:06
반응형
kubernetes pod의 로그를 수집하기 위해서 Loki와 fluent-bit을 사용할 수 있습니다. (그외 다른 것도 있습니다.)
fluent-bit -> Loki -> Grafana

 

1. fluent-bit 이란 ?

fluent-bit은 로그 수집기(LogStash, fluentd 등) 입니다.

fluent-bit 메뉴얼 : https://docs.fluentbit.io/manual/about/what-is-fluent-bit

 

2. Data pipeline

  • Input
    • 다양한 input plugin를 지원합니다.
    • "tail" input plugin은 "tail -f" 쉘 커맨드와 유사한 동작을 하며, path 패턴에 일치하는 모든 파일을 읽습니다.

 

  • Parser
    • Input에서 가져온 로그파일을 구조화 데이터로 만들어줍니다.

  • Filter
    • 데이터를 최종 목적지에 전달하기 전에 데이터를 변경(필터)합니다.

 

  • Buffer
    • buffer단계에서의 데이터는 immutable한 상태입니다.
    • 이미 데이터는 raw text가 아니라 binary형식이기 때문입니다.
    • 즉 더이상의 수정(filtering)이 불가합니다.
    • fluent bit에서는 file system을 이용한 buffering mechanism을 이용해서 system failure로 인한 데이터의 손실을 막을 수 있습니다.
  • Router
    • 필터를 거친 데이터를 다수의 목적지에 전달하는 기능입니다.
    • tag와 match 규칙에 의해 작동합니다.

 

  • Output
    • 데이터를 전달할 목적지를 작성합니다.
    • loki, ES, 등

 

3. fluent-bit 설치

  • fluent-bit repository 등록 및 다운로드
# helm repository 등록
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update

# fluent-bit chart 다운로드
helm pull fluent/fluent-bit

tar xvfz fluent-bit-0.39.0.tgz

 

 

 

  • values.yaml 수정
    • cp values.yaml dev-test-values.yaml
    • vi dev-test-values.yaml
config:
  service: |
    [SERVICE]
        Daemon Off
        Flush {{ .Values.flush }}
        Log_Level {{ .Values.logLevel }}
        Parsers_File /fluent-bit/etc/parsers.conf
        Parsers_File /fluent-bit/etc/conf/custom_parsers.conf
        HTTP_Server On
        HTTP_Listen 0.0.0.0
        HTTP_Port {{ .Values.metricsPort }}
        Health_Check On

  ## https://docs.fluentbit.io/manual/pipeline/inputs  # 옵션의 자세한 내용 확인
  inputs: |
    [INPUT]
        Name              tail		# tail input plugin 사용 "tail -f 역할"
        Tag               kube.*
        Path              /var/log/containers/*.log    # 모든 log 수집
        Exclude_Path      /var/log/containers/loki*.log,/var/log/containers/fluent-bit*.log  # loki, fluent-bit 로그는 제외
        Parser            docker

  customParsers: |
    [PARSER]
        #Name        docker
        #Format      json
        #Time_Key    time
        #Time_Format %Y-%m-%dT%H:%M:%S.%L

        Name        docker
        Format      regex
        Regex       ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*) (?<kubernetes.pod_name>.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z   # 시간 설정


  ## https://docs.fluentbit.io/manual/pipeline/filters  # 옵션의 자세한 내용 확인
  filters: |
    [FILTER]
        Name kubernetes
        Match kube.*
        Kube_URL https://kubernetes.default.svc:443
        Merge_Log On    # 활성화되면 로그 필드 콘텐츠가 JSON 문자열 맵인지 확인하고, 그렇다면 로그 구조의 일부로 맵 필드를 추가합니다. 
        Merge_Log_Key data
        K8S-Logging.Exclude On  # Kubernetes Pod가 로그 프로세서에서 해당 로그를 제외하도록 허용합니다
        K8S-Logging.Parser On   # Kubernetes Pod가 사전 정의된 파서를 제안하도록 허용합니다
        Labels On   # 추가 메타데이터에 Kubernetes 리소스 라벨을 포함합니다.

       
        
  outputs: |
    [OUTPUT]
        Name loki
        Match kube.*
        host loki-stack.loki.svc.cluster.local
        port 3100
        labels job=fluentbit-managed, $kubernetes['pod_name'], $kubernetes['namespace_name'], $kubernetes['container_name'], $kubernetes['host']  
               # job=fluentbit : loki에 수집된 로그를 job으로 구분합니다. (구분)
               # kubernetes=pod_name 으로 라벨을 추가합니다. (라벨 추가)

 

 

  • fluent-bit 설치
helm upgrade --install fluent-bit . -f dev-test-values.yaml -n loki

 

 

 

 

 

 

 

4. 수집된 로그 보기

  • external-dns 로그 보기
    • kuberctl logs external-dns-xxx -n kube-system

 

 

  • pod(external-dns) 실제 로그
time="2023-10-18T05:06:11Z" level=info msg="All records are already up to date"

 

  • fluent-bit 수집된 로그
    • Loki에 저장될 때 "2023-10-18T04:31:53.829860102Z stderr F" 부분이 추가되었습니다.
"2023-10-18T04:31:53.829860102Z stderr F time=\"2023-10-18T04:31:53Z\" level=info msg=\"All records are already up to date\""

 

 

 

반응형