目录

如何收集-Kubernetes-集群的日志

如何收集 Kubernetes 集群的日志

一、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 日志):

  # 创建 ConfigMap
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: fluentd-config
    namespace: kube-system
  data:
    fluentd.conf: |
      <source>
        @type tail
        path /var/log/containers/*.log
        pos_file /var/log/fluentd-containers.log
        tag kubernetes.*
        read_from_head true
      </source>
​
      # 自定义收集规则:收集 my-app 的日志
      <source>
        @type tail
        path /var/log/pods/my-app_default_*.log
        pos_file /var/log/fluentd-myapp.log
        tag my-app.log
        read_from_head true
      </source>
  # 应用配置
  kubectl apply -f fluentd-config.yaml
​
  # 重启 Fluentd DaemonSet
  kubectl delete daemonset fluentd-daemonset -n kube-system
  kubectl apply -f https://github.com/fluent/fluentd-kubernetes-daemonset/releases/latest/fluentd-daemonset.yaml

三、EFK 核心配置详解

1. Fluentd 日志过滤与转发
# 示例:通过过滤器仅收集 Error 级别日志
<filter kubernetes.**>
  @type grep
  match => "^ERROR"
</filter>
​
<match my-app.log>
  @type elasticsearch
  hostnames elasticsearch
  port 9200
  logstash_format true
  flush_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 中配置可视化
  1. 访问 Kibana Web UI(通过 Service 暴露)。
  2. 创建 Index Pattern:选择 kubernetes-logs-*
  3. 构建仪表盘:

• 日志统计:按 Pod 名称、容器名称分组。

• 实时监控:展示错误日志趋势图。


五、EFK vs Loki 对比

维度EFK StackLoki
存储成本高(Elasticsearch 需要大量磁盘)低(压缩率高达 10:1)
查询性能强(支持复杂 SQL-like 查询)较弱(专为日志设计)
部署复杂度高(需管理 3 个组件)低(仅需 Loki 和 Promtail)
社区生态成熟(支持丰富插件)快速增长(云原生友好)

六、生产环境优化建议

1. 日志分级存储

短期日志 (最近 7 天):存储在 Elasticsearch。

长期日志 (超过 7 天):归档至 AWS S3 或 Azure Blob Storage。

2. 性能调优

Elasticsearch 分片 :根据集群规模设置合理分片数。

Fluentd 缓冲区 :增加 buffer_chunk_limitflush_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 实现日志异常的实时告警。