콘텐츠로 이동

2025 12 22

2025-12-22

k8s 환경에서 filebeat 사용하기

DaemonSet

  • 각 노드마다 돌아가야하는 Pod를 보장하는 컨트롤러
  • Filebeat 갯수: 노드당 1개
  • 리소스 사용: 효율적
  • 앱 Deployment 수정: 불필요
  • 로그 격리: 모든 로그 접근 가능
  • 설정 관리: 중앙 집중
  • 권한 필요: HostPath 권한
  • 멀티테넌시: 부적합
    • 여러 팀이 같은 인프라를 공유하면서 서로 격리된 환경을 멀티테넌시라고 한다

┌─────────────────────────────── Node ────────────────────────────────┐
│                                                                     │
│   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐                 │
│   │ App Pod A   │  │ App Pod B   │  │ App Pod C   │                 │
│   │             │  │             │  │             │                 │
│   │ stdout ─────┼──┼─────────────┼──┼─────────────┼──┐              │
│   └─────────────┘  └─────────────┘  └─────────────┘  │              │
│                                                      │              │
│   ┌──────────────────────────────────────────────────▼────────────┐ │
│   │           /var/log/containers/ (호스트 파일시스템)                │ │
│   │   app-a-xxx.log  app-b-xxx.log  app-c-xxx.log                 │ │
│   └───────────────────────────────────────────────────────────────┘ │
│                                    ▲                                │
│                                    │ hostPath mount                 │
│   ┌────────────────────────────────┴──────────────────────────────┐ │
│   │                    Filebeat Pod (DaemonSet)                   │ │
│   │                    * 노드당 딱 1개만 실행                         │ │
│   │                                                               │ │
│   │   - 모든 컨테이너 로그 읽기                                         │ │
│   │   - 필터링 후 Logstash 전송                                      │ │
│   └───────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
spec:
  # DaemonSet이 관리할 Pod를 식별
  selector:
    matchLabels:
      k8s-app: filebeat
  template:
    spec:
      containers:

        - name: filebeat
          image: docker.elastic.co/beats/filebeat:8.17.0
          volumeMounts:

            - name: varlog
              mountPath: /var/log
              readOnly: true
      volumes:

        - name: varlog
          hostPath:
            path: /var/log   # 호스트의 로그 디렉토리 마운트

Sidecar

  • Filebeat 갯수: Pod당 1개
  • 리소스 사용: Pod 수 만큼 파일비트 생성
  • 앱 Deployment 수정: Sidecar 설정 넣어둬야 함
  • 로그 격리: 해당 Pod만
  • 설정 관리: 분산
  • 권한 필요: 최소 권한
  • 멀티테넌시: 적합 - 여러 팀이 같은 인프라를 공유하면서 서로 격리된 환경을 멀티테넌시라고 한다

┌─────────────────────────────── Node ───────────────────────────────┐
│                                                                    │
│   ┌─────────────────────────────────────┐                          │
│   │              App Pod A              │                          │
│   │  ┌─────────────┐  ┌───────────────┐ │                          │
│   │  │ App         │  │ Filebeat      │ │                          │
│   │  │ Container   │  │ Sidecar       │ │                          │
│   │  │             │  │               │ │                          │
│   │  │ log → ──────┼──┼─→ 읽기 → 전송   │ │                          │
│   │  └─────────────┘  └───────────────┘ │                          │
│   │         │              ▲            │                          │
│   │         └──── emptyDir ─┘           │                          │
│   │              (공유 볼륨)              │                          │
│   └─────────────────────────────────────┘                          │
│                                                                    │
│   ┌─────────────────────────────────────┐                          │
│   │              App Pod B              │                          │
│   │  ┌─────────────┐  ┌───────────────┐ │                          │
│   │  │ App         │  │ Filebeat      │ │  ← Pod마다 별도 Filebeat   │
│   │  │ Container   │  │ Sidecar       │ │                          │
│   │  └─────────────┘  └───────────────┘ │                          │
│   └─────────────────────────────────────┘                          │
│                                                                    │
└────────────────────────────────────────────────────────────────────┘
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 2
  # 이 label을 가진 Pod가 내 관리 대상이야!
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:

        - name: app
          image: my-app:latest
          volumeMounts:

            - name: logs
              mountPath: /var/log/app

        # Filebeat Sidecar

        - name: filebeat
          image: docker.elastic.co/beats/filebeat:8.17.0
          volumeMounts:

            - name: logs
              mountPath: /var/log/app
              readOnly: true

      volumes:

        - name: logs
          emptyDir: {}    # Pod 내 공유 볼륨