elk对于集群实例的日志的整合-基于filebeat+k8s采集日志

发布于:2024-06-29 ⋅ 阅读:(59) ⋅ 点赞:(0)

说明:基于filebeat采集日志

概述:

在Kubernetes环境中,Filebeat不需要和业务服务部署在同一个容器中。通常的做法是将Filebeat作为一个DaemonSet部署在集群中,这样它可以在每个节点上运行一个实例,并从所有容器中收集日志。这种方式不仅简化了日志收集的配置和管理,还提高了系统的扩展性和可靠性。

2. 业务服务部署

你的业务服务可以像往常一样部署为Deployment、StatefulSet或其他适合的Kubernetes资源。Filebeat DaemonSet会自动发现并收集这些服务生成的日志。

3. 原理解析

  • 文件挂载:Filebeat通过挂载主机的日志目录(如 /var/log/containers/var/lib/docker/containers)来访问所有容器的日志文件。
  • 自动发现:Filebeat的autodiscover功能会自动发现集群中的Pod和容器,并根据配置收集日志。
  • Kubernetes元数据add_kubernetes_metadata处理器会从Kubernetes API服务器获取Pod的元数据,并将其添加到日志中。这些元数据包括命名空间、Pod名称、容器名称、节点名称等。
  • 日志传输:Filebeat将收集到的日志发送到Logstash或Elasticsearch等日志处理系统。

4. 业务服务和Filebeat分离的好处

  • 资源隔离:业务服务和日志收集工具分开部署,可以独立管理资源,避免相互影响。
  • 简化管理:Filebeat作为DaemonSet统一管理日志收集,简化了配置和运维工作。
  • 扩展性:可以方便地对Filebeat进行独立扩展和更新,而不影响业务服务。
  • 安全性:通过分离业务服务和日志收集,可以更好地控制权限和安全策略。

实现步骤:

1. Filebeat作为DaemonSet部署

DaemonSet是一种Kubernetes资源,用于确保在集群中的每个节点上运行一个Pod。通过将Filebeat部署为DaemonSet,可以从所有节点上的所有容器中收集日志。

Filebeat DaemonSet配置示例

创建一个Filebeat的DaemonSet,使其在集群中创建的每个节点上运行,从而收集所有节点上的日志。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
        - name: filebeat
          image: docker.elastic.co/beats/filebeat:7.10.0
          volumeMounts:
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
            - name: varlog
              mountPath: /var/log
              readOnly: true
            - name: filebeat-config
              mountPath: /usr/share/filebeat/filebeat.yml
              subPath: filebeat.yml
      volumes:
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers
        - name: varlog
          hostPath:
            path: /var/log
        - name: filebeat-config
          configMap:
            name: filebeat-config

确保配置文件已存储在ConfigMap中,并在Deployment中正确挂载。

Filebeat ConfigMap配置示例

创建一个ConfigMap来存储Filebeat的配置文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: kube-system
data:
  filebeat.yml: |
    filebeat.autodiscover:
      providers:
        - type: kubernetes
          hints.enabled: true
          templates:
            - condition:
                equals:
                  kubernetes.namespace: default
              config:
                - type: container
                  paths:
                    - /var/log/containers/*-${data.kubernetes.container.id}.log
                  processors:
                    - add_kubernetes_metadata:
                        in_cluster: true

    processors:
      - add_cloud_metadata:
      - add_host_metadata:

    output.logstash:
      hosts: ["logstash:5044"]

在这个配置中:

  • autodiscover 部分定义了Filebeat如何自动发现和监控Pod。
  • providers 部分指定了Kubernetes作为自动发现的提供者。
  • templates 部分定义了在满足特定条件(如命名空间为 default)时应用的配置。
  • add_kubernetes_metadata 处理器用于将Kubernetes API中获取的元数据添加到日志事件中。这个处理器会为每条日志添加以下信息:
    • 命名空间(namespace)
    • Pod名称(pod_name)
    • 容器名称(container_name)
    • 节点名称(node_name)
    • 其他相关元数据

2. 在Logstash中处理日志

在Logstash中,可以使用不同的过滤器(如 jsonmutategrok)进一步处理日志和元数据。

例如:

input {
  beats {
    port => 5044
  }
}

filter {
  json {
    source => "message"
    remove_field => ["message"]
  }

  if [kubernetes] {
    mutate {
      add_field => {
        "namespace" => "%{[kubernetes][namespace]}"
        "pod_name" => "%{[kubernetes][pod][name]}"
        "container_name" => "%{[kubernetes][container][name]}"
        "node_name" => "%{[kubernetes][node][name]}"
      }
    }
  }

  grok {
    match => { "log" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{DATA:class} - %{GREEDYDATA:message}" }
  }

  date {
    match => [ "timestamp", "ISO8601" ]
  }

  mutate {
    rename => { "loglevel" => "severity" }
    remove_field => [ "timestamp" ]
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "logs-%{+YYYY.MM.dd}"
  }
  stdout {
    codec => rubydebug
  }
}

在这个配置中:

  • json 过滤器解析从Filebeat接收到的JSON格式的日志。
  • mutate 过滤器将Kubernetes元数据字段添加到日志中。
  • grok 过滤器解析日志内容,提取特定字段。
  • date 过滤器解析时间戳,将其转换为Logstash的 @timestamp 字段。

网站公告

今日签到

点亮在社区的每一天
去签到