k8s部署ELK系列一:集成Filebeat日志收集器
文章目录
在 Kubernetes 集群中,应用服务的日志对于故障排查和性能分析至关重要。传统的日志查看方式(如 kubectl logs)存在不便于集中管理和持久化存储的问题,因此,我们需要构建一套集中化的日志采集系统。
ELK(Elasticsearch + Logstash + Kibana)是目前主流的日志分析解决方案,而 Filebeat 则是轻量级日志采集工具,通常作为日志系统的数据入口。本篇文章将介绍如何在 Kubernetes 环境中部署 Filebeat 实现日志的采集和转发。

一、Filebeat简介
Filebeat 是 Elastic Stack 中的一款轻量级日志采集器,设计用于从各种日志文件中收集和转发数据。它主要用于高效地从应用程序或系统的日志文件中提取数据,并将日志发送到 Elastic Stack 的其他组件(如 Kafka 或 Logstash)。与传统的日志采集工具相比,Filebeat 的资源占用非常小,适合运行在资源受限的环境中,如容器和微服务架构。
二、Filebeat优势
✅ 轻量级和低资源占用
Filebeat 是一个资源占用非常低的日志采集器,尤其适用于 Kubernetes 集群中,能够高效地在多个容器中运行而不影响容器的性能。
⚡ 高效的日志转发
Filebeat 提供了对日志的高效采集和转发功能,可以将日志实时发送到 Kafka,这样可以确保日志流的高吞吐量和低延迟。
Kafka 可以作为日志的缓冲区,帮助处理高频日志数据并将其转发到 Logstash,避免了 Logstash 被压垮。
🔄 支持多种日志输出目标
Filebeat 本身可以将日志发送到不同的目标,例如直接发送到 Elasticsearch 或者通过 Kafka 转发给 Logstash,提供灵活的日志传输方案。
🛠️ 配置简单,易于扩展
在 Kubernetes 中,Filebeat 的配置非常简单,可以通过 ConfigMap 或 Helm chart 进行管理,支持动态扩展以满足集群中的日志收集需求。
🌐 适用于分布式环境
在 Kubernetes 这样的分布式环境中,Filebeat 可以通过配置自动发现 Kubernetes 中的 Pod 和容器日志,并自动采集日志数据。
三、Filebeat实战部署
1. 创建Namespace(elk-namespace.yaml)
apiVersion: v1
kind: Namespace
metadata:
name: elk
2. 创建ServiceAccount(filebeat-serviceaccount.yaml)
apiVersion: v1
kind: ServiceAccount
metadata:
name: filebeat
namespace: elk
labels:
k8s-app: filebeat
3. 创建RBAC(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"]
4. 创建ConfigMap(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
5. 创建DaemonSet(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: harbor.local/k8s/filebeat:7.17.0
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
6. 部署所有资源
将上述 YAML 文件保存后,使用以下命令统一部署
kubectl apply -f elk-namespace.yaml
kubectl apply -f filebeat-serviceaccount.yaml
kubectl apply -f filebeat-rbac.yaml
kubectl apply -f filebeat-configmap.yaml
kubectl apply -f filebeat-daemonset.yaml
7. 验证Filebeat Pod状态
kubectl get pod -n elk

总结
📌 通过本实战,我们成功在 Kubernetes 集群中部署了 Filebeat,实现了日志的高效采集与转发。Filebeat 作为轻量级的日志收集工具,能够无缝地集成到 Kubernetes 环境中,自动发现并采集容器日志,同时将数据高效地传输到 Kafka,为后续的日志处理和分析奠定了基础。
下一篇文章将继续深入,介绍如何部署 Kafka,实现日志的进一步处理与存储。
1万+

被折叠的 条评论
为什么被折叠?



