目录
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