1.5.3.3.3 FluentBit로 OKE 로그 전송하기
EFK 구성에서 ElasticSearch와 Kibana 대신 OpenSearch와 OpenSearch Dashboard를 사용합니다.
FluentBit 설치
-
FluentBit 사이트의 권장에 따라 Helm Chart로 설치합니다.
-
FluentBit Helm Chart 저장소를 추가합니다.
helm repo add fluent https://fluent.github.io/helm-charts
-
OpenSearch로 로그를 포워딩하기 위한 설정값을 작성합니다.
- myvalues.yaml
config: outputs: | [OUTPUT] Name es Match kube.* Host amaaaaaavsea7yia3enl6q6yrwekrd7qpi3yqaphhcvwowtmzftkt45jel7a.opensearch.ap-chuncheon-1.oci.oraclecloud.com Port 9200 tls On tls.verify Off Retry_Limit False Logstash_Format On Trace_Error On [OUTPUT] Name es Match host.* Host amaaaaaavsea7yia3enl6q6yrwekrd7qpi3yqaphhcvwowtmzftkt45jel7a.opensearch.ap-chuncheon-1.oci.oraclecloud.com Port 9200 tls On tls.verify Off Retry_Limit False Logstash_Format On Trace_Error On
-
OKE 클러스터에 FluentBit을 설치합니다.
kubectl create ns logging helm upgrade --install fluent-bit fluent/fluent-bit -f myvalues.yaml -n logging
테스트
-
테스트 앱을 배포합니다.
kubectl create deployment docker-hello-world --image=scottsbaldwin/docker-hello-world:latest kubectl expose deployment docker-hello-world --name docker-hello-world-svc --port 80 --type LoadBalancer
-
테스트 앱을 호출합니다.
-
테스트 Pod가 배포된 노드에 있는 fluentbit 로그를 확인합니다.
$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES docker-hello-world-84ddf58f67-jpvrt 1/1 Running 0 10m 10.244.1.8 10.0.10.196 <none> <none> $ kubectl get pod -o wide -n logging NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES fluent-bit-2n42h 1/1 Running 0 8s 10.244.0.8 10.0.10.226 <none> <none> fluent-bit-4wpl2 1/1 Running 0 13s 10.244.1.9 10.0.10.196 <none> <none> fluent-bit-mwgtm 1/1 Running 0 21s 10.244.0.137 10.0.10.233 <none> <none>
- 로그 확인
$ kubectl logs -f fluent-bit-4wpl2 -n logging [2022/10/16 10:24:42] [error] [output:es:es.0] error: Output {"took":2,"errors":true,"items":[{"create":{"_index":"logstash-2022.10.16","_type":"_doc","_id":"olBT4IMBFcJImGmyDCZo","status":400,"error":{"type":"mapper_parsing_exception","reason":"object mapping for [kubernetes.labels.app] tried to parse field [app] as object, but found a concrete value"}}}]} [2022/10/16 10:24:42] [ warn] [engine] failed to flush chunk '1-1665915881.614422791.flb', retry in 8 seconds: task_id=0, input=tail.0 > output=es.0 (out_id=0) [2022/10/16 10:24:43] [ info] [input:tail:tail.0] inotify_fs_add(): inode=142531708 watch_fd=11 name=/var/log/containers/fluent-bit-4wpl2_logging_fluent-bit-ef61bf4637f1e7fb66c939894d854ff3c097c771ea0a44ffb9b1d758691eb952.log
-
다음과 같은 에러가 나는 것을 알수 있습니다.
object mapping for [kubernetes.labels.app] tried to parse field [app] as object, but found a concrete value
-
쿠버네티스에 배포된 앱을 보면, label이 app, app.kubernetes.io와 같이 사용하고 있는데, app을 텍스트 필드로 처리하는데, app 밑에 .kubernetes.io인 label을 처리하는 opensearch와 elasticsearch에서 문제가 있는 것으로 보입니다.
-
label app을 k8s-app과 같이 바꿔거나, 아래 링크에 있는 것처럼 app_와 같이 변경하는 방법으로 해결할 수 있습니다. 매뉴얼한 변경은 쉽지 않으므로,
Replace_Dots On
을 사용하여 해결할 수 있습니다.
-
재설치
-
OpenSearch로 로그를 포워딩하기 위한 설정값을 작성합니다.
Replace_Dots On
을 추가합니다.-
앞선 테스트로 만들어진 index의 포맷과 차이로 인한 오류를 막기 위해 Prefix로 변경합니다.
- 예시)
Logstash_Prefix logstash-rd
- 예시)
-
myvalues.yaml
config: outputs: | [OUTPUT] Name es Match kube.* Host amaaaaaavsea7yia3enl6q6yrwekrd7qpi3yqaphhcvwowtmzftkt45jel7a.opensearch.ap-chuncheon-1.oci.oraclecloud.com Port 9200 tls On tls.verify Off Retry_Limit False Logstash_Format On Logstash_Prefix logstash-rd Trace_Error On Replace_Dots On [OUTPUT] Name es Match host.* Host amaaaaaavsea7yia3enl6q6yrwekrd7qpi3yqaphhcvwowtmzftkt45jel7a.opensearch.ap-chuncheon-1.oci.oraclecloud.com Port 9200 tls On tls.verify Off Retry_Limit False Logstash_Format On Logstash_Prefix logstash-rd Trace_Error On Replace_Dots On
-
-
OKE 클러스터에 FluentBit을 설치합니다.
helm upgrade --install fluent-bit fluent/fluent-bit -f myvalues.yaml -n logging
재테스트
-
테스트 앱을 다시 호출합니다.
-
테스트 Pod가 배포된 노드에 있는 fluentbit 로그를 확인합니다. 이전 처럼 에러가 발생하지 않습니다.
- 로그 확인
$ kubectl logs -f fluent-bit-zxz4w Fluent Bit v1.9.9 * Copyright (C) 2015-2022 The Fluent Bit Authors * Fluent Bit is a CNCF sub-project under the umbrella of Fluentd * https://fluentbit.io [2022/10/16 10:55:58] [ info] [fluent bit] version=1.9.9, commit=5c03b2e555, pid=1 ... [2022/10/16 10:56:57] [ info] [input:tail:tail.0] inotify_fs_add(): inode=134676887 watch_fd=10 name=/var/log/containers/fluent-bit-zxz4w_logging_fluent-bit-88634ee26035df508682e483e8f3e27f64a288b9fce37a3b61510bfc4d438181.log
OpenSearch Dashboard 설정
-
SSH 터널링을 통해 jumpbox VM으로 접속하지 않은 경우 다시 접속합니다.
-
SSH 터널링이 되어 있으므로, 로컬에서 브라우저로 OpenSearch Dashboard에 접속을 확인합니다.
- 접속주소: https://localhost:5601
-
왼쪽 상단 내비게이션 메뉴에서 OpenSearch Dashboards > Discover 를 클릭합니다.
-
Create index pattern을 클릭합니다.
-
인덱스 패턴을 생성합니다.
아래쪽에 보이는 소스 중에서 앞서 만든 index prefix로 시작하는 logstash-rd 소스를 사용합니다.
-
Index pattern name: logstash-rd-*
-
Time field: timestamp
-
-
인덱스 패턴이 추가된 결과를 볼 수 있습니다.
- labels의 app.kubernetes.io가 app_kubernetes_io로 필드명이 등록된 것을 볼 수 있습니다.
-
왼쪽 상단 내비게이션 메뉴에서 OpenSearch Dashboards > Discover 를 클릭합니다.
-
테스트 앱을 접속합니다.
-
로그 확인
아래와 같이 OpenSearch Dashboard에서 테스트 앱의 로그를 확인할 수 있습니다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.