UNCLASSIFIED - NO CUI

Elasticsearch K8s Labels bug fix

General MR

Summary

Change in logic in fluentbit template to allow elasticsearch to consume kuberenetes labels for searchability with KQL within es/kibana. This will allow users in elasticsearch who are using fluentbit to be able to search by labels attached pods.

Relevant logs/screenshots

With only fluentbit and elasticsearch installed(note being searched by app.kuberenetes.io/name: Screenshot_2026-02-03_at_7.48.02_AM

fluent-bit.conf with only fluentbit and elasticsearch enabled:

[SERVICE]
    Daemon Off
    Flush 1
    Log_Level info
    Parsers_File /fluent-bit/etc/parsers.conf
    Parsers_File /fluent-bit/etc/conf/custom_parsers.conf
    HTTP_Server On
    HTTP_Listen 0.0.0.0
    HTTP_Port 2020
    # -- Setting up storage buffer on filesystem and slightly upping backlog mem_limit value.
    storage.path /var/log/flb-storage/
    storage.sync normal
    storage.backlog.mem_limit 15M
    Health_Check On

[INPUT]
    Name tail
    Path /var/log/containers/*.log
    # -- Excluding fluentbit logs from sending to ECK, along with gatekeeper-audit logs which are shipped by clusterAuditor.
    Exclude_Path /var/log/containers/*fluent*.log
    Parser containerd
    Tag kube.*
    Mem_Buf_Limit 50MB
    Skip_Long_Lines On
    storage.type filesystem

[INPUT]
    Name systemd
    Tag host.*
    Systemd_Filter _SYSTEMD_UNIT=kubelet.service
    Read_From_Tail On
    storage.type filesystem

[FILTER]
    Name kubernetes
    Match kube.*
    Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
    Merge_Log On
    Merge_Log_Key log_processed
    K8S-Logging.Parser On
    K8S-Logging.Exclude Off
    Buffer_Size 1M
[FILTER]
    Alias         lua.add
    Name          lua
    Match         kube.*
    script        /fluent-bit/scripts/add_labels.lua
    call          add_labels

[OUTPUT]
    Name                     es
    Match                    kube.*
    Host                     logging-ek-es-http.logging
    HTTP_User                elastic
    HTTP_Passwd              ${FLUENT_ELASTICSEARCH_PASSWORD}
    Logstash_Format          On
    Suppress_Type_Name       On
    Retry_Limit              False
    Replace_Dots             On
    tls                      On
    tls.verify               On
    tls.ca_file              /etc/elasticsearch/certs/ca.crt
    storage.total_limit_size 10G
[OUTPUT]
    Name                     es
    Match                    host.*
    Host                     logging-ek-es-http.logging
    HTTP_User                elastic
    HTTP_Passwd              ${FLUENT_ELASTICSEARCH_PASSWORD}
    Logstash_Format          On
    Suppress_Type_Name       On
    Logstash_Prefix          node
    Retry_Limit              False
    tls                      On
    tls.verify               On
    tls.ca_file              /etc/elasticsearch/certs/ca.crt
    storage.total_limit_size 10G

With fluentbit, loki and elasticsearch installed: Screenshot_2026-02-03_at_7.56.52_AM

Screenshot_2026-02-03_at_7.57.13_AM

fluent-bit.conf with loki installed as well:

[SERVICE]
    Daemon Off
    Flush 1
    Log_Level info
    Parsers_File /fluent-bit/etc/parsers.conf
    Parsers_File /fluent-bit/etc/conf/custom_parsers.conf
    HTTP_Server On
    HTTP_Listen 0.0.0.0
    HTTP_Port 2020
    # -- Setting up storage buffer on filesystem and slightly upping backlog mem_limit value.
    storage.path /var/log/flb-storage/
    storage.sync normal
    storage.backlog.mem_limit 15M
    Health_Check On

[INPUT]
    Name tail
    Path /var/log/containers/*.log
    # -- Excluding fluentbit logs from sending to ECK, along with gatekeeper-audit logs which are shipped by clusterAuditor.
    Exclude_Path /var/log/containers/*fluent*.log
    Parser containerd
    Tag kube.*
    Mem_Buf_Limit 50MB
    Skip_Long_Lines On
    storage.type filesystem

[INPUT]
    Name systemd
    Tag host.*
    Systemd_Filter _SYSTEMD_UNIT=kubelet.service
    Read_From_Tail On
    storage.type filesystem

[FILTER]
    Name kubernetes
    Match kube.*
    Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
    Merge_Log On
    Merge_Log_Key log_processed
    K8S-Logging.Parser On
    K8S-Logging.Exclude Off
    Buffer_Size 1M
[FILTER]
    Alias         lua.add
    Name          lua
    Match         kube.*
    script        /fluent-bit/scripts/add_labels.lua
    call          add_labels
[FILTER]
    Name          lua
    Match         kube.*
    script        /fluent-bit/scripts/remove_labels.lua
    call          remove_labels

[OUTPUT]
    Name                     es
    Match                    kube.*
    Host                     logging-ek-es-http.logging
    HTTP_User                elastic
    HTTP_Passwd              ${FLUENT_ELASTICSEARCH_PASSWORD}
    Logstash_Format          On
    Suppress_Type_Name       On
    Retry_Limit              False
    Replace_Dots             On
    tls                      On
    tls.verify               On
    tls.ca_file              /etc/elasticsearch/certs/ca.crt
    storage.total_limit_size 10G
[OUTPUT]
    Name                     es
    Match                    host.*
    Host                     logging-ek-es-http.logging
    HTTP_User                elastic
    HTTP_Passwd              ${FLUENT_ELASTICSEARCH_PASSWORD}
    Logstash_Format          On
    Suppress_Type_Name       On
    Logstash_Prefix          node
    Retry_Limit              False
    tls                      On
    tls.verify               On
    tls.ca_file              /etc/elasticsearch/certs/ca.crt
    storage.total_limit_size 10G
[OUTPUT]
    name                   loki
    match                  kube.*
    labels                 job=fluentbit, container=$kubernetes['container_name'], pod=$kubernetes['pod_name'], namespace=$kubernetes['namespace_name'], node_name=$kubernetes['host']
    host                   logging-loki.logging
    port                   3100
    auto_kubernetes_labels on
    Retry_Limit            False
    tls                    Off
    storage.total_limit_size 10G
[OUTPUT]
    name                   loki
    match                  host.*
    labels                 job=fluentbit, container=$kubernetes['container_name'], pod=$kubernetes['pod_name'], namespace=$kubernetes['namespace_name'], node_name=$kubernetes['host']
    host                   logging-loki.logging
    port                   3100
    auto_kubernetes_labels on
    Retry_Limit            False
    tls                    Off
    storage.total_limit_size 10G

NOTE: remove_labels job only installed with Loki, because Loki is only able to accept logs with a set amount of labels.

Linked Issue

Closes (big-bang/product/packages/fluentbit#213 (closed))

Upgrade Notices

N/A

Edited by Blair Bowden

Merge request reports

Loading