如何配置 DaemonSet Fluentd 以从自定义日志文件和控制台读取

How to configure DaemonSet Fluentd to read from custom log file and console

我正在尝试在本地 minikube 设置中配置 EFK 堆栈。我已关注 this tutorial.

一切正常(我可以在 kibana 和 Elasticsearch 中看到我所有的控制台日志)。但我还有一个要求。我有 Node.js 应用程序,它作为文件记录到 pod 内的自定义路径 /var/log/services/dev

文件树:

/var/log/services/dev/# ls -l
total 36
-rw-r--r--    1 root     root         28196 Nov 27 18:09 carts-service-dev.log.2021-11-27T18.1
-rw-r--r--    1 root     root          4483 Nov 27 18:09 carts-service-dev.log.2021-11-27T18

如何配置我的 Fluentd 以读取我的所有控制台日志以及从配置的自定义路径读取日志?

我的应用部署文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: carts
spec:
  replicas: 1
  selector:
    matchLabels:
      app: carts
  template:
    metadata:
      labels:
        app: carts
    spec:
      containers:
        - name: app
          image: carts-service
          resources:
            limits:
              memory: "1024Mi"
              cpu: "500m"
          ports:
            - containerPort: 4000

我的 Fluentd DaemonSet 文件:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
    version: v1
spec:
  selector:
    matchLabels:
      k8s-app: fluentd-logging
      version: v1
  template:
    metadata:
      labels:
        k8s-app: fluentd-logging
        version: v1
    spec:
      terminationGracePeriodSeconds: 30
      volumes:
        - name: varlog
          hostPath:
            path: /var/log
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule
      containers:
        - name: fluentd
          image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
          volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
          resources:
            limits:
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 200Mi
          env:
            - name: FLUENT_ELASTICSEARCH_HOST
              value: "elasticsearch.default"
            - name: FLUENT_ELASTICSEARCH_PORT
              value: "9200"

我知道如果 pod 崩溃,写入自定义路径 /var/log/services/dev 的日志文件将被删除。所以我必须使用持久卷来挂载这条路径。

但我缺乏如何为该路径创建持久卷以及 link Fluentd 从中读取的经验。

提前致谢。

如果 pod 崩溃,仍然可以在 efk 中访问所有日志。无需将持久卷添加到您的应用程序的 Pod 中,仅用于存储日志文件。

主要问题是如何从此文件中获取日志。有两种主要方法,它们是基于 kubernetes 文档建议的:

  1. 使用 sidecar 容器.

    pod 中的容器具有相同的文件系统,并且 sidecar 容器会将日志从文件流式传输到 stdout and/or stderr(取决于实现)和日志之后将被 kubelet 接收。

    请找到 streaming sidecar container 并举例说明它是如何工作的。

  2. 使用带有日志代理的边车容器

    请查找 Sidecar container with a logging agent 和使用 fluentd 的配置示例。在这种情况下,日志将由 fluentd 收集并且它们将无法通过 kubectl logs 命令获得,因为 kubelet 不对这些日志负责。