DOCS/journey/troubleshooting/250929_51123_fluent_bit_container_metadata_missing.md
happybell80 0252dd1a7f fix: 51123 서버 IP 주소 업데이트 (성수 이전)
192.168.219.45 → 192.168.0.100 일괄 변경

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 11:52:26 +09:00

3.8 KiB

date, author, tags
date author tags
2025-09-29 admin
fluent-bit
opensearch
logging
docker

Fluent Bit 컨테이너 메타데이터 수집 실패 문제

문제 상황

  • 발생일: 2025-09-27 12:22 재시작 이후
  • 환경: 51123 서버 Fluent Bit → Data Prepper → OpenSearch
  • 증상: 컨테이너 로그는 수집되나 container_name 필드 누락 (모두 "unknown")
  • 영향: 9/27 19:16 이후 대부분 컨테이너 로그 식별 불가

원인 분석

타임라인

  • 9/27 12:22: Fluent Bit 컨테이너 재시작 (hostexecutor-fluent-bit 이미지)
  • 9/27 19:16: 마지막 정상 rb8001 로그 수집
  • 9/28: 전체 컨테이너 로그 수집 실패 (fluent-bit 자체 로그만)
  • 9/29: 일부 복구되었으나 메타데이터 여전히 누락

근본 원인

# 현재 설정
[INPUT]
    Name              tail
    Path              /var/lib/docker/containers/*/*-json.log
    Parser            docker
    Docker_Mode       On  # 로그 본문 병합용, 메타데이터 추출과 무관
  1. 메타데이터 추출 방법 부재: tail 입력은 파일만 읽고 컨테이너 정보 추출 못함
  2. /var/run/docker.sock 미마운트: Docker API 접근 불가
  3. Fluent Bit 4.0.9에 docker 필터 없음: 'docker'라는 이름의 필터 플러그인 미존재

해결 방안

현재 상태 (해결됨)

  • fluent-bit.conf:29 - 작동 안 하는 [FILTER] Name docker 존재
  • docker-compose.yaml:13 - /var/run/docker.sock 마운트 있으나 활용 안 됨
  • lua 스크립트 없음, Path_Key 설정 없음

필요한 수정사항

1. fluent-bit.conf 수정

  • 29-35번 라인 [FILTER] Name docker 섹션 제거 (v4.0.9에 없는 필터)
  • INPUT 섹션에 Path_Key filepath 추가 (파일 경로를 레코드에 포함)
  • lua 필터 추가 필요

2. lua 스크립트 작성 (extract_container_id.lua)

  • 경로에서 container_id 추출: /var/lib/docker/containers/{id}/{id}-json.log
  • container_name 얻으려면:
    • 방법1: /var/lib/docker/containers/{id}/config.v2.json 파일 읽기
    • 방법2: docker.sock 마운트 유지하고 Docker API 호출

3. docker-compose.yaml 수정

  • lua 스크립트 마운트: ./extract_container_id.lua:/fluent-bit/etc/extract.lua:ro
  • docker.sock: container_name 필요 시 유지, ID만 필요하면 제거

3. Dockerfile 오류

  • 13번 라인: COPY certs/root.pem /fluent-bit/certs/root.pem
  • 문제: certs 디렉토리 없음
  • 조치: 해당 라인 제거 또는 주석 처리 필요

검증 명령

# 컨테이너별 로그 확인
curl -s "http://localhost:9200/dataprepper-*/_search" | \
  python3 -c "import sys,json; [print(h['_source'].get('container_name','unknown')) for h in json.load(sys.stdin)['hits']['hits']]"

해결 완료 (2025-09-29)

수행된 조치

  1. data-prepper 설정 수정

    • pipelines.yaml: hosts: ["http://localhost:9200"]hosts: ["http://192.168.0.100:9200"]
    • 51123 서버의 OpenSearch에 정상 연결
  2. Actions orphan 문제 해결

    • fluent-bit/.gitea/workflows/cicd.yml: docker compose down --remove-orphans 제거
    • opensearch/.gitea/workflows/cicd.yml: docker compose down 제거
    • network_mode: host 환경에서 다른 프로젝트 컨테이너 보존

최종 상태

  • container_id 메타데이터 정상 추출
  • fluent-bit → data-prepper(2021) → OpenSearch(9200) 파이프라인 정상 작동
  • HTTP 200 OK 응답으로 로그 전송 확인
  • OpenSearch에 container_name 필드 포함된 로그 저장

교훈

  • Docker 이미지 내장 설정은 변경 추적 어려움
  • 중요 설정은 외부 파일로 관리 필수
  • Fluent Bit Docker_Mode는 FILTER와 함께 사용해야 함
  • network_mode: host 사용 시 docker compose down --remove-orphans 주의
  • Actions에서는 docker compose up -d --build만 사용하여 기존 컨테이너 보존