Fluent Bit를 테스트하고 로그 수집을 할 때 진작 이 수준으로 깊게 알았어야 했는데... 오늘에야 알게 된 내용 정리
1. Fluent Bit가 롤링 업데이트 되어도 Input 과정에서 로그 손실이 없을까?
- Tail Input을 사용할 경우
- fluent bit을 배포하기 위해 사용한 Daemonset은 기본적으로 노드별로 pod를 rolling update
** 현재 daemonset은 먼저 기존 pod를 삭제하고 새 pod를 생성함에 유의 ** - fluent-bit-configmap.yaml
[INPUT]
Name tail
Tag test.*
Path /var/log/containers/test*.log
DB /var/log/flb_test.db
fluent bit는 input 플러그인에서 DB를 사용해 파일을 어디까지 읽어왔는지를 기록하는데,
- fluent-bit-daemonset.yaml
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
hostPath:
path: /var/log
fluent-bit와 워커노드의 /var/log 디렉토리가 마운트되기 때문에 DB 파일이 워커노드에 남아있게 됨
→ 새 fluent-bit 파드가 DB를 이어받아 데이터 손실 없이 로그를 수집할 수 있다.
2. Fluent Bit S3 Output 플러그인 사용 시, 롤링 업데이트 혹은 파드가 갑자기 종료되는 상황에서 데이터 유실이 없을까?
[OUTPUT]
Name s3
Match *
bucket my-bucket
region us-west-2
total_file_size 250M
store_dir /var/log/s3/temp/
s3_key_format /$TAG[2]/$TAG[0]/%Y/%m/%d/%H/%M/%S/$UUID.gz
s3_key_format_tag_delimiters .-
store_dir 옵션을 사용하면 fluent bit가 s3에 데이터를 업로드 하기 전에 데이터를 임시로 해당 디렉토리에 저장한다.
fluent bit가 갑자기 멈춘다면 종료 전에 store_dir의 모든 데이터를 전송하고 업로드를 마치려 한다.
전송하지 못한 데이터가 있다면, fluent-bit가 재시작할 때 store_dir에 남아있는 데이터가 있는지 찾아보고 다시 전송을 시작하려 한다.
-> store_dir 옵션이 없어도 fluent bit는 종료 시 모든 데이터를 s3에 전송하려 시도하지만 그러지 못할 수도 있다.
그러니 store_dir 옵션을 사용하도록 하자!
3. Kubernetes 환경에서 Fluent Bit pod 안에 컨테이너가 2개라면, 롤링 업데이트가 안 된다?
ArgoCD에서 fluent bit 설정 소스코드를 수정 후 sync를 했더니 원래 rolling update 시에는 각 노드마다 하나씩 pod가 생성되고 종료되는데, 컨테이너가 2개인 fluent bit pod를 배포하려니 갑자기 모든 노드의 pod가 한 번에 없어지는 것처럼 보여(실제로는 rolling update일지라도) 엄청 놀랐다.
그런데 알게 된 흥미로운 사실은, Daemonset을 사용해 fluent bit 같은 로그 수집 프로그램을 rolling update로 배포할 때는 원래
- 먼저 지우고
- 그 다음 새로 생성하는 rolling update였다.
> 관련 깃허브 이슈
Kubernetes 1.21 알파 버전부터는 add first, then delete 방식으로 daemonset도 rolling update가 이뤄진다고 한다... 고 깃헙 이슈에 써 있는데, 1.25 버전의 공식 문서에는 아직
With RollingUpdate update strategy, after you update a DaemonSet template, old DaemonSet pods will be killed, and new DaemonSet pods will be created automatically
이렇게 써 있다. 어떻게 되는 건지 궁금하군...
'인프라,데이터 > Fluentd, Fluent Bit' 카테고리의 다른 글
Fluentd tail input 로그 1개 손실 & 로그 느리게 들어오는 이유 해결 (0) | 2022.06.29 |
---|---|
Fluentd로 S3 output path에 field(key) 값 넣기 (0) | 2022.06.12 |
Fluentd add Record Field by Ruby 'Case when~' Conditional Statements (0) | 2022.06.07 |
argocd 로그 모니터링 (0) | 2022.05.02 |
Fluent Bit에 SQS Output 연결하기(feat. Golang) (0) | 2022.04.14 |