본문 바로가기
Container/Kubernetes

containerd를 위한 fluent-bit config 설정

by sa-na 2022. 6. 26.

배경

fluentbit

Kubernetes v1.23부터 기본 런타임이 containerd로 변경됨에 따라, 로그포맷이 아래와 같이 변경되었습니다.

2022.06.25 - [AWS/EKS] - EKS의 기본 런타임이 v1.23부터 containerd로 변경됩니다.

 

기존 /var/log/containers 위치에 있던 로그들은 Json 포맷이었는데요.

{
    "log": "time=\"2022-06-26T06:03:22Z\" level=info msg=\"Start processing\" resource=argocd/admission-controller\n",
    "stream": "stderr",
    "time": "2022-06-26T06:03:22.373102829Z"
}

이제 아래와 같은 한줄의 로그가 생성됩니다.

2022-06-26T05:47:06.216730222Z stderr F I0626 05:47:06.216638       1 proxier.go:813] "SyncProxyRules complete" elapsed="31.788331ms"

fluentbit config

[INPUT]Parserdocker에서 cri라는 이름으로 변경해주는 것이 필요합니다.

[INPUT]
    Name              tail
    Tag               kube.*
    Path              /var/log/containers/*.log
    Parser            cri

Parser에도 새로운 parser를 cri라는 이름으로 새로 넣어주어야 합니다.

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

정리하면 아래와 같은 fluentbit configmap.yaml을 만들어볼 수 있습니다.

# Fluent Bit with containerd, CRI-O and JSON
# https://github.com/microsoft/fluentbit-containerd-cri-o-json-log
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
  namespace: default
  labels:
    k8s-app: fluent-bit
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush         1
        Log_Level     info
        Daemon        off
        Parsers_File  parsers.conf
        HTTP_Server   On
        HTTP_Listen   0.0.0.0
        HTTP_Port     2020
    @INCLUDE input-kubernetes.conf
    @INCLUDE filter-kubernetes.conf
    @INCLUDE output.conf
  output.conf: |
    [OUTPUT]
        Name            stdout
        Match           kube.var.log.containers.myapp*.*
  input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Parser            cri
        DB                /var/log/flb_kube.db
        Mem_Buf_Limit     5MB
        Skip_Long_Lines   On
        Refresh_Interval  10
  filter-kubernetes.conf: |
    [FILTER]
        Name                kubernetes
        Match               kube.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
        Kube_Tag_Prefix     kube.var.log.containers.
        Merge_Log           On
        Merge_Log_Trim      On
        Keep_Log            Off
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
        Annotations         Off
        Labels              On
    [FILTER]
        Name          nest
        Match         kube.*
        Operation     lift
        Nested_under  kubernetes
        Add_prefix    kubernetes_
    [FILTER]
        Name          nest
        Match         kube.*
        Operation     lift
        Nested_under  kubernetes_labels
        Add_prefix    kubernetes_labels_
  parsers.conf: |
    [PARSER]
        Name        json
        Format      json
        Time_Key    time
        Time_Format %d/%b/%Y:%H:%M:%S %z
        Time_Keep   Off
    [PARSER]
        Name docker
        Format json
        Time_Key time
        Time_Format %Y-%m-%dT%H:%M:%S.%L
        Time_Keep Off
    [PARSER]
        Name        cri
        Format      regex
        Regex       ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z

https://gist.github.com/didhd/44e7a459a1e00f5963bceb3cb3f61bfe

해당 config를 사용해 fluent-bit의 configmap을 업데이트 하시면, 기존과 같이 fluentbit을 사용하실 수 있습니다.

 

감사합니다.

'Container > Kubernetes' 카테고리의 다른 글

Kubernetes Ephemeral container 란?  (0) 2022.08.15
Service account token Volume Projection이란?  (0) 2022.06.26

댓글