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 내 공유 볼륨