温馨提示×

Linux系统中K8S日志如何管理

小樊
34
2025-12-26 05:17:56
栏目: 智能运维

Linux系统中K8S日志管理实战指南

一 日志来源与采集原则

  • 日志来源包括:容器标准输出/错误(stdout/stderr)、Kubernetes 组件(如 kubelet、kube-apiserver、kube-scheduler、kube-controller-manager)、节点操作系统(如 /var/log/messages)、以及业务应用的文件日志。容器运行时(如 Docker)会将容器日志写入宿主机文件,常见路径为 /var/log/containers/*.log/var/log/docker/containers/。Kubernetes 的日志期望是“集群级日志处理”,即与容器/Pod/节点生命周期解耦,便于统一采集与留存。对于系统组件,若以 systemd 运行,可用 journalctl -u kubelet 查看;组件以 Pod 运行时,使用 kubectl logs 获取。

二 采集架构与工具选型

  • 节点级日志代理(DaemonSet):在每个节点部署一个日志代理(如 Fluentd、Fluent Bit、Filebeat),挂载宿主机的 /var/log/var/log/containers/ 等目录,统一转发到后端(如 Elasticsearch、Loki)。优点是应用无侵入、运维简单;要求应用将日志输出到 stdout/stderr
  • Sidecar 模式:在业务 Pod 内新增日志采集容器(如 Filebeat/Fluentd),通过 emptyDir 共享日志目录,对容器内文件日志进行读取与转发。适合需要解析多行堆栈、做脱敏/过滤的场景,但会增加资源开销与运维复杂度。
  • 应用直推:应用直接把日志发送到远程日志服务(如通过 SDK 写入 ES/Kafka),减少代理依赖,但对应用有侵入,通常作为补充方案。
  • 常用工具与适用场景
    • EFK(Elasticsearch + Fluentd + Kibana):功能完备,适合复杂解析与检索。
    • ELK(Elasticsearch + Logstash + Kibana):解析能力强,适合重处理逻辑。
    • Elasticsearch + Filebeat + Kibana:轻量采集,资源占用低。
    • Loki + Grafana:成本低、上手快,适合容器日志快速检索与可视化。
    • Vector(Rust):高性能,适合大规模与高吞吐场景。

三 快速上手步骤

  • 节点级采集(以 Filebeat/Fluent Bit 为例)
    • 部署 Filebeat DaemonSet,采集 /var/log/containers/*.log,并注入 Kubernetes 元数据(namespace、pod、container 等),输出到 ElasticsearchLoki。示例(Filebeat 关键片段):
      filebeat.inputs:
      - type: log
        enabled: true
        paths:
          - /var/log/containers/*.log
        processors:
          - add_kubernetes_metadata:
              host: ${NODE_NAME}
              matchers:
                - logs_path:
                    logs_path: /var/log/containers/
      output.elasticsearch:
        hosts: ["http://elasticsearch:9200"]
      
    • 部署 Fluent Bit DaemonSet,使用 tail 输入插件读取容器日志,配合 kubernetes 过滤插件丰富元数据,输出到 ElasticsearchLoki。示例(Fluent Bit 关键片段):
      [INPUT]
        @type tail
        path /var/log/containers/*.log
        parser docker
        refresh_interval 10
      [FILTER]
        @type kubernetes
        kubernetes_url https://kubernetes.default.svc:443
        bearer_token_file /var/run/secrets/kubernetes.io/serviceaccount/token
        kubernetes_tag_prefix k8s
      [OUTPUT]
        @type elasticsearch
        hosts http://elasticsearch:9200
        index_name k8s-logs-%{+YYYY.MM.dd}
      
    • RBAC 与挂载:为采集器配置 ServiceAccount/ClusterRole/ClusterRoleBinding,并挂载 /var/log/var/log/containers(或容器运行时日志目录)到采集器容器。
  • Sidecar 采集(以 Filebeat 为例)
    • 业务容器将日志写入 emptyDir 共享卷,Sidecar 容器(Filebeat)读取并上报。示例(关键片段):
      spec:
        volumes:
        - name: logs
          emptyDir: {}
        containers:
        - name: app
          image: nginx:1.25
          volumeMounts:
          - name: logs
            mountPath: /var/log/nginx
        - name: filebeat
          image: docker.elastic.co/beats/filebeat:8.9
          volumeMounts:
          - name: logs
            mountPath: /var/log/nginx
          - name: filebeat-config
            mountPath: /usr/share/filebeat/filebeat.yml
            readOnly: true
      
    • 适用场景:Java 多行堆栈解析、敏感信息脱敏、按文件精细化采集。
  • 可视化与检索
    • Kibana:创建 Index Pattern(如 k8s-logs-*),使用 Discover/Visualize 进行检索与分析。
    • Grafana + Loki:通过 Explore 查询日志,结合 LogQL 做聚合与筛选。

四 存储与保留策略

  • 存储选型建议
    • Elasticsearch:全文检索能力强,适合复杂查询与关联分析,但成本较高。
    • Loki:按标签检索、成本低,适合海量容器日志的“够用型”检索。
    • ClickHouse:面向 OLAP 场景,适合做日志/事件的长期分析与报表。
    • S3/Glacier:合规归档与低成本长期留存。
  • 保留与成本控制
    • 在存储端设置 Index Lifecycle Management(ILM)Index State Management(ISM),按热/温/冷/删除阶段自动滚动与清理。
    • Loki 配置 Retention(如 7/30/90 天)与 Compactor,降低存储占用。
    • Fluentd/Filebeat 配置 缓冲与重试(如 buffer 插件、磁盘队列),避免高峰丢日志。

五 运维规范与最佳实践

  • 日志规范:应用优先输出结构化 JSON,包含 timestamp、level、trace_id、service 等关键字段,便于解析与链路追踪。
  • 多行日志:对 Java/Go panic/stacktrace 等使用多行解析器(如 multiline),避免堆栈被拆行。
  • 资源与稳定性:为采集器设置 requests/limits,启用 缓冲/重试/背压,防止 OOM 与节点抖动。
  • 节点系统日志:采集 /var/log/messagesjournald(如 systemd 组件日志),完善节点级可观测性。
  • 快速排查工具:临时定位多 Pod 日志可用 kubetailStern 聚合查看。
  • 安全合规:采集器最小权限(RBAC 仅授予必要资源),对 敏感字段脱敏 后再写入后端。

0