[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`的日志。

圖片來自網絡
基于集群的日志采集原理,我們配置了一下目錄:
* `/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`

初次部署`kibana`屬于創建index pattern,輸入`logstash-*`,如下圖:

next step選擇@timestamp
最終效果

# 參考資料
* [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)