在K8S中,如何收集k8s集群日志?

在 Kubernetes 中,集群日志收集涉及多个层面(容器、节点、控制平面组件等),且 Kubernetes 本身未提供内置的日志聚合解决方案,需结合第三方工具实现。以下是常用的日志收集方案、核心工具及实施思路:

一、日志收集的核心对象

需收集的日志主要包括三类:

  1. 容器日志:容器内应用输出到 stdout/stderr 的日志(最常用,由 kubelet 重定向到节点本地文件)。
  2. 节点日志:节点操作系统组件(如内核、Docker/containerd、kubelet)的日志。
  3. 控制平面日志kube-apiserverkube-controller-managerkube-scheduler 等组件的日志(通常运行在容器或系统服务中)。

二、主流日志收集方案

核心思路是通过 “节点级代理” 收集本地日志,再转发到集中存储/分析系统。常见方案如下:

1. EFK/ELK 栈(功能全面,适合大规模集群)

Elasticsearch(存储)+ Fluentd/Fluent Bit(收集转发)+ Kibana(可视化) 组成,是最经典的日志方案。

  • 架构流程

    1. Fluentd/Fluent Bit:以 DaemonSet 形式部署在每个节点,负责收集:
      • 容器日志(默认路径:/var/log/pods/<pod-id>/<container-name>/*.log,由 kubelet 管理)。
      • 节点日志(如 /var/log/messages/var/log/kubelet.log)。
      • 控制平面日志(若控制平面以容器运行,日志路径同普通容器)。
    2. 数据处理:Fluentd 对日志进行解析(如提取 Pod 名称、命名空间、容器名等元数据),结构化后转发。
    3. 存储与查询:日志写入 Elasticsearch(分布式搜索引擎,支持全文检索),通过 Kibana 可视化查询、筛选、生成仪表盘。
  • 部署要点

    • Fluentd 适合日志量大、需要复杂处理的场景(但资源消耗较高);Fluent Bit 更轻量(C 语言编写),适合边缘或资源受限环境。
    • Elasticsearch 需配置持久化存储(如 PV),并考虑分片和副本以保证可用性。

2. Loki + Promtail + Grafana(轻量,适合监控场景)

由 Grafana 团队开发,专为云原生环境设计,特点是 “轻量、低成本、与 Prometheus 生态兼容”

  • 架构流程

    1. Promtail:以 DaemonSet 部署,收集节点日志(类似 Fluentd),但仅对日志做简单标签化(不全文索引),保留原始日志。
    2. Loki:日志存储系统,按标签(如 Pod 名、命名空间、节点名)索引,而非全文索引,存储成本低。
    3. Grafana:统一可视化平台,可同时展示 Loki 日志和 Prometheus 监控指标,支持日志与指标联动分析。
  • 优势

    • 资源消耗远低于 EFK(Loki 无需全文索引,存储更高效)。
    • 配置简单,与 Prometheus 部署流程相似,适合已用 Prometheus 的集群。

3. 云厂商托管方案(适合云环境,省心省力)

若集群运行在云厂商(AWS、GCP、阿里云等),可直接使用其托管日志服务:

  • AWS:CloudWatch Logs + Fluent Bit(AWS 提供的 DaemonSet 镜像,直接转发日志到 CloudWatch)。

  • GCP:Google Cloud Logging(通过 Stackdriver Logging Agent 收集日志)。

  • 阿里云:日志服务 SLS + 日志采集 DaemonSet(集成 Kubernetes 元数据解析)。

  • 特点:无需维护存储和分析组件,按需付费,但存在厂商锁定风险。

4. 其他工具

  • Logstash:与 Fluentd 类似的日志收集转发工具,常与 ELK 组合(但资源消耗较高,较少用于 K8s 环境)。
  • Vector:新兴的高性能日志收集工具(Rust 编写),支持多源输入和多目标输出,可替代 Fluentd。

三、关键配置与最佳实践

  1. 容器日志规范

    • 应用尽量将日志输出到 stdout/stderr(而非本地文件),便于 kubelet 统一管理和日志代理收集。
    • 若需输出到文件,需在 Pod 中挂载 EmptyDir 或 HostPath,并配置日志代理监控对应路径。
  2. 日志轮转

    • 配置 kubelet 自动轮转容器日志(默认开启),避免节点磁盘占满:
      # kubelet 配置(如 /var/lib/kubelet/config.yaml)
      containerLogMaxSize: 100Mi  # 单个日志文件最大 size
      containerLogMaxFiles: 5     # 保留的日志文件数
      
    • 节点级日志(如系统日志)需通过 logrotate 工具配置轮转。
  3. 元数据增强
    日志代理需提取 Kubernetes 元数据(如 pod_namenamespacenode_namelabels),便于后续按 Pod/命名空间筛选日志。例如,Fluentd 可通过 kubernetes_metadata 插件自动添加元数据。

  4. 安全与权限

    • 日志代理需运行在特权模式(或具备 hostPath 访问权限),才能读取节点上的日志文件。
    • 敏感日志(如密码)需加密传输(如 TLS)和存储(如 Elasticsearch 加密)。

四、部署示例(简化版 EFK)

以 Fluent Bit + Elasticsearch + Kibana 为例,核心步骤:

  1. 部署 Elasticsearch
    创建 StatefulSet 并挂载 PV,配置环境变量(如 discovery.type: single-node 单节点测试)。

  2. 部署 Kibana
    创建 Deployment,通过环境变量 ELASTICSEARCH_HOSTS 指向 Elasticsearch 服务。

  3. 部署 Fluent Bit
    以 DaemonSet 部署,配置 inputtail(监控 /var/log/pods 目录),filterkubernetes(添加元数据),output 为 Elasticsearch 地址。

    关键配置片段(Fluent Bit ConfigMap):

    [INPUT]
        Name              tail
        Path              /var/log/pods/*.log
        Parser            docker
        Tag               kube.*
    
    [FILTER]
        Name              kubernetes
        Match             kube.*
        Kube_URL          https://kubernetes.default.svc:443
        Kube_CA_File      /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    
    [OUTPUT]
        Name              es
        Match             *
        Host              elasticsearch-service
        Port              9200
        Index             k8s-logs
    

总结

日志收集的核心是 “节点级代理 + 集中存储 + 可视化”,方案选择需结合集群规模、资源限制和功能需求:

  • 大规模、需复杂查询 → 选 EFK;
  • 轻量、与监控联动 → 选 Loki + Grafana;
  • 云环境、减少运维 → 选云厂商托管方案。

同时需规范日志输出格式,配置轮转策略,避免日志占满节点磁盘。

posted @ 2025-08-08 09:46  天道酬勤zjh  阅读(38)  评论(0)    收藏  举报