본문 바로가기
DevOps

Helm으로 Fluent Bit 배포 시 커스텀 ConfigMap 설정이 적용되지 않는 이유와 해결 방법

by Rainbound-IT 2025. 7. 29.
반응형

 

 문제 상황

AWS EKS 환경에서 Fluent Bit을 Helm과 Terraform으로 배포를 helm을 통해서 fluentbit 을 설치했는데 파드의 로그가 모두 쌓였다.

이런식으로 모니터링 도구와 kubernetes의 필요하지 않은 pod의 로그 까지 쌓이게 된다.

 

특정 로그 (예: kube-proxy, aws-for-fluent-bit, prometheus) 를 제외하고자 아래와 같은 custom ConfigMap을 구성했다:

 
resource "kubernetes_config_map" "fluentbit_config" {
  metadata {
    name      = "fluentbit-custom-config"
    namespace = "logging"
  }

  data = {
    "fluent-bit.conf" = <<-EOT
      @INCLUDE inputs.conf
      @INCLUDE filters.conf
      @INCLUDE outputs.conf
    EOT

    "inputs.conf" = <<-EOT
      [INPUT]
          Name tail
          Path /var/log/containers/*.log
          Exclude_Path /var/log/containers/*aws-for-fluent-bit*.log,/var/log/containers/*kube-proxy*.log,/var/log/containers/*kube-prometheus-stack*.log
          Tag kube.*
    ...
    EOT
  }
}
그리고 Helm으로 다음과 같이 적용
resource "helm_release" "aws_fluentbit" {
  name       = "aws-for-fluent-bit"
  chart      = "aws-for-fluent-bit"
  repository = "https://aws.github.io/eks-charts"
  namespace  = "logging"

  values = [
    yamlencode({
      config = {
        existingConfigMap = "fluentbit-custom-config"
      },
      cloudWatch = {
        enabled = false
      },
      extraVolumeMounts = [
        {
          name      = "fluentbit-custom-config"
          mountPath = "/fluent-bit/etc/fluent-bit.conf"
          subPath   = "fluent-bit.conf"
        },
        {
          name      = "fluentbit-custom-config"
          mountPath = "/fluent-bit/etc/inputs.conf"
          subPath   = "inputs.conf"
        }
      ],
      extraVolumes = [
        {
          name = "fluentbit-custom-config"
          configMap = {
            name = "fluentbit-custom-config"
          }
        }
      ]
    })
  ]
}
 

그러나 배포 후에도 제외 대상 로그가 여전히 CloudWatch에 전송되고 있었고, inputs.conf 파일도 컨테이너 내부에 존재하지 않았다.


 원인 분석

원인 설명
Helm 차트가 default config를 내부적으로 생성하고 우선 적용 values.yaml에서 직접 제어하지 않는 이상 Helm이 기본 설정을 생성하여 컨테이너에 mount함
existingConfigMap만으로는 모든 설정이 반영되지 않음 fluent-bit.conf만 overwrite 되고, 참조된 inputs.conf, filters.conf, outputs.conf는 별도로 mount 하지 않으면 없음
volumeMount 경로 설정이 부족하거나 누락 Helm 차트 내 entrypoint가 직접 fluent-bit.conf를 명시하지 않아도 mount 경로가 맞지 않으면 적용되지 않음
 

✅ 해결 방법 (Helm 기반 완전 적용 예시)

Helm + Terraform 기반으로 ConfigMap 전체를 정확하게 반영하려면, 다음 항목들을 모두 구성해야 한다.

1. Helm values.yaml 예시

config:
  existingConfigMap: fluentbit-custom-config

cloudWatch:
  enabled: false

extraVolumes:
  - name: fluentbit-custom-config
    configMap:
      name: fluentbit-custom-config

extraVolumeMounts:
  - name: fluentbit-custom-config
    mountPath: /fluent-bit/etc/fluent-bit.conf
    subPath: fluent-bit.conf
  - name: fluentbit-custom-config
    mountPath: /fluent-bit/etc/inputs.conf
    subPath: inputs.conf
  - name: fluentbit-custom-config
    mountPath: /fluent-bit/etc/filters.conf
    subPath: filters.conf
  - name: fluentbit-custom-config
    mountPath: /fluent-bit/etc/outputs.conf
    subPath: outputs.conf

2. fluent-bit.conf 내용

@INCLUDE inputs.conf
@INCLUDE filters.conf
@INCLUDE outputs.conf

 대안: Helm 없이 DaemonSet 직접 구성

Helm 설정이 복잡하거나 안정적이지 않다고 느껴진다면, 아래처럼 직접 DaemonSet + ConfigMap을 구성하는 것도 좋은 선택이다:

apiVersion: apps/v1
kind: DaemonSet
...
volumeMounts:
  - name: config
    mountPath: /fluent-bit/etc/fluent-bit.conf
    subPath: fluent-bit.conf
  ...
volumes:
  - name: config
    configMap:
      name: fluentbit-custom-config

✅ 결론


 

방식 장점 단점
Helm 빠른 배포, values로 구성 가능 config override 시 제약 있음
DaemonSet 직접 구성 완전한 제어 가능, 확실하게 동작 코드량 많고 수동 관리 필요
 

 Helm을 쓰는 경우라도 완전한 config override가 필요하다면 existingConfigMap, extraVolumeMounts, extraVolumes를 함께 설정해야 한다.

 

 

 

 

 

구분 설명
existingConfigMap만 지정했음에도 Helm 차트가 자체 기본 설정을 병행 사용함 Helm Chart 내부에서 ConfigMap mount를 하긴 하지만, sidecar나 내부 default 값을 병합하거나 우선순위를 두는 경우가 있음
Helm Chart는 완전한 플러그형 config 파일 설계를 지원하지 않음 values.yaml에서 대부분을 커버할 수 있게 설계되어 있어 fluent-bit.conf, inputs.conf 등을 직접 컨트롤하려면 부가적인 volumeMount 설정 필요
Helm에서 configMap을 마운트하더라도 Fluent Bit가 읽지 않는 경로에 mount될 수 있음 예: /fluent-bit/etc 대신 다른 위치에 마운트되거나, container command에서 -c로 직접 경로를 지정하는 방식이 아닌 경우

 

 위와 같이 helm에서는 custom한 설정을 차단 하는것 같다.

custom한 설정을 원한다면 직접 설정하는수밖에 없다.

반응형

댓글