로그 파이프 라인: ELK 및 Loki
1) 왜 그리고 언제: 로깅 목표
관찰 및 RCA: 데백 가속, 사후, SLO/SLA 제어.
보안 및 감사: 액세스, 이상, 조사의 흔적.
비즈니스 지표: 전환, 지불 흐름, PSP 오류, 사용자 동작.
준수: 스토리지, PII 마스킹, 보존 정책, 법적 보류.
로그 유형: 응용 프로그램, 인프라 (kubelet, kube-procy, CNI, intress), 네트워크, 감사, 지불, 웹 이벤트, Nginx/Envoy, 데이터베이스.
2) 고급 아키텍처
옵션 A: ELK
프로듀서 → Logshipper (Filebeat/Fluent Bit/Vector) → Logstash/Beats 입력 → 엘라 스틱 검색 → Kibana/
옵션 B: 로키
프로듀서 → Promtail/Fluent Bit → Loki 유통 업체/ingester/querier → Grafana/
하이브리드
전체 텍스트/패셋 검색의 경우 ELK, 저렴한 확장 가능한 스토리지의 경우 Loki 및 빠른 그래프와 같은 쿼리; Grafana의 메트릭/트레이스와의 상관 관계.
3) 데이터 흐름 및 처리 수준
1. 컬렉션: 바이트 테일 파일, 저널,
2. 농축: 타임 스탬프 정규화, 호스트/포드/네임 스페이스, env (prod/stage), 릴리스, 커밋
3. 파싱: JSON → 플랫 필드; 그 로크/정규; Nginx/Envoy 형식; 결제 체계 (PSP 오류 코드).
4. 필터링/편집: PII (PAN, CVV, 전자 메일, 주소), 비밀, 토큰을 자릅니다.
5. 경로: 세입자/서비스/로그 수준별; 뜨거운/따뜻한/차가운; S3/객체 스토리지로.
6. 저장 및 보존: 데이터 클래스 별 TTL 정책.
7. 액세스/분석/경고.
4) ELK: 주요 솔루션
4. 1 Logstash/Beats
쉬운 피커, Logstash를 중앙 ETL로 사용하려면 Beats/Fluent Bit를 노드에 사용하십시오 (grok, dissect, mutate, geoip, 번역).
Logstash pool: 부하를 분리하기 위해 ETL, 보안 ETL, 지불 ETL 섭취.
4. 2 엘라 스틱 검색
샤딩: 파편 당 ~ 20-50GB에 중점을 둡니다. "파편 폭발" 을 피하십시오.
색인 전략: 'logs- <tenit> - <service> -YYYY. MM. DD '또는 데이터 스트림; 크기/시간별 롤오버.
- 핫: SSD, 1-7 일; 따뜻한: HDD, 7-30 일; 감기: 체적; 냉동: 액세스 속도가 느린 최소 비용.
- 매핑 - 하드 타입 필드, 필드 다타 제한 및 동적 필드 생성.
- 캐시 및 쿼리: 키워드 필드 별 필터, 집계-깔끔하게; 고주파 검색을위한 핀 투 핫.
4. 3 키 바나
다중 임차를위한 공간.
검색 저장, Lens/TSVB, 임계 값/경고 메트릭.
색인 패턴 별 RBAC ('로그 테넌트-').
5) 로키: 주요 결정
5. 1 라벨 모델
레이블은 Loki의 "색인입니다. "낮은 카디널리티 사용: '클러스터', '네임 스페이스', '앱', '레벨', 'env', '테넌트'.
카디널리티가 높은 필드-연속; LogQL을 통해 쿼리 할 때 '| =', '| json', '| regexp' 를 검색하십시오.
5. 2 가지 구성 요소
Promtail: 싶은 표시줄, 파일, journald; 파서 (JSON, regex, cri).
배급사/Ingester/Querier/쿼리 프론트 엔드: 역할별 스케일링; 캐싱을 요청하십시오.
청크 로그의 장기 저장을위한 객체 저장 (S3/GCS/MinIO).
5. 3 LogQL 기술
빠른 grep: '{app = "payment", level = "orm"} | = "dengeed"'
차일드 рси째는 JSON: '{app = "api"} | json | code = "5xx" | 언 랩 지속 시간 | avg ()'
메트릭과의 상관 관계: 'rate ({app = "nginx"} | = "200" [5m])'
6) ELK vs Loki 비교 (간단히 말해)
검색/집계: ELK는 복잡한 전체 텍스트 및 페이스 쿼리에 더 강력합니다. Loki-그렙과 같고 빠르며 저렴합니다.
비용: Loki는 종종 더 큰 볼륨 (객체 스토리지 + 더 작은 인덱스) 에서 더 저렴합니다.
운영 복잡성: ELK는 지수/ILM, Javu-hips에 대한 징계가 필요합니다. Loki-레이블 분야.
메트릭/트레이스와의 상관 관계: Loki는 Grafana/OTel 스택과 자연스럽게 통합됩니다. ELK는 또한 통합을 통해 방법을 알고 있지만 더 자주 알고 있습
7) 안전 및 준수
가장자리의 PII 판 (배송 업체): PAN, 전자 메일, 전화, 주소, 토큰을 마스크하십시오.
에이전트와 버스 간의 대중 교통, mTLS.
RBAC: 임차인 인덱스/레이블; neimspaces/spaces의 격리.
비밀 위생: 비밀이없는 환경 변수, 개별 비밀 관리자.
법적 보류: 세그먼트/인덱스 동결 메커니즘; 분쟁 기간 동안 한 번 쓰십시오.
삭제/유지: 데이터 클래스 별 TTL 정책 (prod/stateful/payment/judit).
로그 액세스 감사 추적.
8) 신뢰성 및 처리량
버퍼링 및 역압: 에이전트 용 로컬 파일/디스크; 지수 백오프로 후퇴합니다.
이념성: 중복 중에 중복을 피하기 위해 'ingest _ id '/' log _ id' fields.
HA: Loki ES 마스터/잉스터를위한 최소 3 개의 노드; 친 화성 AZ.
임차인/서비스 별 쿼타 및 요율 제한; "폭풍" 로깅에 대한 보호.
로그 레벨 체계: 'ERROR' 제한, 'DEBUG' 는 동적 플래그를 통해 일시적으로 만 제한됩니다.
9) 성능 및 튜닝
ELK:- JVM 힙은 50% RAM이지만 노드 당 약 30-32GB입니다. 페이지 캐시가 중요합니다.
- 인덱스 섭취를 위해 스마트 롤오버 (20-50GB/shard), '새로 고침 _ 간격' JP를 사용하십시오.
- Logstash에서는 "무거운" 그 로크를 피하십시오. 가능하면 소스에서 JSON 로깅하십시오.
- 올바른 레이블 세트가 속도의 열쇠입니다.
- 큰 덩어리 → 저렴한 스토리지이지만 잉스터에서 더 비싼 메모리; 균형.
- 반복 요청에 대한 쿼리 프론트 엔드 + 캐시 (meme/Redis).
10) 로그 용 FinOps (비용)
필드/라벨의 카디널리티 감소.
DEBUG 샘플링 및 동적 "로그 스위치".
회전: 짧고 뜨겁고 추운 물체.
중복 및 통합 메시지 (배치).
저렴한 스토리지 클래스에 로그를 거의 사용하지 않았
가치 대시 보드: 볼륨/데이터 스트림/라벨/인덱스/테넌트.
11) 관찰 가능성 3-in-1
각 로그에 Trace-ID/Span-ID (API 게이트웨이 및 서비스의 미들웨어).
OpenTelemetry: 단일 컨텍스트; Tempo/Jaeger로 수출하고 Prometheus/Mimir로 수출하고 Loki/ELK로 로그인합니다.
빠른 시나리오: "메트릭에 의한 경고 → 해당 로그로 점프 → 트랙으로 점프".
12) 다중 임대 및 격리
네임 스페이스 기반 격리 (K8s 레이블), 별도의 인덱스 패턴/레이블 '테넌트'.
임차인에 의한 경고/대시 보드/레텐 슈나 분리.
소비 청구: 섭취량의 양, 저장, 요청.
13) 컨베이어 자체를위한 모니터링 및 SLO
SLO 섭취: "99. 9% 의 로그가 <X sec "로 전달되었습니다.
SLO 검색: "p95 쿼리 <Y sec".
기술 지표: 큐 깊이, 드롭 로그, 재처리 속도, 파서 오류율, 잉스터/ES 노드 오류.
14) 일반적인 배포 체계
관리: ElasticSearch Service/OpenSearch, Grafana Cloud Loki.
자체 호스팅 K8: ES/Loki를위한 주 세트, AZ를위한 친 화성 방지, 영구 볼륨, 객체 저장.
에지 에이전트 (지역의 응용 프로그램): 중앙 수입품에 대한 로컬 버퍼 + SL 채널.
15) 설정 예
15. 1 Promtail (K8, CRI JSON)
yaml scrape_configs:
- job_name: kubernetes-pods kubernetes_sd_configs:
- role: pod pipeline_stages:
- cri: {}
- json:
expressions:
level: level msg: message trace: trace_id
- labels:
level:
app:
namespace:
- match:
selector: '{namespace="prod"}'
stages:
- regex:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
- replace:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
replace: '[REDACTED_PAN]'
relabel_configs:
- action: replace source_labels: [__meta_kubernetes_pod_label_app]
target_label: app
- action: replace source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- action: replace source_labels: [__meta_kubernetes_pod_node_name]
target_label: node
15. 2 Logstash (섭취 및 마스킹)
ruby input {
beats { port => 5044 }
}
filter {
json { source => "message" skip_on_invalid_json => true }
mutate { add_field => { "env" => "%{[kubernetes][labels][env]}" } }
PII mutate {
gsub => [
"message", "\b[0-9]{12,19}\b", "[REDACTED_PAN]",
"message", "(?i)(authorization: Bearer)([A-Za-z0-9\.\-_]+)", "\1[REDACTED_TOKEN]"
]
}
}
output {
elasticsearch {
hosts => ["https://es-hot-1:9200","https://es-hot-2:9200"]
index => "logs-%{[fields][tenant]}-%{[app]}-%{+YYYY. MM. dd}"
ilm_enabled => true ssl => true cacert => "/etc/ssl/certs/ca. crt"
user => "${ES_USER}"
password => "${ES_PASS}"
}
}
16) 경고 및 대시 보드 (템플릿)
AP: 'rate ({app = "api", 레벨 = "오류"} [5m])> 임계 값' → PagerDuty/Telegram.
Nginx/Envoy에서 5xx 스플래시; 에이전트에서 드롭 섭취; 대기 시간 검색의 성장.
- 서비스/테넌트 별 로그 양.
- 최고 오류 패턴 (코드/예외/엔드 포인트).
- 보존/보관 클래스 별 비용.
17) 품질 확인 (로그 QA)
로깅 계약: JSON 형식, 필요한 필드 ('ts', 'level', 'service', 'env', 'trace _ id', 'msg').
CI의 라이터 로그: 동의없이 카디널리티가 높은 새로운 필드를 금지합니다.
카나리아 서비스: 회귀의 조기 탐지를위한 참조 로그 생성.
18) 빈번한 오류 및 패턴 방지
Loki는 카디널리티가 높은 레이블 ('user _ id', '요청 _ id') → 메모리 폭발.
매핑없이 ES의 동적 필드 → "인덱스 폭발".
판매에서 DEBUG "영원히. "깃발과 TTL로 켜십시오.
PII 개정 부재.
모든 것을위한 하나의 일반적인 "모 놀리 식" 파이프 라인-도메인 별 더 나은 세그먼트.
19) 구현 계획 (반복)
1. MVP: 에이전트 + 하나의 파이프 라인 (응용 프로그램), 기본 대시 보드, PII 판.
2. 확장: 네트워크/인프라 로그, SLO 경고, 트랙과의 상관 관계.
3. FinOps: 보존 매트릭스, 비용 보고서, 라벨/인덱스 최적화.
4. 멀티 테넌트: 공간, RBAC, 소비 청구.
5. 신뢰성: HA, 재난 훈련, 법률 보류.
20) 생산 출시 점검표
- 모든 서비스에서 JSON 형식 및 필요한 필드.
- PII 마스킹 온/잉스트 에이전트.
- 유지/ILM 또는 버킷 라이프 사이클 정책.
- RBAC/공간/테넌트.
- SLO 수집/검색 및 경고.
- 카나리아 로그 및로드 테스트 실행.
- 가치 대시 보드 및 서비스 소유자에 대한보고.
- 런북: "섭취/검색 느린/파편이 빨간색으로 바뀌면 어떻게해야합니까?"
21) 미니 -FAQ
무엇을 선택해야합니까? ELK 또는 Loki?