이거는 어디에 쓰는 물건인가?
로그 수집과 모니터링을 위해 사용한다.
이 과정을 이해 하기 위해서는 Loki, Promtail, Grafana의 역할을 알아야한다.
그리고, 이런 구조가 필요했던 이유는?
- Elastic search, Fluent-bit, Kibana의 구조로 Log수집을 했었다. 하지만 Elasticsearch에서의 새로운 라이센스를 적용하는것으로 인해서 Log수집 및 Monitoring의 구성을 바꿔야 하는 고민을 하게되었다.
Elastic search 라이선스 변경 내용
올해 Elastic에서는 Elasticsearch 7.11 버전부터 새로운 라이센스인 SSPL 또는 Elastic 라이센스 중에서 하나를 골라 사용할 수 있는 Dual 라이센스를 발표하면서 기존의 Apache 2.0 라이센스를 더는 제공하지 않는다고 발표하였습니다.
https://blog.opsnow.com/35
간단히 매칭해서 살펴보면 아래와 같은 구조를 가진다.
Elasticsearch = Loki : Log Data 저장소
Fluent-bit = Promtail : Log 수집기
Kibana = Grafana : Monitoring 화면
data:
promtail.yaml: |
client:
backoff_config:
max_period: 5m
max_retries: 10
min_period: 500ms
batchsize: 1048576
batchwait: 1s
external_labels: {}
timeout: 10s
positions:
filename: /run/promtail/positions.yaml
server:
http_listen_port: 3101
target_config:
sync_period: 10s
scrape_configs:
- job_name: kubernetes-pods-app
pipeline_stages:
- json:
expressions:
log:
stream:
timestamp: time
- match:
selector: '{data="container"}'
stages:
- regex:
expression: '(?P<data>{[\s\w\S\W]+[\}])'
source: log
- labels:
data:
- json:
expressions:
logname: 'log.name'
content: '"content"'
source: contents
- labels:
logname:
content:
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: drop
regex: .+
source_labels:
- __meta_kubernetes_pod_label_name
- source_labels:
- __meta_kubernetes_pod_label_app
target_label: __service__
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: drop
regex: ''
source_labels:
- __service__
- action: replace
source_labels:
- __meta_kubernetes_pod_container_name
target_label: container
- replacement: /var/log/pods/*$1/*.log
separator: /
source_labels:
- __meta_kubernetes_pod_uid
- __meta_kubernetes_pod_container_name
target_label: __path__