Kubernetes

containerd 로그 수집을 위한 AWS Fluent Bit 설정

DevelopC 2022. 12. 2. 11:39
728x90

containerd 로그 수집을 위한 AWS Fluent Bit 설정

Kubernetes 1.24부터 기본 container rumtime이 변경되었습니다. EKS도 1.24부터 container rumtime이 docker에서 containerd로 변경되었습니다. Fluent Bit를 통해서 로그를 수집하고 있었다면 containerd 설정으로 인해 로그 포맷이 변경되어 Fluent Bit 설정을 수정해야합니다.

 

로그 포맷

container rumtime - docker에서는 기본적으로 json 형식으로 로그를 출력합니다.

{
   "log":"ts=2022-11-30T09:49:46.292Z caller=node_exporter.go:199 level=info msg=\"Listening on\" address=[0.0.0.0]:9100\n",
   "stream":"stderr",
   "time":"2022-11-30T09:49:46.292187066Z"
}

container rumtime - containerd에서는 json형식이 아닌 일반 텍스트 형식으로 로그를 출력합니다.

2022-11-30T09:27:29.589650507Z stderr F level=info ts=2022-11-30T09:27:29.589Z caller=node_exporter.go:199 msg="Listening on" address=0.0.0.0:9100

Fluent Bit 설정

로그포맷이 변경되어 아래와같이 PARSER를 추가하고, INPUT설정의 Parser를 containerd로 수정해주셔야합니다.

[PARSER]
  Name        containerd
  Format      regex
  Regex       ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*)$
  Time_Key    time
  Time_Format %Y-%m-%dT%H:%M:%S.%LZ

위의 추가된 PARSER를 적용한 Fluent Bit 설정입니다. 아래의 설정은 container로그를 AWS CloudWatch log로 보내는 설정입니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
data:
  application-log.conf: |
    [INPUT]
        Name                tail
        Tag                 application.*
        Path                /var/log/containers/*.log
        Parser              containerd
        DB                  /var/fluent-bit/state/flb_container.db
        Mem_Buf_Limit       50MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Rotate_Wait         30

    [FILTER]
        Name                kubernetes
        Match               application.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_Tag_Prefix     application.var.log.containers.
        Merge_Log           On
        Merge_Log_Key       log_processed
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
        Labels              Off
        Annotations         Off
        Use_Kubelet         On
        Kubelet_Port        10250
        Buffer_Size         0

    [OUTPUT]
        Name                cloudwatch_logs
        Match               application.*
        region              ap-northeast-2
        log_group_name      /aws/eks/application
        auto_create_group   true

  fluent-bit.conf: |
    [SERVICE]
        Flush                     5
        Log_Level                 info
        Daemon                    off
        Parsers_File              parsers.conf
        HTTP_Server               On
        HTTP_Listen               0.0.0.0
        HTTP_Port                 2020
        storage.path              /var/fluent-bit/state/flb-storage/
        storage.sync              normal
        storage.checksum          off
        storage.backlog.mem_limit 5M

    @INCLUDE application-log.conf

  parsers.conf: |
    [PARSER]
        Name                containerd
        Format              regex
        Regex               ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*)$
        Time_Key            time
        Time_Format         %Y-%m-%dT%H:%M:%S.%LZ
728x90