Fluent Bit 은 네 단계를 거친다.
INPUT -> PARSER -> FILTER -> OUTPUT
| 단계 | 역할 |
|---|---|
| INPUT | 어디서 읽을지. 파일(tail), systemd 저널(systemd), 네트워크(syslog) |
| PARSER | 한 줄을 필드로 쪼갠다 |
| FILTER | 필드를 더하거나 빼고 조건으로 거른다 |
| OUTPUT | 어디로 보낼지. stdout, Loki, Elasticsearch, Kafka 등 |
[SERVICE]
Flush 1
Daemon Off
Log_Level info
Parsers_File parsers.conf
[INPUT]
Name tail
Path /var/log/messages
Tag syslog.messages
DB /var/lib/fluent-bit/flb_messages.db
Parser syslog-rfc3164
Refresh_Interval 5
Skip_Long_Lines On
[OUTPUT]
Name stdout
Match *
Format json_lines
DB 는 어디까지 읽었는지 기록하는 파일이다. 지정하지 않으면 Fluent Bit 을 재시작할 때마다 파일을 처음부터 다시 읽는다. 운영에서는 반드시 지정한다. 경로는 재시작해도 남는 곳이어야 한다.
파서는 parsers.conf 에 둔다. /var/log/messages 는 RFC 3164(BSD) 형식이다.
[PARSER]
Name syslog-rfc3164
Format regex
Regex ^(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$
Time_Key time
Time_Format %b %d %H:%M:%S
RFC 3164 타임스탬프에는 연도가 없다. 연말·연초에 연도가 어긋날 수 있으므로 Time_Keep On 으로 원문을 남겨 두거나, 가능하면 저널을 직접 읽는 쪽이 낫다.
RHEL 계열에서 rsyslog 를 거치지 않고 저널에서 바로 읽으면 파싱이 필요 없다.
[INPUT]
Name systemd
Tag host.*
Read_From_Tail On
DB /var/lib/fluent-bit/flb_journal.db
Systemd_Filter _SYSTEMD_UNIT=kubelet.service
필드가 이미 구조화돼 있어(_HOSTNAME, _SYSTEMD_UNIT, PRIORITY) 라벨로 쓰기 좋다.
[OUTPUT]
Name loki
Match syslog.*
Host <loki-host>
Port 3100
Labels job=syslog, host=${HOSTNAME}
[OUTPUT]
Name es
Match syslog.*
Host <elastic-host>
Port 9200
Index syslog
HTTP_User ${ES_USER}
HTTP_Passwd ${ES_PASSWORD}
Suppress_Type_Name On
Elasticsearch 8 이상에서는 Type 을 보내면 거부되므로 Suppress_Type_Name On 을 켠다.
자격증명은 설정 파일에 직접 적지 말고 환경변수로 넘긴다.
노드마다 하나씩 띄워야 하므로 DaemonSet 으로 배포하고, 컨테이너 로그 디렉터리를 호스트에서 마운트한다.
[INPUT]
Name tail
Path /var/log/containers/*.log
Parser cri
Tag kube.*
DB /var/log/flb_kube.db
Mem_Buf_Limit 5MB
Skip_Long_Lines On
[FILTER]
Name kubernetes
Match kube.*
Merge_Log On
Keep_Log Off
K8S-Logging.Parser On
K8S-Logging.Exclude On
컨테이너 런타임이 containerd 나 CRI-O 면 파서는 cri 다. Docker 시절의 docker 파서를 그대로 쓰면 한 줄도 파싱되지 않는다.
Mem_Buf_Limit 을 두지 않으면 출력이 막혔을 때 메모리가 계속 늘어난다. 노드 로그가 많은 클러스터에서는 파일 버퍼(storage.path)를 함께 쓴다.
fluent-bit -c /etc/fluent-bit/fluent-bit.conf --dry-run
systemctl status fluent-bit
journalctl -u fluent-bit -n 100
먼저 OUTPUT 을 stdout 으로 두고 파싱 결과를 눈으로 본 뒤 실제 대상으로 바꾸는 편이 빠르다.