「Kubernetes」- 使用 Fluentd 收集日志

  CREATED BY JENKINSBOT

服务搭建流程概览

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)如果存在应用程序日志,并且能够与应用程序匹配,则表示应用程序日志收集有效

参考文献

Logging in Kubernetes with Elasticsearch, Kibana, and Fluentd
Fluentd 1.0/Kubernetes