K8s日志收集

Kubernetes日志收集终极指南:从基础到生产级实践

日志是Kubernetes集群的"黑匣子",但在生产环境中,90%的团队都会遇到日志丢失、查询卡顿、存储爆炸三大难题。本文将分享经过千节点集群验证的日志方案设计经验。


一、日志收集架构设计

日志架构图

  1. 节点级收集(DaemonSet模式)

    • 部署Fluent Bit代理到每个节点
    • 采集/var/log/containers日志
    • 适用场景:常规容器日志
  2. 应用级收集(Sidecar模式)

    • 每个Pod附带日志收集容器
    • 适用场景:特殊格式日志(如Java堆栈跟踪)
    containers:
    - name: app
      image: myapp:latest
    - name: log-sidecar
      image: fluent/fluent-bit:1.9
      volumeMounts:
      - name: logs
        mountPath: /app/logs
    
  3. 控制平面日志

    • 采集kubelet/kube-apiserver组件日志
    • 关键路径:/var/log/kube-audit.log

二、生产级工具选型

工具 内存占用 吞吐量 适用场景
Fluent Bit 20MB 边缘节点日志代理
Fluentd 200MB 日志聚合处理
Loki 极高 云原生环境日志检索
Elasticsearch 复杂分析场景

推荐组合

  • 中小集群:Fluent Bit + Loki
  • 大型集群:Fluentd + Elasticsearch

三、实战部署示例(Fluent Bit + Loki)

1. 安装Loki Stack
helm install loki grafana/loki-stack \
  --set fluent-bit.enabled=true \
  --set promtail.enabled=false \
  --namespace logging
2. 配置Fluent Bit过滤规则
# ConfigMap片段
[FILTER]
    Name parser
    Match kube.*
    Key_Name log
    Parser docker
    Reserve_Data On

[OUTPUT]
    Name loki
    Match *
    Url http://loki:3100/loki/api/v1/push
    Labels {cluster="$KUBERNETES_CLUSTER"}
3. 日志标签优化
# 自动注入Pod元数据
kubernetes:
  labels:
    app: 
    tier:
  annotations:
    log-format: regex

四、性能优化技巧

  1. 日志分级处理

    # 将ERROR日志单独存储
    [OUTPUT]
        Name es
        Match *error*
        Host elasticsearch
        Port 9200
        Index error_logs
    
  2. 多行日志处理

    [PARSER]
        Name java_multiline
        Format regex
        Regex /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}) (?<level>[^\s]+) (?<message>.*)/
        Multiline On
    
  3. 资源限制

    resources:
      limits:
        memory: 500Mi
        cpu: 500m
      requests:
        memory: 100Mi
        cpu: 100m
    

五、安全与合规实践

  1. 敏感信息过滤

    [FILTER]
        Name grep
        Match *
        Exclude $kubernetes['labels']['sensitive'] true
    
  2. 日志加密传输

    # 启用TLS
    fluent-bit -i tail -o http --tls On --tls.verify Off
    
  3. 审计日志归档

    # 每天压缩归档到S3
    aws s3 sync /var/log/kube-audit s3://mybucket/audit-logs/$(date +%Y-%m-%d) --sse AES256
    

六、典型问题排查

场景1:日志延迟高

  • 优化方向:
    1. 增加Fluentd批量发送大小
    buffer_chunk_limit 8M
    buffer_queue_limit 256
    
    1. 调整Loki分片配置
    chunk_idle_period: 1h
    max_chunk_age: 2h
    

场景2:存储空间告警

  • 解决方案:
    # 自动清理旧日志
    DELETE FROM logs WHERE timestamp < NOW() - INTERVAL '30 days'
    

场景3:日志格式混乱

  • 调试命令:
    kubectl logs fluent-bit-xxxxx -n logging | grep 'parser failed'
    

七、高阶监控配置

  1. Grafana看板示例

    # 错误率统计
    sum(rate({namespace="$namespace"} |~ "ERROR"[5m])) by (pod)
    
  2. 告警规则

    - alert: LogErrorSpike
      expr: sum(rate({level="error"}[5m])) by (app) > 10
      for: 10m
      labels:
        severity: critical
      annotations:
        summary: "应用 {{ $labels.app }} 错误日志激增"
    

结语

构建生产级日志系统需要遵循三个原则:

  1. 可观测性:5秒内定位任意Pod日志
  2. 可靠性:确保关键日志零丢失
  3. 经济性:存储成本控制在集群成本的10%以内

推荐分阶段实施:

  • 第一阶段:基础收集(覆盖所有命名空间)
  • 第二阶段:分级处理(区分业务/系统日志)
  • 第三阶段:智能分析(日志异常检测)

最后提醒:不要过度收集日志!仅采集真正影响故障排查和业务分析的关键数据,避免陷入"日志沼泽"。

posted on 2025-03-05 14:09  Leo-Yide  阅读(160)  评论(0)    收藏  举报