ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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_HOSTFLUENT_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와 같은 도구와의 연동을 통해 시스템 상태를 시각적으로 모니터링하는 데 매우 유용한 도구입니다. 이를 통해 클러스터 내에서 발생하는 모든 이벤트를 추적하고 관리할 수 있습니다.

     

Designed by Tistory.