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 镜像版本等关键信息,依实际情况调整适配。

相关推荐
还是奇怪几秒前
Linux - 安全排查 2
linux·运维·安全
牛奶咖啡1325 分钟前
Linux系统的常用操作命令——文件远程传输、文件编辑、软件安装的四种方式
运维·服务器·软件安装·linux云计算·scp文件远程传输·vi文件编辑·设置yum的阿里云源
难受啊马飞2.030 分钟前
如何判断 AI 将优先自动化哪些任务?
运维·人工智能·ai·语言模型·程序员·大模型·大模型学习
会又不会38 分钟前
Jenkins-Email Extension 插件插件
运维·jenkins
电脑能手1 小时前
[保姆级教程] 解决不同局域网电脑无法SSH的问题
运维·ssh·电脑
czhc11400756632 小时前
Linux 76 rsync
linux·运维·python
你不知道我是谁?3 小时前
负载均衡--四层、七层负载均衡的区别
运维·服务器·负载均衡
dyj0953 小时前
【Rancher Server + Kubernets】- Nginx-ingress日志持久化至宿主机
运维·nginx·rancher
Kookoos4 小时前
ABP VNext + Tye:本地微服务编排与调试
微服务·云原生·架构·tye
码出钞能力4 小时前
linux内核模块的查看
linux·运维·服务器