K8S部署ELK(一):部署Filebeat日志收集器

发布于:2025-08-03 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

1. ELK简介

1.1 ELK 的组成

1.2 核心功能

1.3 常见应用场景

1.4 扩展与变体

1.5 工作原理示例

1.6 优势与挑战

1.7 架构图

2. Filebeat 简介

2.1 核心功能

2.2 主要特点

2.3 工作原理

2.4 典型应用场景

2.5 与Logstash的比较

3. K8S部署Filebeat

3.1 创建Namespace

3.2 创建ServiceAccount

3.3 创建RBAC

3.4 创建ConfigMap

3.5 创建Deamonset

3.6 部署所有资源

3.7 检查Filebeat Pod状态


1. ELK简介

ELK 是一个开源的日志管理平台组合,由三个核心组件组成,用于高效地收集、存储、搜索和可视化日志数据。以下是详细介绍:


1.1 ELK 的组成

  • E: Elasticsearch

    • 功能:分布式搜索和分析引擎,负责存储和索引数据,提供近实时的搜索能力。

    • 特点:高扩展性、支持全文检索、RESTful API。

  • L: Logstash

    • 功能:数据采集和处理管道,负责从多种来源(如文件、数据库、消息队列)收集日志,进行过滤、解析和转换后发送到 Elasticsearch。

    • 特点:支持多种输入/输出插件(如 Kafka、MySQL)、强大的数据解析(如正则、Grok)。

  • K: Kibana

    • 功能:数据可视化工具,通过图表、仪表盘展示 Elasticsearch 中的数据,支持日志分析和监控。

    • 特点:交互式图表、自定义仪表盘、支持地理数据等。


1.2 核心功能

  • 集中式日志管理:统一收集分散的日志(如服务器、应用、网络设备)。

  • 实时搜索与分析:快速检索日志,支持复杂查询(如错误追踪、性能分析)。

  • 可视化监控:通过仪表盘实时监控系统状态(如流量、错误率)。

  • 告警功能:结合 Elasticsearch 的 Alerting 或第三方工具(如 ElastAlert)设置阈值告警。


1.3 常见应用场景

  • 运维故障排查:快速定位服务器或应用错误。

  • 安全分析:检测异常行为(如频繁登录失败)。

  • 业务分析:分析用户行为日志(如点击流、API 调用)。

  • 合规审计:长期存储日志以满足合规要求。


1.4 扩展与变体

  • Elastic Stack:ELK 的官方名称,现包含更多组件如:

    • Beats:轻量级数据采集器(如 Filebeat 收集日志,Metricbeat 收集指标)。

    • X-Pack:提供安全、监控、告警等企业级功能(需付费)。

  • 替代方案

    • Grafana Loki:轻量级日志系统,侧重存储效率。

    • Splunk:商业日志分析工具,功能强大但成本高。


1.5 工作原理示例

  1. 数据流应用日志Filebeat(采集) → Logstash(解析) → Elasticsearch(存储) → Kibana(展示)。

  2. 典型配置

    • 使用 Filebeat 替代 Logstash 采集日志,降低资源消耗。

    • 使用 Index Lifecycle Management (ILM) 自动管理日志保留策略。


1.6 优势与挑战

  • 优势:开源免费、社区活跃、横向扩展能力强。

  • 挑战:大规模部署时需优化性能(如分片策略、集群调优),存储成本可能较高。

1.7 架构图

传统架构

云原生架构

2. Filebeat 简介

Filebeat 是 Elastic Stack(ELK)中的一个轻量级日志数据收集器,属于 Beats 数据采集器家族的一员,专门用于高效、可靠地转发和集中日志文件。

2.1 核心功能

  1. 日志收集

    • 监控指定的日志文件或目录

    • 支持多种日志格式(如文本、JSON、Syslog等)

    • 自动处理日志轮转(log rotation)

  2. 日志转发

    • 将收集的日志发送到 Elasticsearch、Logstash、Kafka、Redis 等多种目的地

    • 支持负载均衡和故障转移

  3. 轻量高效

    • 占用资源极少(Go语言编写)

    • 没有依赖项,部署简单

2.2 主要特点

  • 模块化设计:预置了常见应用(如Nginx、MySQL、Apache等)的日志解析模块

  • 可靠性保证:使用注册表文件记录文件读取位置,确保至少一次交付

  • 资源友好:CPU和内存占用低,适合在生产环境中大量部署

  • 支持压缩和加密:数据传输可配置SSL/TLS加密

2.3 工作原理

  1. Prospector(探测者):

    • 监控配置的日志文件路径

    • 检测新文件和文件变化

  2. Harvester(收割者):

    • 逐行读取文件内容

    • 将内容发送到输出目标

    • 记录每个文件的读取位置

  3. Registry(注册表):

    • 记录每个文件的状态和读取位置

    • 确保重启后能从正确位置继续读取

2.4 典型应用场景

  1. 集中式日志管理

    服务器日志 → Filebeat → Logstash/Elasticsearch → Kibana
  1. 分布式系统监控

    在每台服务器上部署Filebeat,统一收集所有节点的日志

  1. 安全审计

    • 收集系统安全日志(如SSH登录记录)

    • 发送到SIEM系统进行分析

2.5 与Logstash的比较

特性 Filebeat Logstash
资源占用 非常低 较高
功能 仅收集和转发 丰富处理
部署 简单 较复杂
适用场景 大规模日志收集 复杂ETL

Filebeat通常与Logstash配合使用:Filebeat负责收集和传输,Logstash负责复杂的日志处理和转换。

3. K8S部署Filebeat

3.1 创建Namespace

kubectl create namespace elk

3.2 创建ServiceAccount

vim filebeat-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: filebeat
  namespace: elk
  labels:
    k8s-app: filebeat

3.3 创建RBAC

vim filebeat-rbac.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: filebeat
subjects:
- kind: ServiceAccount
  name: filebeat
  namespace: elk
roleRef:
  kind: ClusterRole
  name: filebeat
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: filebeat
  namespace: elk
subjects:
  - kind: ServiceAccount
    name: filebeat
    namespace: elk
roleRef:
  kind: Role
  name: filebeat
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: filebeat-kubeadm-config
  namespace: elk
subjects:
  - kind: ServiceAccount
    name: filebeat
    namespace: elk
roleRef:
  kind: Role
  name: filebeat-kubeadm-config
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: filebeat
  labels:
    k8s-app: filebeat
rules:
- apiGroups: [""]
  resources:
  - namespaces
  - pods
  - nodes
  verbs:
  - get
  - watch
  - list
- apiGroups: ["apps"]
  resources:
    - replicasets
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: filebeat
  namespace: elk
  labels:
    k8s-app: filebeat
rules:
  - apiGroups:
      - coordination.k8s.io
    resources:
      - leases
    verbs: ["get", "create", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: filebeat-kubeadm-config
  namespace: elk
  labels:
    k8s-app: filebeat
rules:
  - apiGroups: [""]
    resources:
      - configmaps
    resourceNames:
      - kubeadm-config
    verbs: ["get"]

3.4 创建ConfigMap

vim filebeat-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: elk
  labels:
    k8s-app: filebeat
data:
  filebeat.yml: |-
    filebeat.inputs:
    - type: container
      paths:
        - /var/log/containers/*.log  #采集容器日志
      fields: 
        project: "k8s-outlog"  #打上自定义标签,便于后续识别用途和来源
        logtype: "k8s-outlog"
      multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
      multiline.negate: false
      multiline.match: after
      processors:
        - add_kubernetes_metadata:
            host: ${NODE_NAME}
            matchers:
            - logs_path:
                logs_path: "/var/log/containers/"
​
    - type: log
      paths:
        - /var/log/messages  #采集系统日志
      fields: 
        project: "k8s-messagelog"
        logtype: "k8s-messagelog"
      processors:
        - add_fields:
            when:
              regexp:
                message: ".* kubelet.*: .*"  #处理器,使用正则匹配
            fields:
              component: "kubelet"
​
    processors:
      - add_host_metadata:
​
    output.kafka:  #设置kafka作为输出目标
      hosts: ["kafka-0.kafka-headless.elk.svc.cluster.local:9092"]  #kafka的service地址
      topic: 'k8s-outlog'  #写入kafka的topic中
      sasl.mechanism: "SCRAM-SHA-256"
      partition.round_robin: 
        reachable_only: true 
      required_acks: 1
      max_message_bytes: 10000000

3.5 创建Deamonset

vim filebeat-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: elk
  labels:
    k8s-app: filebeat
spec:
  selector:
    matchLabels:
      k8s-app: filebeat
  template:
    metadata:
      labels:
        k8s-app: filebeat
    spec:
      serviceAccountName: filebeat
      terminationGracePeriodSeconds: 30
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: filebeat
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/docker.elastic.co/beats/filebeat:7.17.2
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        securityContext:
          runAsUser: 0
        resources:
          limits:
            cpu: 500m
            memory: 500Mi
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: config
          mountPath: /etc/filebeat.yml
          readOnly: true
          subPath: filebeat.yml
        - name: data
          mountPath: /usr/share/filebeat/data
        - name: varlibdockercontainers
          mountPath: /data/docker/containers
          readOnly: true
        - name: varlog
          mountPath: /var/log
          readOnly: true
        - name: tz-config
          mountPath: /etc/localtime
          readOnly: true
      volumes:
      - name: config
        configMap:
          defaultMode: 0640
          name: filebeat-config
      - name: varlibdockercontainers
        hostPath:
          path: /data/docker/containers
      - name: varlog
        hostPath:
          path: /var/log
      - name: data
        hostPath:
          path: /var/lib/filebeat-data
          type: DirectoryOrCreate
      - name: tz-config
        hostPath:
          path: /etc/localtime

3.6 部署所有资源

[root@master1 Filebeat]# ls
filebeat-configmap.yaml  filebeat-rbac.yaml
filebeat-daemonset.yaml  filebeat-serviceaccount.yaml
[root@master1 Filebeat]# kubectl apply  -f ./
configmap/filebeat-config created
daemonset.apps/filebeat created
clusterrolebinding.rbac.authorization.k8s.io/filebeat created
rolebinding.rbac.authorization.k8s.io/filebeat created
rolebinding.rbac.authorization.k8s.io/filebeat-kubeadm-config created
clusterrole.rbac.authorization.k8s.io/filebeat created
role.rbac.authorization.k8s.io/filebeat created
role.rbac.authorization.k8s.io/filebeat-kubeadm-config created
serviceaccount/filebeat created

3.7 检查Filebeat Pod状态

[root@master1 Filebeat]# kubectl get all -n elk 
NAME                 READY   STATUS    RESTARTS   AGE
pod/filebeat-6db9l   1/1     Running   0          27s
pod/filebeat-qllxg   1/1     Running   0          27s
pod/filebeat-r5hw7   1/1     Running   0          27s
​
NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/filebeat   3         3         3       3            3           <none>          27s

网站公告

今日签到

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