Home > Blog > tech

Kubernetes Logging คืออะไร? สอนเก็บ Log ด้วย Fluentd, Fluent Bit สำหรับ K8s 2026

Kubernetes Logging Fluentd Fluent Bit 2026
2026-04-16 | tech | 3600 words

Logging ใน Kubernetes เป็นความท้าทายพิเศษเพราะ Pod เกิดขึ้นและหายไปตลอดเวลา ถ้าไม่มีระบบเก็บ Log แบบ Centralized เมื่อ Pod ถูกลบ Log ก็หายไปด้วย Fluentd และ Fluent Bit เป็นเครื่องมือ Open-Source ยอดนิยมที่สุดสำหรับเก็บและส่ง Log จาก Kubernetes ไปยัง Backend เช่น Elasticsearch, Loki หรือ S3

Fluentd vs Fluent Bit

คุณสมบัติFluentdFluent Bit
ภาษาRuby + CC (Lightweight)
Memory~60-100 MB~1-5 MB
Plugins1,000+ Plugins70+ Built-in
ใช้เป็นLog Aggregator (กลาง)Log Collector (แต่ละ Node)
แนะนำAggregation LayerDaemonSet บนทุก Node

Architecture: Fluent Bit + Elasticsearch

# Kubernetes Logging Architecture:
#
# Pod (stdout/stderr) -> Container Runtime -> /var/log/containers/
#       |
#       v
# Fluent Bit (DaemonSet บนทุก Node)
#       |
#       v
# Fluentd (Aggregator - Optional)
#       |
#       v
# Elasticsearch / Loki / S3 / CloudWatch
#       |
#       v
# Kibana / Grafana (Dashboard)

ติดตั้ง Fluent Bit ด้วย Helm

# ติดตั้ง Fluent Bit บน Kubernetes:
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update

# ติดตั้ง:
helm install fluent-bit fluent/fluent-bit \
    --namespace logging \
    --create-namespace \
    --set config.outputs="[OUTPUT]\n    Name  es\n    Match *\n    Host  elasticsearch.logging.svc\n    Port  9200\n    Index fluent-bit\n    Type  _doc"

# ตรวจสอบ:
kubectl get pods -n logging
# fluent-bit-xxxxx   1/1  Running  (ทุก Node)

Fluent Bit Configuration

# fluent-bit.conf:
[SERVICE]
    Flush        5
    Log_Level    info
    Parsers_File parsers.conf

[INPUT]
    Name             tail
    Path             /var/log/containers/*.log
    Parser           cri
    Tag              kube.*
    Mem_Buf_Limit    5MB
    Skip_Long_Lines  On
    Refresh_Interval 10

[FILTER]
    Name                kubernetes
    Match               kube.*
    Kube_URL            https://kubernetes.default.svc:443
    Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
    Merge_Log           On
    K8S-Logging.Parser  On
    K8S-Logging.Exclude On

[OUTPUT]
    Name            es
    Match           *
    Host            elasticsearch.logging.svc
    Port            9200
    Index           k8s-logs
    Type            _doc
    Logstash_Format On
    Logstash_Prefix k8s
    Retry_Limit     5

ส่ง Log ไป Grafana Loki (Alternative)

# Fluent Bit -> Loki (แทน Elasticsearch):
# Loki เบากว่า Elasticsearch มาก!

[OUTPUT]
    Name        loki
    Match       *
    Host        loki.logging.svc
    Port        3100
    Labels      job=fluent-bit
    Auto_Kubernetes_Labels On

# ติดตั้ง Loki Stack:
helm install loki grafana/loki-stack \
    --namespace logging \
    --set grafana.enabled=true \
    --set loki.persistence.enabled=true \
    --set loki.persistence.size=50Gi

# ข้อดีของ Loki vs Elasticsearch:
# - ใช้ Storage น้อยกว่า 10x (Index แค่ Labels)
# - ตั้งค่าง่ายกว่า
# - ใช้ Grafana เป็น Dashboard (ไม่ต้อง Kibana)
# - เหมาะกับ Log Volume ปานกลาง

DaemonSet vs Sidecar Pattern

Patternข้อดีข้อเสียเหมาะกับ
DaemonSetติดตั้งครั้งเดียว ทำงานทุก Nodeไม่ Customize ต่อ Pod ได้ส่วนใหญ่ (แนะนำ)
SidecarCustomize ต่อ Pod, จัดการ Log เฉพาะ Appใช้ Resource มากขึ้น ต่อ PodApp ที่ Log ซับซ้อน

Log Parsing สำหรับ Application

# Parse JSON Logs:
[FILTER]
    Name         parser
    Match        kube.var.log.containers.myapp*
    Key_Name     log
    Parser       json
    Reserve_Data On

# Parse Custom Format:
[PARSER]
    Name        myapp
    Format      regex
    Regex       ^(?<time>[^ ]*) (?<level>[^ ]*) (?<message>.*)$
    Time_Key    time
    Time_Format %Y-%m-%dT%H:%M:%S.%L

# แนะนำ: ให้ Application Log เป็น JSON
# เพราะ Parse ง่าย, ไม่ต้อง Custom Regex

Monitoring Fluent Bit

# เปิด Prometheus Metrics:
[SERVICE]
    HTTP_Server  On
    HTTP_Listen  0.0.0.0
    HTTP_Port    2020

# Prometheus ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: fluent-bit
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: fluent-bit
  endpoints:
  - port: http
    path: /api/v1/metrics/prometheus

# Metrics สำคัญ:
# fluentbit_input_records_total     — จำนวน Records ที่รับ
# fluentbit_output_retries_total    — จำนวน Retry
# fluentbit_output_errors_total     — จำนวน Error
# fluentbit_output_proc_bytes_total — ขนาด Data ที่ส่ง

Best Practices

Practiceคำอธิบาย
ใช้ Fluent Bit เป็น DaemonSetเบา ใช้ Memory น้อย เหมาะเป็น Collector
Log เป็น JSONParse ง่าย ไม่ต้อง Custom Regex
ตั้ง Mem_Buf_Limitป้องกัน Fluent Bit ใช้ Memory มากเกินไป
ใช้ Loki สำหรับ Small-Mediumเบากว่า Elasticsearch ตั้งค่าง่ายกว่า
ตั้ง Retention Policyลบ Log เก่าอัตโนมัติ ป้องกัน Disk เต็ม
Monitor Fluent Bitใช้ Prometheus Metrics ดู Error/Retry
แยก Namespace ใน Indexง่ายในการค้นหาและจัดการ

สรุป

Centralized Logging เป็นสิ่งจำเป็นสำหรับ Kubernetes Production Fluent Bit เป็นตัวเลือกที่ดีที่สุดสำหรับ Log Collector เพราะเบา ใช้ Memory น้อย และ Integrate กับ Backend ได้หลากหลาย ไม่ว่าจะเป็น Elasticsearch/Kibana หรือ Loki/Grafana การเข้าใจ Architecture และ Best Practices จะช่วยให้คุณ Debug ปัญหาได้เร็วขึ้น และมี Visibility ครบถ้วนในทุก Pod ของ Cluster


Back to Blog | iCafe Forex | SiamLanCard | Siam2R