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

특정 로그 (예: 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한 설정을 원한다면 직접 설정하는수밖에 없다.
반응형
댓글