# 2020-10-03 #「Kubernetes」- 使用 Fluentd 收集日志

    科技2022-07-10  185

    服务搭建流程概览

    1)确定需要收集的日志及位置 2)搭建日志收集服务:Elasticsearch + Kibana + Fluentd 3)验证日志收集成功(能够查看)

    集群环境概述

    操作系统:CentOS Linux release 7.4.1708 (Core) 集群版本:Kubernetes v1.16.2 软件版本:Docker version 19.03.8

    第一步、需要收集的日志

    systemd

    服务:docker.service kubelet.service 日志:systemd or /var/log

    1)调整日志写入,参考 systemd-journald 笔记 原因:镜像(Fluentd)使用 fluent-plugin-systemd 收集日志,该插件默认到 /var/log/journal/ 收集日志(参考 path 参数),并且镜像的 systemd.conf 没有覆盖默认 path 参数。在 systemd 中,日志默认写入 /run/log/journal/ 目录。这就导致无法正常收集 docker.service kubelet.service 日志,同时经过实验验证,确实无法收集日志。

    kubernetes components

    组件:etcd、apiserver、controller-manager、proxy、scheduler、network plugin 日志:/var/log/containers/ or /var/log/pods/

    无需调整,镜像 kubernetes.conf 已经从 /var/log/containers/*.log 读取日志。(在 containers 下的日志是到在 pods/ 下的日志的软链接。至于为什么要这么实现就不清楚了)

    applictions

    组件:应用程序的容器日志 日志:/var/lib/docker/containers/

    第二步、搭建日志收集服务

    我们的日志集群(Elasticsearch + Kibana)部署在 Kubernetes Cluster 外,而 Fluentd 以 DaemonSet 部署在集群中。

    官方提供可直接使用的资源(fluentd-daemonset-elasticsearch-rbac.yaml),但是需要根据自己的需要调整。

    #0 Elasticsearch + Kibana

    这里略过 Elasticsearch Cluster 及 Kibana 部署过程,直接介绍 Fluentd 部署过程。

    #1 Fluentd rbac

    使用 fluentd-rbac.yaml 定义

    #2 Fluentd service

    使用 fluentd-service.yaml 定义

    定义该“无选择器的服务”是因为 Fluentd 镜像不支持指定多个 Elasticsearch 地址,无法进行负载均衡。因此通过 “无选择器的服务” 将集群外的服务映射到集群内部,并实现负载均衡(这是重点)。

    如何检查负载均衡是有效的,即 Fluentd 是否会向多个 Elasticsearch 节点写入日志? 方法一、通过 Elasticsearch API 检查传入连接及网络地址;(我们没有找到相应的方法) 方法二、在 Log Cluster 中,我们检查是否有访问 9200 且来自 Kubernetes Cluster 的连接

    #3 Fluentd daemonset

    使用 fluentd-daemonset.yaml 定义

    第三步、验证日志收集成功

    验证 systemd 日志: 1)在 Kibana 中输入 SYSTEMD_UNIT.keyword : docker.service 搜索,并对比与 journalctl 的结果 2)如果存在 docker 日志,并能够与匹配,则其他组建也是有效的

    验证 kubernetes components 日志: 1)在 Kibana Discover 中输入 kubernetes.pod_name.keyword : "etcd-<your hostname>" 搜索,并对比与 journalctl 的结果 2)如果存在 etcd 日志,并能够 journalctl 匹配,则其他组建也是有效的

    验证 applications 日志:在 Kibana 中搜索 1)在 Kibana 中输入 kubernetes.pod_name : "<your pod name>" 搜索 2)如果存在应用程序日志,并且能够与应用程序匹配,则表示应用程序日志收集有效

    参考文献

    K4NZ / 使用 Fluentd 收集日志Logging in Kubernetes with Elasticsearch, Kibana, and FluentdFluentd 1.0/Kubernetes

    Processed: 0.018, SQL: 8