-
EFK를 이용한 Kubernetes 클러스터에서 백엔드 로그 수집하기프로젝트 2024. 12. 3. 10:11
Kubernetes에서 애플리케이션의 로그를 수집하는 것은 장애를 추적하고, 시스템 상태를 모니터링하며, 서비스 품질을 유지하기 위해 매우 중요한 작업입니다. 이 글에서는 Fluentd를 사용해 클러스터 내부의 백엔드 서버에서 로그를 수집하는 방법을 자세히 살펴보겠습니다. Fluentd는 로그 데이터의 중앙 집중화와 유연한 출력 옵션 덕분에 Kubernetes 환경에서 널리 사용됩니다. Fluentd를 Elasticsearch와 연동하여 로그를 저장하고 분석할 수 있는 환경을 구성하는 과정을 다룹니다.
1. Fluentd란?
Fluentd는 오픈 소스 데이터 수집기(data collector)로, 로그 데이터를 다양한 형식으로 중앙집중화하는 데 사용됩니다. 여러 종류의 로그 소스를 수집하고 이를 원하는 포맷으로 가공하여 여러 목적지로 전달할 수 있습니다. 특히 Kubernetes 클러스터에서 컨테이너 로그를 수집하여 Elasticsearch나 다른 분석 플랫폼으로 보낼 때 유용합니다.
이번 블로그 글에서는 Kubernetes에서 Fluentd를 DaemonSet으로 배포하고, 모든 노드의 로그를 수집한 뒤 이를 Elasticsearch로 전송하여 저장하는 과정을 설명합니다.
2. Fluentd 설정 파일 분석
DaemonSet 설정 파일 (fluentd-daemonset.yaml)
apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd namespace: kube-system labels: k8s-app: fluentd-logging version: v1 kubernetes.io/cluster-service: "true" spec: selector: matchLabels: k8s-app: fluentd-logging template: metadata: labels: k8s-app: fluentd-logging version: v1 kubernetes.io/cluster-service: "true" spec: serviceAccount: fluentd serviceAccountName: fluentd tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd image: fluent/fluentd-kubernetes-daemonset:v1.16-debian-elasticsearch7-amd64-2 env: - name: TZ value: Asia/Seoul - name: FLUENT_ELASTICSEARCH_HOST value: "{Elasticsearch의 IP주소}" - name: FLUENT_ELASTICSEARCH_PORT value: "9200" - name: FLUENT_ELASTICSEARCH_SCHEME value: "http" - name: FLUENTD_SYSTEMD_CONF value: disable - name: FLUENT_CONTAINER_TAIL_EXCLUDE_PATH value: /var/log/containers/fluent* - name: FLUENT_CONTAINER_TAIL_PARSER_TYPE value: /^(?<time>.+) (?<stream>stdout|stderr)( (?<logtag>.))? (?<log>.*)$/ resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: dockercontainerlogdirectory mountPath: /var/log/pods readOnly: true - name: config mountPath: /fluentd/etc/conf.d terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log - name: dockercontainerlogdirectory hostPath: path: /var/log/pods - name: config configMap: name: fluentd-config
fluentd-daemonset.yaml 파일은 Fluentd를 DaemonSet으로 배포합니다. 이렇게 하면 클러스터의 모든 노드에 Fluentd가 배포되어 각 노드에서 로그를 수집하게 됩니다.
여기서는 다음과 같은 중요한 설정들을 확인할 수 있습니다:
- ServiceAccount: Fluentd가 로그를 수집하기 위해 serviceAccount를 사용합니다.
- 환경 변수 설정: FLUENT_ELASTICSEARCH_HOST와 FLUENT_ELASTICSEARCH_PORT 등의 환경 변수를 통해 Elasticsearch 서버의 IP 주소와 포트를 설정합니다. 이 정보는 Fluentd가 로그를 Elasticsearch로 보낼 때 사용됩니다.
- VolumeMounts: 노드의 /var/log와 /var/log/pods 디렉터리를 Fluentd 컨테이너에 마운트하여, 각 노드의 모든 로그 파일에 접근할 수 있게 합니다.
Fluentd ConfigMap 설정 파일 (fluentd-config.yaml)
apiVersion: v1 kind: ConfigMap metadata: name: fluentd-config namespace: kube-system data: fluent.conf: | <filter kubernetes.var.log.containers.**> @type parser <parse> @type json json_parser json </parse> replace_invalid_sequence true emit_invalid_record_to_error false key_name log reserve_data true retry_count 3 retry_limit 3 </filter> <match kubernetes.var.log.containers.**spring-app**> @type elasticsearch host "{Elasticsearch의 IP주소}" port 9200 scheme "http" logstash_format true logstash_prefix weer include_tag_key true tag_key @log_name flush_interval 5s </match>
fluentd-config.yaml 파일은 Fluentd의 설정을 포함하고 있으며, ConfigMap으로 정의되었습니다. 여기서 중요한 설정은 다음과 같습니다:
- Parser 필터: 로그 파일에서 JSON 형식을 파싱하여 로그를 처리합니다. 이 설정을 통해 컨테이너 로그가 JSON 형식으로 Fluentd에 의해 분석됩니다.
- Elasticsearch로 로그 전송: spring-app이라는 특정 애플리케이션의 로그를 Elasticsearch로 전송합니다. 로그는 logstash_format 형식을 따르며, weer라는 접두어를 사용하여 Elasticsearch에 저장됩니다.
- Flush Interval: 로그가 전송되는 주기를 5초로 설정하여 실시간에 가까운 로그 수집을 구현합니다.
3. Fluentd와 Elasticsearch 연동하기
이 설정에서 Fluentd는 수집한 로그를 {Elasticsearch의 IP주소}:9200에 위치한 Elasticsearch 인스턴스로 전송합니다. Elasticsearch는 로그 데이터를 저장하고 이를 Kibana 등의 도구를 통해 시각화할 수 있게 합니다. 이렇게 구성하면 애플리케이션 로그를 중앙 집중화하고 실시간 모니터링 및 분석이 가능해집니다.
- Elasticsearch 설정: DaemonSet과 ConfigMap에서 정의된 FLUENT_ELASTICSEARCH_HOST, FLUENT_ELASTICSEARCH_PORT를 통해 Fluentd가 Elasticsearch로 로그를 전송할 수 있도록 설정합니다.
- 로그의 적절한 저장 및 분석: 이 설정을 통해 백엔드 서버에서 발생하는 모든 로그가 한 곳에 수집되어 효율적인 분석이 가능합니다. 이는 문제 발생 시 빠르게 원인을 파악하고 대응하는 데 유리합니다.
4. 결론
이번 글에서는 Kubernetes 클러스터 내부에서 Fluentd를 사용하여 백엔드 서버의 로그를 수집하는 방법을 설명했습니다. Fluentd를 DaemonSet으로 배포하여 각 노드의 모든 로그를 수집하고, 이를 Elasticsearch로 전송하여 중앙 집중화된 로그 관리 시스템을 구축했습니다. 이러한 시스템을 통해 로그를 효율적으로 관리하고 문제를 빠르게 분석할 수 있는 환경을 만들 수 있습니다.
Fluentd와 같은 로그 수집기는 복잡한 Kubernetes 환경에서의 로그 수집을 단순화하고, Elasticsearch와 같은 도구와의 연동을 통해 시스템 상태를 시각적으로 모니터링하는 데 매우 유용한 도구입니다. 이를 통해 클러스터 내에서 발생하는 모든 이벤트를 추적하고 관리할 수 있습니다.
'프로젝트' 카테고리의 다른 글
Mockito 테스트에서 @Value 주입 문제 해결하기: ReflectionTestUtils 사용기 (0) 2024.12.03 비동기 처리로 90% 이상의 성능 향상하기 (0) 2024.12.03 [Spring AI] 생성형 AI의 비용, 성능 최적화 (0) 2024.09.03 초보자 안내 서비스 : Vector Databases 선정 (0) 2024.06.27 초보자 안내 서비스 : PDF를 통해 데이터 저장 (0) 2024.06.25