1)确定需要收集的日志及位置 2)搭建日志收集服务:Elasticsearch + Kibana + Fluentd 3)验证日志收集成功(能够查看)
操作系统:CentOS Linux release 7.4.1708 (Core) 集群版本:Kubernetes v1.16.2 软件版本:Docker version 19.03.8
服务: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 日志,同时经过实验验证,确实无法收集日志。
组件:etcd、apiserver、controller-manager、proxy、scheduler、network plugin 日志:/var/log/containers/ or /var/log/pods/
无需调整,镜像 kubernetes.conf 已经从 /var/log/containers/*.log 读取日志。(在 containers 下的日志是到在 pods/ 下的日志的软链接。至于为什么要这么实现就不清楚了)
组件:应用程序的容器日志 日志:/var/lib/docker/containers/
我们的日志集群(Elasticsearch + Kibana)部署在 Kubernetes Cluster 外,而 Fluentd 以 DaemonSet 部署在集群中。
官方提供可直接使用的资源(fluentd-daemonset-elasticsearch-rbac.yaml),但是需要根据自己的需要调整。
这里略过 Elasticsearch Cluster 及 Kibana 部署过程,直接介绍 Fluentd 部署过程。
使用 fluentd-rbac.yaml 定义
使用 fluentd-service.yaml 定义
定义该“无选择器的服务”是因为 Fluentd 镜像不支持指定多个 Elasticsearch 地址,无法进行负载均衡。因此通过 “无选择器的服务” 将集群外的服务映射到集群内部,并实现负载均衡(这是重点)。
如何检查负载均衡是有效的,即 Fluentd 是否会向多个 Elasticsearch 节点写入日志? 方法一、通过 Elasticsearch API 检查传入连接及网络地址;(我们没有找到相应的方法) 方法二、在 Log Cluster 中,我们检查是否有访问 9200 且来自 Kubernetes Cluster 的连接
使用 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