[Fluentd] ⚠️ [in_tail_container_logs] pattern not matched 해결책

우노·2024년 8월 21일
0

Practice & Trouble Shooting

목록 보기
11/20

쿠버네티스로 서비스를 배포하기 전에 EFK 스택을 구축해서 로그 수집부터 하려고 계획을 했는데.. ElasticSearch와 Fluentd가 연결이 안 되길래 데몬셋으로 배포한 Fluentd 파드 중 하나의 로그를 확인했더니 다음과 같이 찍히고 있었습니다.

⚠️ [in_tail_container_logs] pattern not matched

뭔지는 모르겠지만 경고와 함께 끝없는 \가 찍히고 있었고 그러다가 갑자기 프로세스가 죽어버리기도 했습니다.

원인 분석

간단히 정리하자면 문제를 알려주는 로그는 아래 두가지였습니다.

[warn]: #0 [in_tail_container_logs] pattern not matched: "2024-08-21T00:18:00.358143768Z stdout F 2024-08-21 00:18:00 +0000

2024-08-21 00:16:30 +0000 [error]: Worker 0 exited unexpectedly with signal SIGKILL
  1. 컨테이너(파드) 로그 수집이 어렵다고 fluentd의 로그 무한 생성
  2. 1.로 인해서 CPU, 메모리 등의 소모로 프로세스 KILL

➡️ 프로세스 KILL로 필요한 로그 수집 실패!

결국 ElasticSearch-Fluentd의 연결 문제 이전에 Fluentd가 ElasticSearch에 연결할 여유부터 없는 것이 문제였습니다.

기존 환경변수

해결법을 설명하기 전에 Fluentd를 각 파드에 배포하는 다양한 방법 중 제가 선택한 방법은 YAML 파일로 데몬셋을 배포하는 방법이고 환경변수를 작성하여 flunetd의 .conf에서 사용할 설정값을 넘겨주었습니다.

## elasticsearch 연결 - 문제 없음
- name: FLUENT_ELASTICSEARCH_HOST
  value: "elasticsearch-svc"
- name: FLUENT_ELASTICSEARCH_PORT
  value: "9200"
- name: FLUENT_ELASTICSEARCH_SCHEME
  value: "http"
- name: FLUENT_ELASTICSEARCH_USER
  value: "~~"
- name: FLUENT_ELASTICSEARCH_PASSWORD
  value: "~~"
## 이전에 실패했던 logstash-*와 구분하기 위함
- name: FLUENT_ELASTICSEARCH_LOGSTASH_PREFIX
  value: "fluentd"
- name: FLUENT_ELASTICSEARCH_LOGSTASH_INDEX_NAME
  value: "fluentd"

해결 과정

구글을 떠돌던 중 빛같은 이슈 코멘트를 발견했습니다.
[Github] fluent/fluentd-kubernetes-daemonset/issues/434#issuecomment-823492259

요약하자면 환경 변수를 추가해서 다음과 같이 해결하는 방법입니다.

  • FLUENT_CONTAINER_TAIL_PARSER_TYPE을 바꿔서 경고 해결 및 로그 수집 정상화
  • FLUENT_CONTAINER_TAIL_EXCLUDE_PATH 로 내부 로그 무한 생성 ➡️ 프로세스 KILL 방지

FLUENT_CONTAINER_TAIL_PARSER_TYPE

/fluentd/etc/tail_container_parse.conf 에 위치해 있으며

"#{ENV['FLUENT_CONTAINER_TAIL_PARSER_TYPE'] || 'json'}"

이전에 json으로 설정되어있었고 이걸 로그를 파싱하도록 정규식으로 바꾸어 fluentd가 읽은 로그를 elasticsearch로 전달할 수 있게 합니다.

FLUENT_CONTAINER_TAIL_EXCLUDE_PATH 는 위의 문제를 해결하면 무한 생성되는 로그를 방지할 수 있어 필수적으로 추가해야하는 것은 아니지만 제가 원하는 건 Fluentd의 내부 로그가 아닌 컨테이너의 로그이기 때문에 추가했습니다.

해결 - 환경변수 추가

이슈 코멘트의 제안 그대로 실행하였습니다.

- name: FLUENT_CONTAINER_TAIL_EXCLUDE_PATH
  value: /var/log/containers/fluent*
- name: FLUENT_CONTAINER_TAIL_PARSER_TYPE
  value: /^(?<time>.+) (?<stream>stdout|stderr)( (?<logtag>.))? (?<log>.*)$/

Kibana에서 확인

kubectl logs로 fluentd와 elasticsearch 파드가 정상 작동하는 걸 확인하고 Kibana에서 Index patterns을 추가해서 대시보드로 확인했습니다.

이전에 컨테이너 관련 로그가 찍히지 않던 것과 달리 테스트를 위해서 실행한 count라는 컨테이너의 로그가 정상적으로 찍히는 것을 확인할 수 있었고 대시보드에서도 확인할 수 있었습니다!

EFK로 로그 수집에 성공한 것은 기쁘지.. 프라이빗 서브넷에서 Kibana 서비스를 로드밸런서 형태로 배포해서 AWS에서 제공하는 ELB 주소로 접근하니 <ip>:<port>로 접근하는 것이 마음에 들지 않고 http로 접근하는 것도 해결해야할 것 같아서 아직 해결할 문제가 많습니다.. 화이팅!🫠

참고 자료
elasticsearch - fluent.conf params
[byeongjo-kim.tistory.com] Kubernetes에 EFK 설치 및 튜토리얼

profile
기록하는 감자

0개의 댓글