在K8S中,如何收集k8s集群日志?
在 Kubernetes 中,集群日志收集涉及多个层面(容器、节点、控制平面组件等),且 Kubernetes 本身未提供内置的日志聚合解决方案,需结合第三方工具实现。以下是常用的日志收集方案、核心工具及实施思路:
一、日志收集的核心对象
需收集的日志主要包括三类:
- 容器日志:容器内应用输出到
stdout
/stderr
的日志(最常用,由 kubelet 重定向到节点本地文件)。 - 节点日志:节点操作系统组件(如内核、Docker/containerd、kubelet)的日志。
- 控制平面日志:
kube-apiserver
、kube-controller-manager
、kube-scheduler
等组件的日志(通常运行在容器或系统服务中)。
二、主流日志收集方案
核心思路是通过 “节点级代理” 收集本地日志,再转发到集中存储/分析系统。常见方案如下:
1. EFK/ELK 栈(功能全面,适合大规模集群)
由 Elasticsearch(存储)+ Fluentd/Fluent Bit(收集转发)+ Kibana(可视化) 组成,是最经典的日志方案。
-
架构流程:
- Fluentd/Fluent Bit:以 DaemonSet 形式部署在每个节点,负责收集:
- 容器日志(默认路径:
/var/log/pods/<pod-id>/<container-name>/*.log
,由 kubelet 管理)。 - 节点日志(如
/var/log/messages
、/var/log/kubelet.log
)。 - 控制平面日志(若控制平面以容器运行,日志路径同普通容器)。
- 容器日志(默认路径:
- 数据处理:Fluentd 对日志进行解析(如提取 Pod 名称、命名空间、容器名等元数据),结构化后转发。
- 存储与查询:日志写入 Elasticsearch(分布式搜索引擎,支持全文检索),通过 Kibana 可视化查询、筛选、生成仪表盘。
- Fluentd/Fluent Bit:以 DaemonSet 形式部署在每个节点,负责收集:
-
部署要点:
- Fluentd 适合日志量大、需要复杂处理的场景(但资源消耗较高);Fluent Bit 更轻量(C 语言编写),适合边缘或资源受限环境。
- Elasticsearch 需配置持久化存储(如 PV),并考虑分片和副本以保证可用性。
2. Loki + Promtail + Grafana(轻量,适合监控场景)
由 Grafana 团队开发,专为云原生环境设计,特点是 “轻量、低成本、与 Prometheus 生态兼容”。
-
架构流程:
- Promtail:以 DaemonSet 部署,收集节点日志(类似 Fluentd),但仅对日志做简单标签化(不全文索引),保留原始日志。
- Loki:日志存储系统,按标签(如 Pod 名、命名空间、节点名)索引,而非全文索引,存储成本低。
- 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。
三、关键配置与最佳实践
-
容器日志规范:
- 应用尽量将日志输出到
stdout
/stderr
(而非本地文件),便于 kubelet 统一管理和日志代理收集。 - 若需输出到文件,需在 Pod 中挂载 EmptyDir 或 HostPath,并配置日志代理监控对应路径。
- 应用尽量将日志输出到
-
日志轮转:
- 配置 kubelet 自动轮转容器日志(默认开启),避免节点磁盘占满:
# kubelet 配置(如 /var/lib/kubelet/config.yaml) containerLogMaxSize: 100Mi # 单个日志文件最大 size containerLogMaxFiles: 5 # 保留的日志文件数
- 节点级日志(如系统日志)需通过
logrotate
工具配置轮转。
- 配置 kubelet 自动轮转容器日志(默认开启),避免节点磁盘占满:
-
元数据增强:
日志代理需提取 Kubernetes 元数据(如pod_name
、namespace
、node_name
、labels
),便于后续按 Pod/命名空间筛选日志。例如,Fluentd 可通过kubernetes_metadata
插件自动添加元数据。 -
安全与权限:
- 日志代理需运行在特权模式(或具备
hostPath
访问权限),才能读取节点上的日志文件。 - 敏感日志(如密码)需加密传输(如 TLS)和存储(如 Elasticsearch 加密)。
- 日志代理需运行在特权模式(或具备
四、部署示例(简化版 EFK)
以 Fluent Bit + Elasticsearch + Kibana 为例,核心步骤:
-
部署 Elasticsearch:
创建 StatefulSet 并挂载 PV,配置环境变量(如discovery.type: single-node
单节点测试)。 -
部署 Kibana:
创建 Deployment,通过环境变量ELASTICSEARCH_HOSTS
指向 Elasticsearch 服务。 -
部署 Fluent Bit:
以 DaemonSet 部署,配置input
为tail
(监控/var/log/pods
目录),filter
为kubernetes
(添加元数据),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;
- 云环境、减少运维 → 选云厂商托管方案。
同时需规范日志输出格式,配置轮转策略,避免日志占满节点磁盘。