본문 바로가기

개발중/Kubernetes (k8s)

Spring Boot vs Fluentd vs ElasticSearch ✨

728x90
반응형

 

구성 요소

 

Spring Boot Pods

여기서 실행되는 애플리케이션 로그를 생성합니다.


DaemonSet Fluentd

Kubernetes 클러스터의 각 노드에 Fluentd를 실행하여 로그를 수집합니다. 

이는 각 노드에 자동으로 배포되어 노드에 생성된 로그를 수집하는 역할을 합니다.


로그 전송

Fluentd는 수집한 로그를 Elasticsearch로 전송합니다.


Elasticsearch

Fluentd로부터 수신한 로그 데이터를 저장하고 인덱싱하여 검색이 가능하게 만듭니다.

 


 

LogStash 와 Fluentd 중에서 Fluentd 를 선택한 이유

 

경량성

Fluentd는 Ruby와 C로 작성되어 있어 리소스 사용이 더 효율적일 수 있습니다. 

반면, Logstash는 JRuby로 작성되었고 JVM 위에서 실행되기 때문에 메모리 사용량이 더 클 수 있습니다.

플러그인 생태계

Fluentd는 강력한 플러그인 생태계를 갖추고 있어 다양한 입력(input)과 출력(output) 소스를 쉽게 통합할 수 있습니다.

이 플러그인들은 커뮤니티에 의해 활발히 개발 및 유지보수되고 있습니다.

 

커뮤니티 및 지원

Fluentd는 CNCF(Cloud Native Computing Foundation)에 속해 있어 커뮤니티 지원이 활발하며, 클라우드 네이티브 환경과의 통합에 강점을 갖고 있습니다.

 

성능

Fluentd는 멀티스레드를 지원하여 고성능 로그 데이터 처리가 가능합니다.

또한 메모리 버퍼링과 파일 기반 버퍼링을 지원하여 로그 데이터의 신뢰성을 보장합니다.

간편한 배포

Fluentd는 Kubernetes와의 통합에 최적화되어 있으며, DaemonSet으로 쉽게 배포될 수 있으며, 각 노드의 로그를 효율적으로 수집할 수 있습니다.

Logstash도 Kubernetes와 함께 사용할 수 있지만 설정과 관리가 Fluentd에 비해 복잡할 수 있습니다. 

 

유연성

Fluentd는 매우 유연하며, 로그 데이터의 필터링, 변환 및 증강과 같은 다양한 처리를 지원합니다.

 

 

최종적으로 선택은 사용자의 특정 요구사항, 환경, 선호도에 따라 달라질 수 있습니다. 

Fluentd가 리소스 사용 측면에서 더 효율적이고 클라우드 통합에 강점을 보이는 반면, Logstash는 Elastic Stack과의 긴밀한 통합과 데이터 처리 기능이 더 강력합니다.


 

Logback 설정: logback-spring.xml 파일에 로그를 표준 출력으로 전송하는 설정을 추가합니다.

 

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="info">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

 

 

Fluentd DaemonSet 생성: Kubernetes 클러스터의 모든 노드에 Fluentd를 배포하기 위해 DaemonSet을 사용합니다. 이 DaemonSet은 Fluentd 컨테이너가 클러스터의 각 노드에서 실행되도록 합니다.

 

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: fluentd
  template:
    metadata:
      labels:
        name: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:latest
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: config-volume
          mountPath: /fluentd/etc/
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: config-volume
        configMap:
          name: fluentd-config

 

 

 

Fluentd ConfigMap 생성: Fluentd 설정 파일을 포함하는 ConfigMap을 생성합니다.

 

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
  namespace: kube-system
data:
  fluent.conf: |
    <source>
      @type forward
      port 24224
      bind 0.0.0.0
    </source>

    <filter **>
      @type kubernetes_metadata
    </filter>

    <match **>
      @type elasticsearch
      host "elasticsearch-hostname"  # Elasticsearch 호스트 이름을 여기에 적으세요.
      port 9200                      # Elasticsearch 포트 번호
      logstash_format true           # Logstash 형식 사용
      logstash_prefix "logstash"     # 인덱스 이름 접두사
      include_tag_key true
      type_name "access_log"
      flush_interval 10s             # 로그 전송 간격
      buffer_type memory
      buffer_chunk_limit 2M
      buffer_queue_limit 8
      retry_limit 10
      retry_wait 30s
    </match>

 

 

Kubernetes Deployment: Spring Boot 애플리케이션을 Kubernetes Deployment로 배포합니다.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-spring-boot-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-spring-boot-app
  template:
    metadata:
      labels:
        app: my-spring-boot-app
    spec:
      containers:
      - name: my-spring-boot-app
        image: my-spring-boot-app:latest
        ports:
        - containerPort: 8080

 

 

728x90
반응형