K8S部署ELK(一):部署Filebeat日志收集器 - 指南
目录
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 27s