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

说明:基于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 字段。
相关推荐
Insist75312 小时前
k8s--efk日志收集
云原生·容器·kubernetes
白白白白熊爱吃麦当劳13 小时前
k8s知识点汇总2
kubernetes
小猿姐1 天前
KubeBlocks for Oracle 容器化之路
云原生·oracle·容器
mosaic_born1 天前
k8s中 discovery-token和token 的区别
云原生·容器·kubernetes
小猿姐1 天前
KubeBlocks for ClickHouse 容器化之路
数据库·云原生·容器
小猿姐1 天前
KubeBlocks for MinIO 容器化之路
数据库·云原生·容器
袋子(PJ)1 天前
codecombat(Ubuntu环境详细docker部署教程)
运维·docker·容器
容器魔方1 天前
华为云云原生团队 2026 届校招正式启动
云原生·容器·云计算
人工智能训练师1 天前
部署在windows的docker中的dify知识库存储位置
linux·运维·人工智能·windows·docker·容器
落日漫游1 天前
K8s调度核心:从Pod分配到节点优化
docker·kubernetes