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에서 테스트 앱의 로그를 확인할 수 있습니다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.