在 Kubernetes(K8S)集群中,日志收集是运维管理的重要环节。以下是几种常见的日志收集方案和工具,以及具体实施步骤:
K8S集群的日志主要来源于以下三个方面:
· 节点操作系统日志:宿主机的操作系统日志。
常用的日志收集工具和方案包括:
EFK Stack(Elasticsearch + Fluentd + Kibana)
:这是 Kubernetes 官方推荐的方案。Fluentd 用于日志收集和转发,Elasticsearch 用于日志存储和索引,Kibana 用于日志分析和可视化。ELK Stack(Elasticsearch + Logstash + Kibana)
:与 EFK 类似,但使用 Logstash 替代 Fluentd,适用于更复杂的日志解析场景。Elasticsearch + Filebeat + Kibana
:Filebeat 是轻量级的日志收集器,适合资源受限的环境。# DaemonSet部署模式
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-logging
spec:
template:
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1.16
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.prod.svc"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
生产经验:
每个Node部署1个实例,避免日志丢失
限制内存防止OOM(曾因内存泄漏导致节点崩溃)
使用buffer插件应对日志洪峰
# Sidecar模式对接业务容器
apiVersion: v1
kind: Pod
metadata:
name: payment-service
spec:
containers:
- name: app
image: payment:v1.2
volumeMounts:
- name: logs
mountPath: /var/log
- name: filebeat
image: docker.elastic.co/beats/filebeat:8.9
volumeMounts:
- name: logs
mountPath: /var/log
- name: filebeat-config
mountPath: /usr/share/filebeat/filebeat.yml
适用场景:
Java堆栈日志(需解析多行日志)
敏感数据过滤(如银行卡号脱敏)
# 高性能Rust实现的配置示例
[sources.k8s_logs]
type = "kubernetes_logs"
[transforms.filter]
type = "filter"
inputs = ["k8s_logs"]
condition = '''
!includes(["kube-system", "monitoring"], .pod_namespace)
'''
[sinks.elastic]
type = "elasticsearch"
inputs = ["filter"]
endpoint = "http://elastic:9200"
性能对比:
吞吐量达到Fluentd的3倍
CPU占用降低40%
适合日均TB级日志场景
以下是一个基于Filebeat、Fluent-bit、Elasticsearch
和Kibana
的日志收集架构:
Node (Operating Sys) -->
Filebeat (Container Logs) -->
Fluent-bit (Log Processing) -->
Elasticsearch (Log Storage) -->
Kibana (Log Analysis)
存储引擎 | 日志规模 | 成本 | 查询性能 | 典型场景 |
---|---|---|---|---|
Elasticsearch | 10TB+/天 | 高 | ⭐⭐⭐⭐ | 全链路追踪 |
Loki | 1-5TB/天 | 低 | ⭐⭐⭐ | 容器日志快速检索 |
ClickHouse | 50TB+/天 | 中 | ⭐⭐⭐⭐⭐ | 时序日志分析 |
S3+Glacier | 归档日志 | 极低 | ⭐ | 合规审计存储 |
选型决策树:
是否需要全文检索? → Elasticsearch
是否关注存储成本? → Loki
是否需要OLAP分析? → ClickHouse
是否合规审计要求? → S3冷存储
Filebeat 用于收集容器日志。配置文件示例:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/containers/*.log
tags:
- k8s
fields:
k8s_container_id: "{{container.id}}"
k8s_pod_name: "{{pod.name}}"
k8s_namespace: "{{pod.namespace}}"
k8s_deployment_name: "{{deployment.name}}"
output.elasticsearch:
hosts: ["localhost:9200"]
setup.kibana:
host: "localhost:5601"
Fluent-bit 用于处理和转发日志。配置文件示例:
[Input]
@type tail
Path /var/log/containers/*.log
Posix
RefreshInterval 10
[Filter]
@type kubernetes
kubernetes.logtag_prefix k8s
[Output]
@type elasticsearch
hosts ["localhost:9200"]
index_name k8s-logs-%{+YYYY.MM.dd}
flush_interval 10s
retry.on_failure true
retry.max_retries 5
retry.backoff_factor 2
Elasticsearch 用于存储日志数据。配置文件示例:
cluster.name: k8s-logs
node.name: elasticsearch
network.host: 0.0.0.0
http.port: 9200
Kibana 用于日志分析和可视化。配置文件示例:
server.host: "0.0.0.0"
server.port: 5601
elasticsearch.hosts: ["localhost:9200"]
在 Kibana 中,可以使用内置的分析工具对日志数据进行可视化分析和查询。
综上所述,可以实现 Kubernetes 集群日志的高效收集、存储和分析,从而提升运维效率和集群的可管理性。