[TOC]
# 一、EFK
使用的技术:
* Elasticsearch:日志存储和搜索
* Fluentd:日志收集、过滤、转换、写入到Elasticsearch中
* Kibana:前端展示
# 二、采集原理
Dokcer 默认的日志驱动是`json-file`,该驱动将来自容器的`stdout`和`stderr`日志都统一以 json 的形式存储到 Node 节点的`/var/lib/docker/containers/<container-id>/<container-id>-json.log`目录结构内。
而 Kubernetes kubelet 会将`/var/lib/docker/containers/`目录内的日志文件重新软链接至`/var/log/containers`目录和`/var/log/pods`目录下。这种统一的日志存储规则,为我们收集容器的日志提供了基础和便利。
也就是说,我们只需采集集群节点的`/var/log/containers`目录的日志,就相当于采集了该节点所有容器输出`stdout`的日志。
![](https://img.kancloud.cn/54/f6/54f664e9dda7e96cb5a0b630aa51f7ff_1560x1070.png)
图片来自网络
基于集群的日志采集原理,我们配置了一下目录:
* `/var/log`
* `/var/lib/docker/containers`
* `/run/log/journal`
具体配置见`kubernetes/efk`目录
# 三、在k8s集群部署EFK
运行如下脚本:
```
$ ./kubernetes/scripts/deploy-prod-efk.bash
```
该脚本自动创建命名空间`logging`,部署`elasticsearch`、`kibana`、`fluentd`
自动转发5601端口,可以通过`localhost:5601`访问`kibana`
![](https://img.kancloud.cn/83/50/8350c8b773620ecb96c6b4b55bea4e4c_2840x1490.png)
初次部署`kibana`属于创建index pattern,输入`logstash-*`,如下图:
![](https://img.kancloud.cn/83/7b/837be13cf56ee4f025ac9632da8a71fc_2872x1246.png)
next step选择@timestamp
最终效果
![](https://img.kancloud.cn/0a/6d/0a6dfaf5c0a89d49ac5c49bf0d71178f_2838x1510.png)
# 参考资料
* [Fluentd官网](https://www.fluentd.org)
* [使用 Fluentd 进行日志收集](https://istio.io/latest/zh/docs/tasks/observability/logs/fluentd/)
* [EFK](https://www.servicemesher.com/istio-handbook/practice/efk.html)