k8s中用filebeat文件如何收集不同service的日志

以下是一个详细的从在 Kubernetes 集群中部署 Filebeat,到实现按web-oper、web-api微服务分离日志并存储到不同索引的完整方案:

理解需求:按服务分离日志索引

  • 在 Kubernetes 集群中,有web-oper和web-api两种微服务,希望通过 Filebeat
    将它们的日志分别收集到不同的索引中。 这样在后续查看和分析日志时,可以更方便地根据服务进行区分,例如在 Elasticsearch
    中通过不同的索引来查询web-api和web-oper的日志。

准备工作:已成功部署好es与Kibana

  1. 准备 Filebeat 配置文件

创建一个名为 filebeat.yml 的配置文件,内容如下:

yaml 复制代码
filebeat.inputs:
  - type: container
    paths:
      - /var/log/containers/*.log
    processors:
      - add_kubernetes_metadata:
          host: ${NODE_NAME}
          matchers:
            - logs_path:
                logs_path: "/var/log/containers/"

output.elasticsearch:
  hosts: ["elasticsearch-cluster-ip:9200"]  # 替换为实际的Elasticsearch集群IP和端口
  indices:
    - index: "web-api-log-%{+yyyy.MM.dd}"
      when:
        equals:
          kubernetes:
            labels:
              app: web-api
    - index: "web-oper-log-%{+yyyy.MM.dd}"
      when:
        equals:
          kubernetes:
            labels:
              app: web-oper

上述配置文件作用解析:

● filebeat.inputs 部分指定了从容器日志路径(/var/log/containers/*.log,这是 Kubernetes 默认存放容器日志之处)收集日志,并通过 add_kubernetes_metadata 处理器添加 Kubernetes 相关元数据,便于后续精准筛选。

● output.elasticsearch 部分定义了输出目标为 Elasticsearch 集群,重点是 indices 小节,使用 when 条件语句搭配 equals 判断机制。如果容器的 kubernetes.labels.app 标签值为 web-api,日志将发送至 web-api-log-%{+yyyy.MM.dd} 索引;若标签值是 web-oper,则发送到 web-oper-log-%{+yyyy.MM.dd} 索引。

  1. 创建 Filebeat 的 DaemonSet 资源定义文件

新建一个名为 filebeat-daemonset.yaml 的 YAML 文件,用于在 Kubernetes 中部署 Filebeat:

yaml 复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: kube-system  # 推荐部署到kube-system命名空间,便于统一管理系统级组件
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
        - name: filebeat
          image: docker.elastic.co/beats/filebeat:7.14.0  # 按需选择Filebeat版本镜像
          volumeMounts:
            - name: varlogcontainers
              mountPath: /var/log/containers
            - name: varlogpods
              mountPath: /var/log/pods
            - name: filebeat-config
              mountPath: /usr/share/filebeat/filebeat.yml # 挂载filebeat文件
              readOnly: true
      volumes:
        - name: varlogcontainers
          hostPath:
            path: /var/log/containers
        - name: varlogpods
          hostPath:
            path: /var/log/pods
        - name: filebeat-config
          configMap:
            name: filebeat-config

DaemonSet 控制器确保所有(或一部分)的节点都运行了一个指定的 Pod 副本

  • 每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上。
  • 当节点从集群中移除时,Pod 也就被垃圾回收了。
  • 删除一个 DaemonSet 可以清理所有由其创建的 Pod。

这个 DaemonSet 配置解析如下:

  • metadata 定义了 DaemonSet 的名称 filebeat 以及所属命名空间。
  • spec 里的 selector 和 template 标签配合,确保每个节点上都运行符合 app: filebeat 标签的 Pod。
  • containers 中定义Filebeat 容器,挂载了容器日志目录(/var/log/containers 和
    /var/log/pods)用于读取日志,同时挂载了之前创建的 filebeat.yml 配置文件(通过 configMap
    方式挂载,下面步骤会创建),设置为只读,防止容器内意外修改配置。
  • volumes 部分对应上述 volumeMounts,声明了hostPath 类型的本地日志目录挂载以及 configMap 类型挂载,用于配置文件挂载。
  • /var/log/pods目录存储了 Pod 级别的日志,这些日志可能包含了关于 Pod 启动、停止以及内部容器之间交互的一些详细信息。例如,Pod 初始化容器(init container)的日志可能会在这里有记录。初始化容器用于在主容器启动之前执行一些初始化任务,如配置环境、检查依赖等,其日志对于排查 Pod 启动问题非常重要。
  1. 创建 ConfigMap 用于挂载配置文件

    执行以下命令创建包含 filebeat.yml 的 ConfigMap:

shell 复制代码
kubectl create configMap filebeat-config --from-file=filebeat.yml -n kube-system

此命令会将 filebeat.yml 文件内容封装进名为 filebeat-config 的 ConfigMap 里,供 Filebeat 容器挂载使用。

  • 在 Kubernetes 集群中部署 Filebeat
    使用以下命令部署 Filebeat:
shell 复制代码
kubectl apply -f filebeat-daemonset.yaml

这条命令将依据 filebeat-daemonset.yaml 描述在集群中启动 Filebeat。

  1. 验证部署与日志收集效果
    ● 查看 Filebeat 容器日志:
    通过 kubectl logs -n kube-system (filebeat-pod-name 可通过 kubectl get pods -n kube-system | grep filebeat 查到),检查有无报错信息,排查配置或启动过程中可能出现的问题。
    ● 在 Elasticsearch 端检查索引:利用 Elasticsearch 的 API 或者 Kibana 工具,查看是否成功创建了 web-api-log-%{+yyyy.MM.dd} 和 web-oper-log-%{+yyyy.MM.dd} 两个索引,索引内是否陆续接收到对应服务的日志。

通过以上步骤,即可在 Kubernetes 集群中成功部署 Filebeat,并实现按 web-oper、web-api 服务分离日志存储到不同索引,方便后续日志分析运维工作。

需留意配置文件中的 Elasticsearch 集群地址、Filebeat 镜像版本等关键信息,依实际情况调整适配。

相关推荐
黑客老李6 分钟前
证书站小程序猜测接口获取大量敏感信息
android·运维·服务器·数据库·sql·安全·小程序
LCL_1817 分钟前
ansible自动化运维(四)jinjia2模板
linux·运维·自动化·ansible·jinjia2
两张不够花19 分钟前
ansible自动化运维(四)运维实战
运维·自动化·ansible
北十南五22 分钟前
MacroDroid Pro 功能强大的任务自动化和配置应用程序
运维·自动化·电脑
迈尔微视MRDVS22 分钟前
全球叉车市场 2023 - 2032 年发展趋势:自动化、电商与电动叉车的崛起
运维·人工智能·opencv·计算机视觉·目标跟踪·机器人·自动化
牛哄哄的柯南29 分钟前
警惕!手动调整服务器时间可能引发的系统灾难
运维·服务器
盒子猫君29 分钟前
【教程】如何在服务器的终端中创建定时任务?
运维·服务器
出发行进41 分钟前
Hadoop其一,介绍本地模式,伪分布模式和全分布搭建
大数据·运维·hadoop·分布式
vvw&1 小时前
如何部署和配置项目管理工具 Plane - 开源 Jira 替代方案
linux·运维·服务器·ubuntu·开源·jira·plane
itachi-uchiha2 小时前
XX服务器上的npm不知道咋突然坏了
运维·服务器·npm