1.5.2.4.1 EFK(Elasticsearch, Fluentd, Kibana)
오픈 소스로 쿠버네티스 로그 모니터링을 하는 데 가장 많이 사용되는 구성으로 다음 세가지 구성을 확인해 봅니다.
- Elasticsearch: 수집저장된 로그를 검색 및 분석하는 역할 수행
- Fluentd 또는 Fluent Bit: 쿠버네티스 클러스터에서 로그를 수집하는 역할을 수행
- Kibana: 로그를 쿼리하고, 시각화 해주는 역할 수행
여기서는 Fluent Bit를 사용하는 예시입니다.
Elastic Search + Kibana 설치
-
설치용 namespace를 만듭니다.
kubectl create ns logging
-
Helm Chart를 통해 설치하기 위해 저장소를 등록합니다. 본 예제에서는 Bitnami Helm Chart 저장소를 사용합니다.
helm repo add bitnami https://charts.bitnami.com/bitnami
-
설정값 정의
Helm Chart를 설치시 설정가능한 파라미터 목록을 참고하여 변경하고자 하는 값을 입력합니다.
-
https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch/#parameters
-
예시
- elasticsearch 내장 kibana를 함께 설치
- kibana 접근 URL을 nginx ingress controller, letsencrypt를 통한 인증서 사용하는 예시
- 이전 실습 1.2.2.2.2.2 NGINX Ingress Controller에서 TLS termination(feats. Let’s Encrypt) 설치 기준에서 설치하는 예시임
global: kibanaEnabled: true kibana: ingress: enabled: true hostname: kibana.ingress.thekoguryo.xyz annotations: cert-manager.io/cluster-issuer: letsencrypt-staging tls: true ingressClassName: nginx
-
-
elasticsearch helm chart 설치
helm install elasticsearch -f values.yaml bitnami/elasticsearch --version 19.9.5 -n logging
-
설치
아래와 같이 설치되며, 실제 컨테이너가 기동하는 데 까지 약간의 시간이 걸립니다.
$ helm install elasticsearch -f values.yaml bitnami/elasticsearch --version 19.9.5 -n logging NAME: elasticsearch LAST DEPLOYED: Wed Jul 5 01:59:09 2023 NAMESPACE: logging STATUS: deployed ... Elasticsearch can be accessed within the cluster on port 9200 at elasticsearch.logging.svc.cluster.local To access from outside the cluster execute the following commands: kubectl port-forward --namespace logging svc/elasticsearch 9200:9200 & curl http://127.0.0.1:9200/
-
설치된 elastic search 내부 주소와 포트를 확인합니다. 이후 Fluentd에서 로그 전송을 위해 사용할 주소입니다.
- 주소: elasticsearch.logging.svc.cluster.local
- 포트: 9200
-
Pod가 모두 기동할때 까지 기다립니다.
kubectl get pod -n logging --watch
Fluent Bit 구성
-
FluentBit Helm Chart 저장소를 추가합니다.
helm repo add fluent https://fluent.github.io/helm-charts
-
ElasticSearch로 로그를 포워딩하기 위한 설정값을 작성합니다.
-
Replace_Dots On: 다음과 같이 labels의 key에 app.kubernetes.io와 같이 *.*이 포함된 경우 ElasticSearch 전송시 오류가 발생합니다. 이를 방지하기 위해 추가합니다.
apiVersion: v1 kind: Pod metadata: ... labels: ... app.kubernetes.io/name: storefront ...
-
Suppress_Type_Name On: ElasticSearch 8에서 _type 관련 오류가 발생하는 것을 방지하기 위해 추가합니다.
cat <<EOF > myvalues.yaml config: outputs: | [OUTPUT] Name es Match * Host elasticsearch.logging.svc.cluster.local Port 9200 tls Off tls.verify Off Retry_Limit False Logstash_Format On Logstash_Prefix logstash Trace_Error On Replace_Dots On Suppress_Type_Name On EOF
-
-
OKE 클러스터에 FluentBit을 설치합니다.
helm upgrade --install fluent-bit fluent/fluent-bit -f myvalues.yaml -n logging
Kibana 설정
-
설치한 kibana을 웹 브라우저로 접속합니다. ingress로 지정한 주소로 접속합니다.
-
Welcome to Elastic 화면이 나오면 Explore on my own을 클릭하여 홈으로 이동합니다.
-
왼쪽 상단 내비게이션 메뉴에서 Analytics > Discover 를 클릭합니다.
-
인덱스 패턴을 만들기 위해 Create data view를 클릭합니다.
-
인덱스 패턴을 생성합니다.
오른쪽에서 보듯이 Fluent Bit에서 전송된 로그는 logstash-로 시작합니다.
-
Name: logstash-*
-
Index pattern: logstash-*
-
Timestamp field: @timestamp
-
-
데이타 뷰가 추가된 결과를 볼 수 있습니다.
-
왼쪽 상단 내비게이션 메뉴에서 Analytics > Discover 를 클릭합니다.
-
생성한 인덱스 패턴을 통해 수집된 로그를 확인할 수 있습니다.
- 테스트 앱의 로그를 확인하기 위해 Add filter를 클릭하여 namespace_name=default 로 지정합니다.
-
테스트 앱을 접속합니다.
-
로그 확인
아래와 같이 kibana에서 테스트 앱의 로그를 확인할 수 있습니다.
-
EFK를 통해 OKE 상의 로그를 수집하는 예시였습니다. EFK에 대한 상세 내용은 제품 관련 홈페이지와 커뮤니티 사이트를 참고하기 바랍니다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.