쿠버네티스로 서비스를 배포하기 전에 EFK 스택을 구축해서 로그 수집부터 하려고 계획을 했는데.. ElasticSearch와 Fluentd가 연결이 안 되길래 데몬셋으로 배포한 Fluentd 파드 중 하나의 로그를 확인했더니 다음과 같이 찍히고 있었습니다.
뭔지는 모르겠지만 경고와 함께 끝없는 \가 찍히고 있었고 그러다가 갑자기 프로세스가 죽어버리기도 했습니다.
간단히 정리하자면 문제를 알려주는 로그는 아래 두가지였습니다.
[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
➡️ 프로세스 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 방지/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>.*)$/
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 설치 및 튜토리얼