一、Kubernetes 日志收集核心方案
1. EFK Stack(Elasticsearch + Fluentd + Kibana)
• 适用场景:企业级日志分析、复杂查询需求、长期日志存储。
• 组件作用:
• Fluentd:日志收集器(部署为 DaemonSet,每个 Node 运行一个实例)。
• Elasticsearch:日志存储与索引(支持分布式、高并发)。
• Kibana:可视化仪表盘(日志搜索、图表展示)。
2. Loki(轻量级替代方案)
• 适用场景:中小型集群、低成本运维、简化日志存储。
• 组件作用:
• Loki:类似 Elasticsearch 的日志聚合引擎,但专注于日志存储(压缩率高)。
• Promtail:轻量级日志收集器(替代 Fluentd)。
• Grafana:集成 Loki 作为日志存储后端,复用现有监控仪表盘。
3. 其他方案
• Stackdriver:GCP 官方云服务。
• Datadog:SaaS 日志分析平台。
• Filebeat + Elasticsearch:适用于简单场景。
二、EFK Stack 配置步骤
1. 部署 EFK 组件
# 1. 安装 Fluentd(DaemonSet) kubectl apply -f https://github.com/fluent/fluentd-kubernetes-daemonset/releases/latest/fluentd-daemonset.yaml # 2. 安装 Elasticsearch kubectl apply -f https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0.yaml # 3. 安装 Kibana kubectl apply -f https://artifacts.elastic.co/downloads/kibana/kibana-7.10.0.yaml
2. 配置 Fluentd 收集日志
• 默认配置:Fluentd 会自动收集 Node 日志和容器日志。
• 自定义收集规则(例如收集特定 Pod 日志):
# 创建 ConfigMapapiVersion: v1kind: ConfigMapmetadata:name: fluentd-confignamespace: kube-systemdata:fluentd.conf: |<source>@type tailpath /var/log/containers/*.logpos_file /var/log/fluentd-containers.logtag kubernetes.*read_from_head true</source> # 自定义收集规则:收集 my-app 的日志<source>@type tailpath /var/log/pods/my-app_default_*.logpos_file /var/log/fluentd-myapp.logtag my-app.logread_from_head true</source>
# 应用配置kubectl apply -f fluentd-config.yaml # 重启 Fluentd DaemonSetkubectl delete daemonset fluentd-daemonset -n kube-systemkubectl apply -f https://github.com/fluent/fluentd-kubernetes-daemonset/releases/latest/fluentd-daemonset.yaml
三、EFK 核心配置详解
1. Fluentd 日志过滤与转发
# 示例:通过过滤器仅收集 Error 级别日志 <filter kubernetes.**>@type grepmatch => "^ERROR" </filter> <match my-app.log>@type elasticsearchhostnames elasticsearchport 9200logstash_format trueflush_interval 10s </match>
2. Elasticsearch 索引管理
# 创建索引模板(优化日志存储) PUT /_template/kubernetes-logs {"index_patterns": ["kubernetes-logs-*"],"settings": {"number_of_shards": 1,"replicas": 1},"mappings": {"properties": {"@timestamp": { "type": "date" }}} }
四、日志收集验证
1. 检查日志是否进入 Elasticsearch
# 查看 Elasticsearch 索引 curl -X GET "http://elasticsearch:9200/_cat/indices?v" # 搜索特定日志 curl -X GET "http://elasticsearch:9200/kubernetes-logs-*/_search?q=message:%22ERROR%22"
2. 在 Kibana 中配置可视化
-
访问 Kibana Web UI(通过 Service 暴露)。
-
创建 Index Pattern:选择
kubernetes-logs-*
。 -
构建仪表盘:
• 日志统计:按 Pod 名称、容器名称分组。
• 实时监控:展示错误日志趋势图。
五、EFK vs Loki 对比
维度 | EFK Stack | Loki |
---|---|---|
存储成本 | 高(Elasticsearch 需要大量磁盘) | 低(压缩率高达 10:1) |
查询性能 | 强(支持复杂 SQL-like 查询) | 较弱(专为日志设计) |
部署复杂度 | 高(需管理 3 个组件) | 低(仅需 Loki 和 Promtail) |
社区生态 | 成熟(支持丰富插件) | 快速增长(云原生友好) |
六、生产环境优化建议
1. 日志分级存储
• 短期日志(最近 7 天):存储在 Elasticsearch。
• 长期日志(超过 7 天):归档至 AWS S3 或 Azure Blob Storage。
2. 性能调优
• Elasticsearch 分片:根据集群规模设置合理分片数。
• Fluentd 缓冲区:增加 buffer_chunk_limit
和 flush_interval
避免日志丢失。
3. 安全加固
• RBAC 权限:限制 Kibana 只能访问特定 Namespace。
• TLS 加密:启用 Elasticsearch 和 Kibana 的 HTTPS 通信。
七、替代方案:Loki 部署
1. 安装 Loki
kubectl apply -f https://github.com/grafana/loki/releases/latest/deploy.yaml
2. 安装 Promtail
kubectl apply -f https://github.com/grafana/loki/releases/latest/deploy-promtail.yaml
3. 验证日志收集
# 查看 Loki 日志存储 kubectl logs -n loki -l app=loki --container=query-frontend # 在 Grafana 中添加 Loki 数据源 grafana-url: http://grafana:3000 data-source: loki
总结
• 推荐 EFK:适合需要复杂查询、企业级分析的场景。
• 推荐 Loki:适合中小型集群、注重成本和易用性的场景。
• 其他选择:云厂商日志服务(如 AWS CloudWatch、Azure Monitor)适合混合云环境。
无论选择哪种方案,建议结合 Prometheus + Alertmanager 实现日志异常的实时告警。