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

目录

[1. ELK简介](#1. ELK简介)

[1.1 ELK 的组成](#1.1 ELK 的组成)

[1.2 核心功能](#1.2 核心功能)

[1.3 常见应用场景](#1.3 常见应用场景)

[1.4 扩展与变体](#1.4 扩展与变体)

[1.5 工作原理示例](#1.5 工作原理示例)

[1.6 优势与挑战](#1.6 优势与挑战)

[1.7 架构图](#1.7 架构图)

[2. Filebeat 简介](#2. Filebeat 简介)

[2.1 核心功能](#2.1 核心功能)

[2.2 主要特点](#2.2 主要特点)

[2.3 工作原理](#2.3 工作原理)

[2.4 典型应用场景](#2.4 典型应用场景)

[2.5 与Logstash的比较](#2.5 与Logstash的比较)

[3. K8S部署Filebeat](#3. K8S部署Filebeat)

[3.1 创建Namespace](#3.1 创建Namespace)

[3.2 创建ServiceAccount](#3.2 创建ServiceAccount)

[3.3 创建RBAC](#3.3 创建RBAC)

[3.4 创建ConfigMap](#3.4 创建ConfigMap)

[3.5 创建Deamonset](#3.5 创建Deamonset)

[3.6 部署所有资源](#3.6 部署所有资源)

[3.7 检查Filebeat Pod状态](#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
相关推荐
鼠鼠我捏,要死了捏6 小时前
基于Kubernetes StatefulSet的有状态微服务部署与持久化存储实践经验分享
kubernetes·containers·statefulset
东皋长歌8 小时前
SpringBoot集成ELK
spring boot·后端·elk
小阳睡不醒9 小时前
小白成长之路-k8s原理(一)
云原生·容器·kubernetes
haogexiaole11 小时前
K8S核心知识点
云原生·容器·kubernetes
@寄居蟹1 天前
Docker 命令大全
docker·容器·eureka
qq_364371722 天前
Docker 常见命令
运维·docker·容器
照物华2 天前
k8s之 Pod 资源管理与 QoS
云原生·容器·kubernetes
hhzz2 天前
重温 K8s 基础概念知识系列八( K8S 高级网络)
网络·容器·kubernetes
Insist7532 天前
K8s--调度管理:node节点、Pod亲和性、污点与容忍
linux·容器·kubernetes
Insist7532 天前
k8s——持久化存储 PVC
java·容器·kubernetes