k8s部署ELK系列一:集成Filebeat日志收集器

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,实现日志的进一步处理与存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值