FluentD 日志不可读。它被排除在外,下次会检查

Posted

技术标签:

【中文标题】FluentD 日志不可读。它被排除在外,下次会检查【英文标题】:FluentD log unreadable. it is excluded and would be examined next time 【发布时间】:2019-01-11 06:19:49 【问题描述】:

面对:流利的日志不可读。已排除,下次会检查

我有一个在 kubernetes 设置中运行的 fluentD 守护程序集的简单配置。

Fluentd 版本:fluentd-0.12.43

下面是我的配置。

  <source>
    @type tail
    path /var/log/containers/sample*.log
    time_format %Y-%m-%dT%H:%M:%S.%NZ
    tag sample.*
    format json
    read_from_head true
  </source>
  <match sample.**>
    @type forward
    heartbeat_type tcp
    send_timeout 60s
    recover_wait 10s
    hard_timeout 60s
    <server>
      name worker-node2
      host 10.32.0.15
      port 24224
      weight 60
    </server>
  </match>

低于警告且不转发任何日志

2018-08-03 06:36:53 +0000 [警告]: /var/log/containers/samplelog-79bd66868b-t7xn9_logging1_fluentd-70e85c5d6328e7d.log 不可读。它被排除在外,将在下次检查。

2018-08-03 06:37:53 +0000 [警告]: /var/log/containers/samplelog-79bd66868b-t7xn9_logging1_fluentd-70e85c5bc89ab24.log 不可读。它被排除在外,将在下次检查。

日志文件权限:

[root@k8s-master fluentd-daemonset]# ls -lrt **/var/log/containers/**

**lrwxrwxrwx** Jun 25 06:25 sample-77g68_kube-system_kube-proxy-9f3c3951c32ee.log 
-> /var/log/pods/aa1f8d5b-746f-11e8-95c0-005056b9ff3a/sample/7.log

守护程序集的 YAML 文件有安装说明:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: logging1
  labels:
    k8s-app: fluentd-logging
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  template:
    -----
    -----
    -----

        volumeMounts:
        - name: fluentd-config
          mountPath: /fluentd/etc/ 
        - name: varlog
          mountPath: /var/log
          readOnly: true
        - name: varlogpods
          mountPath: /var/log/pods
          readOnly: true
        - name: varlogcontainers
          mountPath: /var/log/containers
          readOnly: true
        - name: varlibdocker
          mountPath: /var/lib/docker
          readOnly: true
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: fluentd-config
        configMap:
          name: fluentd-config
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlogpods
        hostPath:
          path: /var/log/pods
      - name: varlogcontainers
        hostPath:
          path: /var/log/containers
      - name: varlibdocker
        hostPath:
          path: /var/lib/docker
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers 

即使权限正确fluentD版本正确挂载指令是他们在kubernetes daemonset中,也不知道,为什么我得到这个警告。

【问题讨论】:

【参考方案1】:

正如您在列表中定义的/var/log,其他/var/log/... 是重复的。

删除/var/log

检查kubectl describe pod fluentd-... 是否所有卷都已正确安装。

【讨论】:

所有卷都已挂载。挂载: /fluentd/etc/ 来自 fluentd-config (rw) /var/lib/docker 来自 varlibdocker (ro) /var/lib/docker/containers 来自 varlibdockercontainers (ro) /var/log 来自 varlog (ro) /var/来自 varlogcontainers (ro) 的日志/容器 /var/log/pods 来自 varlogpods (ro) /var/run/secrets/kubernetes.io/serviceaccount 来自 default-token-54bgv (ro) 尝试删除 /var/log 这些我都试过了。就像放置 /var/log 并删除它一样。还是不行。【参考方案2】:

愿colachg建议对你有帮助:

我认为 kubelet 在 '/var/log/containers' 中创建了一些符号链接(只是链接不是真实文件),因此您必须同时挂载链接和真实文件或仅使用正确的 fluentd.conf 挂载真实文件。

【讨论】:

【参考方案3】:

我们需要设置以下环境变量: FLUENT_UID 为 0

【讨论】:

有什么解决办法吗? 我们需要设置如下环境变量:FLUENT_UID 为 0 嗨 Hemant,你在哪里设置了这个 ENV 变量?在 values.yaml 或 configmap 中?【参考方案4】:

我遇到了类似的问题。 所以,实际发生的是 - 1. Fluentd 在 /var/log/containers/ 中创建一个符号链接,这进一步是 /var/log/pods/ 中文件的符号链接 -

root@fluentd-forwarders-5bfzm:/home/fluent# ls -ltr /var/log/containers/consul-0_default_consul-c4dbf47bf46b4cacfb0db67885fdba73835e05b45b14ec7dc746cc2d5ed92ea3.log 
lrwxrwxrwx. 1 root root 83 Oct 30 07:42 /var/log/containers/consul-0_default_consul-c4dbf47bf46b4cacfb0db67885fdba73835e05b45b14ec7dc746cc2d5ed92ea3.log -> /var/log/pods/default_consul-0_2a206546-73b3-4d05-bd7a-0b307c8b24d1/consul/1628.log

2. /var/log/pods 是挂载在主机上的日志文件的符号链接。在我的设置中,我使用主机/节点的 /data/ 目录来存储 docker 数据。

root@fluentd-forwarders-5bfzm:/home/fluent# ls -ltr /var/log/pods/default_consul-0_2a206546-73b3-4d05-bd7a-0b307c8b24d1/consul/1629.log 
lrwxrwxrwx. 1 root root 162 Oct 30 07:47 /var/log/pods/default_consul-0_2a206546-73b3-4d05-bd7a-0b307c8b24d1/consul/1629.log -> /data/docker/containers/478642a56a6e15e7398391a2526ec52ad1aa24341e95aa32063163da11f4cc8b/478642a56a6e15e7398391a2526ec52ad1aa24341e95aa32063163da11f4cc8b-json.log

因此,在我的 deployment.yaml 中,我必须挂载 /data/docker/containers 而不是 /var/lib/containers/ 来解决问题,即

        volumeMounts:
        - mountPath: /var/log
          name: varlog
        - mountPath: /data/docker/containers
          name: datadockercontainers
          readOnly: true
        - mountPath: /fluentd/etc
          name: config-path

【讨论】:

对我们来说,我们跟踪到 /u01/data 的符号链接。这需要安装以解决问题。【参考方案5】:
/var/log/containers/*.log  unreadable. 

最直接的方法是改变模式:

chmod 777 /var/log/containers/*.log

但最好的方法是:将 fluent 用户更改为 root(在 docker/kubernetes 配置中将 FLUENT_UID 环境变量设置为 0);

在docker命令中添加--env FLUENT_UID=0,例如:

docker run -it -d   -p 24224:24224   -v /path/to/conf:/fluentd/etc   -v /var:/var --env FLUENT_UID=0 fluent/fluentd:latest

或添加到 Kubernetes yaml 文件中:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
  # namespace: default
  labels:
    k8s-app: fluentd-logging
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  template:
    metadata:
      labels:
        k8s-app: fluentd-logging
        version: v1
        kubernetes.io/cluster-service: "true"
    spec:
      serviceAccount: fluentd
      serviceAccountName: fluentd
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.4-debian-elasticsearch
        env:
          - name:  FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch.logging"
          - name:  FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          - name: FLUENT_UID  # change this place
            value: "0"

【讨论】:

以上是关于FluentD 日志不可读。它被排除在外,下次会检查的主要内容,如果未能解决你的问题,请参考以下文章

FluentD 将日志从 kafka 转发到另一个 fluentD

rancher使用fluentd-pilot收集日志分享

fluentd收集Docker stdout日志

Docker 容器日志管理Fluentd

K8s 中的 Docker + Fluentd 进行日志轮换:Docker 是不是需要知道 Fluentd 的存在?

启用 Fluentd 日志轮换