服务搭建流程概览
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)如果存在应用程序日志,并且能够与应用程序匹配,则表示应用程序日志收集有效
参考文献
WikiNotes/使用 Fluentd 收集日志
Logging in Kubernetes with Elasticsearch, Kibana, and Fluentd
Fluentd 1.0/Kubernetes