fluent-bit收集不同业务日志

我们将服务部署在k8s中,通常需要收集业务日志进行分析,那么现在常用的日志采集是怎么做的呢,一般来说是搭建EFK系统来采集日志,今天我们来说说如何采集k8s中的不同业务日志然后投递到es不同的索引,然后通过kibana进行分析和查看。

对于EFK的搭建,我们这里不做具体的讲解,大家可参考 https://www.niewx.cn/tke/kubernetes/log/2020/06/10/TKE%E4%B8%8A%E6%90%AD%E5%BB%BAEFK%E6%97%A5%E5%BF%97%E9%87%87%E9%9B%86%E7%B3%BB%E7%BB%9F/ , 今天我们主要来讲一下如何采集不同业务日志进行分析。

这里我们一共采集3类日志,分别是nginx日志、golang的日志、以及k8s的系统日志,一般我们采集的业务日志都是将业务日志挂载到节点,然后fluent-bit去采集节点上的日志文件,输出到es,通过kibana展示和查询。

fluent-bit的部署

我们这里简单说下fluent-bit的部署,我们通过helm部署。

$ helm install --name my-release stable/fluent-bit

部署应用

部署nginx

我们将nginx的日志挂载到节点的/data/nginx目录下,对应的yaml如下

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2020-11-24T02:08:08Z"
  generation: 1
  labels:
    k8s-app: nginx-log
    qcloud-app: nginx-log
  managedFields:
  - apiVersion: apps/v1
    manager: tke-apiserver
    operation: Update
    time: "2020-11-24T02:08:08Z"
  - apiVersion: apps/v1
    manager: kube-controller-manager
    operation: Update
    time: "2020-11-27T03:21:32Z"
  name: nginx-log
  namespace: test
  resourceVersion: "2156061896"
  selfLink: /apis/apps/v1/namespaces/test/deployments/nginx-log
  uid: eb42b8f7-97f7-405b-a750-d46df6bcd8c6
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nginx-log
      qcloud-app: nginx-log
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: nginx-log
        qcloud-app: nginx-log
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx-log
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 250m
            memory: 256Mi
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /etc/nginx/nginx.conf
          name: conf
          subPath: nginx.conf
        - mountPath: /var/log/nginx
          name: log
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: qcloudregistrykey
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 420
          name: nginx-conf
        name: conf
      - hostPath:
          path: /data/nginx
          type: DirectoryOrCreate
        name: log

部署golang

我们将golang的日志文件挂载到节点的/data/go目录下,对应的yaml如下

修改fluent-bit的配置文件和yaml

修改fluent-bit.conf

这里我们将fluent-bit.conf分成多个配置文件进行配置,你也可以配置到一个fluent-bit.conf

fluent-bit.conf配置项介绍

fluent-bit-filter.conf

日志过滤配置

fluent-bit-input.conf

日志源输入配置

fluent-bit-output.conf

日志投递输出配置

fluent-bit-service.conf

日志读取配置

fluent-bit.conf

fluent-bit的配置

parsers.conf

日志转换配置,这里暂未配置

修改fluent-bit的daemonset的yaml

我们在fluent-bit的配置文件中指定了日志源的的采集和输出,但是fluent-bit pod是无法获取节点的日志文件,我们需要将节点的文件挂载到pod进行采集。修改的挂载yaml文件如下,其实就是把/data/nginx和/data/go这2个目录挂载到fluent-bit的pod中,当然还有默认的k8s日志采集目录/var/lib/docker/containers和系统日志目录/var/log,只是这2个目录不用我们自己手动修改,默认yaml会配置这2个。

在kibana上创建索引检索日志

将上面的修改和部署都执行后,我们可以到对应的kibana上创建索引去搜索日志,这里我们已经对golang和nignx服务进行访问了,生成了一些日志

我们先查看下es的索引,看看nignx和golang的日志索引在不在

这里查看到是有nginx和golang的日志索引的,下面我们去kibana创建一下index

upload-image

我们分别创建nginx-、go-、k8s-*分配来查询对应的业务日志

我们golang日志主要是存在2条类型日志“我访问了/api/v1这个路径”和“我访问了Hello World这个路径”,下面我们去检索下,看看能不能搜到

upload-image
upload-image

生成的日志我们都是可以搜索到的。

下面我们在49.235.179.157这个机器上对nginx的service进行访问,看看我们在日志能不能获取到49.235.179.157个客户端ip

upload-image

刚刚访问的记录我们也可以早上面搜索到

k8s的一些系统日志和其他pod日志,我们可以在k8s-*这个索引下进行检索,这里我们搜一下我们部署的es的pod日志

upload-image

es的日志我们也可以在kibana上查找到

到这里,对于日志的采集,我们基本上就结束了,这里我们只要按照上面步骤进行挂载和配置,你就可以通过EFK采集到不同的业务日志,然后可以在kibana进行图标的制作和展示。

最后更新于

这有帮助吗?