目录
[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 工作原理示例
-
数据流 :
应用日志
→ Filebeat (采集) → Logstash (解析) → Elasticsearch (存储) → Kibana(展示)。 -
典型配置:
-
使用 Filebeat 替代 Logstash 采集日志,降低资源消耗。
-
使用 Index Lifecycle Management (ILM) 自动管理日志保留策略。
-
1.6 优势与挑战
-
优势:开源免费、社区活跃、横向扩展能力强。
-
挑战:大规模部署时需优化性能(如分片策略、集群调优),存储成本可能较高。
1.7 架构图
传统架构

云原生架构

2. Filebeat 简介
Filebeat 是 Elastic Stack(ELK)中的一个轻量级日志数据收集器,属于 Beats 数据采集器家族的一员,专门用于高效、可靠地转发和集中日志文件。
2.1 核心功能
-
日志收集:
-
监控指定的日志文件或目录
-
支持多种日志格式(如文本、JSON、Syslog等)
-
自动处理日志轮转(log rotation)
-
-
日志转发:
-
将收集的日志发送到 Elasticsearch、Logstash、Kafka、Redis 等多种目的地
-
支持负载均衡和故障转移
-
-
轻量高效:
-
占用资源极少(Go语言编写)
-
没有依赖项,部署简单
-
2.2 主要特点
-
模块化设计:预置了常见应用(如Nginx、MySQL、Apache等)的日志解析模块
-
可靠性保证:使用注册表文件记录文件读取位置,确保至少一次交付
-
资源友好:CPU和内存占用低,适合在生产环境中大量部署
-
支持压缩和加密:数据传输可配置SSL/TLS加密
2.3 工作原理
-
Prospector(探测者):
-
监控配置的日志文件路径
-
检测新文件和文件变化
-
-
Harvester(收割者):
-
逐行读取文件内容
-
将内容发送到输出目标
-
记录每个文件的读取位置
-
-
Registry(注册表):
-
记录每个文件的状态和读取位置
-
确保重启后能从正确位置继续读取
-
2.4 典型应用场景
-
集中式日志管理:
服务器日志 → Filebeat → Logstash/Elasticsearch → Kibana
-
分布式系统监控:
在每台服务器上部署Filebeat,统一收集所有节点的日志
-
安全审计:
-
收集系统安全日志(如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