반응형
kubernetes pod의 로그를 수집하기 위해서 Loki와 fluent-bit을 사용할 수 있습니다. (그외 다른 것도 있습니다.)
fluent-bit -> Loki -> Grafana
1. fluent-bit 이란 ?
fluent-bit은 로그 수집기(LogStash, fluentd 등) 입니다.
fluent-bit 메뉴얼 : https://docs.fluentbit.io/manual/about/what-is-fluent-bit
2. Data pipeline
- data pipeline 링크 : https://docs.fluentbit.io/manual/concepts/data-pipeline/input
- Input plugin 링크 : https://docs.fluentbit.io/manual/pipeline/inputs
- Input
- 다양한 input plugin를 지원합니다.
- "tail" input plugin은 "tail -f" 쉘 커맨드와 유사한 동작을 하며, path 패턴에 일치하는 모든 파일을 읽습니다.
- Parser
- Input에서 가져온 로그파일을 구조화 데이터로 만들어줍니다.
- Input에서 가져온 로그파일을 구조화 데이터로 만들어줍니다.
- Filter
- 데이터를 최종 목적지에 전달하기 전에 데이터를 변경(필터)합니다.
- Buffer
- buffer단계에서의 데이터는 immutable한 상태입니다.
- 이미 데이터는 raw text가 아니라 binary형식이기 때문입니다.
- 즉 더이상의 수정(filtering)이 불가합니다.
- fluent bit에서는 file system을 이용한 buffering mechanism을 이용해서 system failure로 인한 데이터의 손실을 막을 수 있습니다.
- Router
- 필터를 거친 데이터를 다수의 목적지에 전달하는 기능입니다.
- tag와 match 규칙에 의해 작동합니다.
- Output
- 데이터를 전달할 목적지를 작성합니다.
- loki, ES, 등
3. fluent-bit 설치
- fluent-bit repository 등록 및 다운로드
# helm repository 등록
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
# fluent-bit chart 다운로드
helm pull fluent/fluent-bit
tar xvfz fluent-bit-0.39.0.tgz
- values.yaml 수정
- cp values.yaml dev-test-values.yaml
- vi dev-test-values.yaml
config:
service: |
[SERVICE]
Daemon Off
Flush {{ .Values.flush }}
Log_Level {{ .Values.logLevel }}
Parsers_File /fluent-bit/etc/parsers.conf
Parsers_File /fluent-bit/etc/conf/custom_parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port {{ .Values.metricsPort }}
Health_Check On
## https://docs.fluentbit.io/manual/pipeline/inputs # 옵션의 자세한 내용 확인
inputs: |
[INPUT]
Name tail # tail input plugin 사용 "tail -f 역할"
Tag kube.*
Path /var/log/containers/*.log # 모든 log 수집
Exclude_Path /var/log/containers/loki*.log,/var/log/containers/fluent-bit*.log # loki, fluent-bit 로그는 제외
Parser docker
customParsers: |
[PARSER]
#Name docker
#Format json
#Time_Key time
#Time_Format %Y-%m-%dT%H:%M:%S.%L
Name docker
Format regex
Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*) (?<kubernetes.pod_name>.*)$
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L%z # 시간 설정
## https://docs.fluentbit.io/manual/pipeline/filters # 옵션의 자세한 내용 확인
filters: |
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Merge_Log On # 활성화되면 로그 필드 콘텐츠가 JSON 문자열 맵인지 확인하고, 그렇다면 로그 구조의 일부로 맵 필드를 추가합니다.
Merge_Log_Key data
K8S-Logging.Exclude On # Kubernetes Pod가 로그 프로세서에서 해당 로그를 제외하도록 허용합니다
K8S-Logging.Parser On # Kubernetes Pod가 사전 정의된 파서를 제안하도록 허용합니다
Labels On # 추가 메타데이터에 Kubernetes 리소스 라벨을 포함합니다.
outputs: |
[OUTPUT]
Name loki
Match kube.*
host loki-stack.loki.svc.cluster.local
port 3100
labels job=fluentbit-managed, $kubernetes['pod_name'], $kubernetes['namespace_name'], $kubernetes['container_name'], $kubernetes['host']
# job=fluentbit : loki에 수집된 로그를 job으로 구분합니다. (구분)
# kubernetes=pod_name 으로 라벨을 추가합니다. (라벨 추가)
- fluent-bit 설치
helm upgrade --install fluent-bit . -f dev-test-values.yaml -n loki
4. 수집된 로그 보기
- external-dns 로그 보기
- kuberctl logs external-dns-xxx -n kube-system
- pod(external-dns) 실제 로그
time="2023-10-18T05:06:11Z" level=info msg="All records are already up to date"
- fluent-bit 수집된 로그
- Loki에 저장될 때 "2023-10-18T04:31:53.829860102Z stderr F" 부분이 추가되었습니다.
"2023-10-18T04:31:53.829860102Z stderr F time=\"2023-10-18T04:31:53Z\" level=info msg=\"All records are already up to date\""
반응형
'모니터링 > prometheus' 카테고리의 다른 글
[ Cloudwatch ] fluent-bit에서 CW으로 로그 적재 (0) | 2024.01.17 |
---|---|
[ Fargate ] Fargate 로깅 (1) | 2023.10.20 |
[ AMP ] Amazon Managed service for Prometheus 구축 (0) | 2023.10.05 |
[ prometheus ] scrape 설정 (0) | 2023.09.26 |
[ prometheus ] blackbox exporter (0) | 2023.09.26 |