2019年6月20日 星期四

Log collect by Loki

比較常看到的 log collect 會使用 ELK 或 EFK 的架構,因為之前有安裝過 ELK 覺得太笨重,所以想試看看 Loki ,這樣 metrics (Prometheus) 和 logging (Loki) 就可以共用一套前端 (Grafana) 來處理。

Loki 基本上非常好安裝,用 helm 安裝的話甚至連 values.yaml 都不用修改。
helm repo add loki https://grafana.github.io/loki/charts
helm repo update
helm install -n loki --namespace logging loki/loki-stack

然後因為我原本就已經有安裝 prometheus 和 grafana ,所以直接到 grafana 的 UI 去設定。新增一個 data source ,選擇 Loki。在設定 loki url 的地方,如果 loki 安裝的 namespace 和 grafana 一樣,就可以直接照官方設定為 http://loki:3100/

因為我是設定在不同的 namespace,所以要修改為
http://loki.logging:3100

這個只要略懂 kubernetes 內部 DNS 運作方式的話,應該很好理解和判斷。
設定好之後,到 grafana 選單的 Explore 選項,就可以看到 log data 慢慢出現了。

loki 是用 promtail 來收集 log ,所以會看到 promtail 這個 DaemonSet 在每一個 node 上。而 promtail 預設是收集 container 的 log  ,也就是 /var/lib/docker/contaibners 及 /var/log/pods 裡的 log。 promtail 的設定可以參考 helm chart 裡的 charts/promtail/values.yaml 這個檔案。

如果要將前一篇的 audit log (或者連 host 的 syslog 一起) 也放進 loki 的話,理論上應該是改 promtail 設定是最適合的。 不過對 helm chart 不熟,對 promtail 設定的語法也不熟 (語法和 prometheus 一樣) ,而且也想嘗試用其他方式餵資料給 loki 看看,所以選擇用 fluentd 來做。

我是直接找一個現成的專案來試,這個專案把 loki plugin for fluentd 包進去,只要改幾個地方就可以運作了。

先修改 values.yaml,設定 loki 的 url ,因為我預定安裝在和 loki 一樣的 namesapce ,所以只要設定
http://loki:3100

還有設定 source 的 log path ,例如
path /var/log/kubernetes/kube-audit

另外要修改 templates/05-deployment.yaml 這個檔案,裡面有一個 nodeSelector 設定,目的是篩選 master node 來 deploy (因為只有 master node 上會有 audit log)。
但是預設的 nodeSelector 的篩選條件 (role: master) 和我現有的環境不符合,我也不想為了這個去設定 node 的 label ,所以修改這邊的設定為
node-role.kubernetes.io/master:
另外因為我這邊是多台 master node ,如果以 deployment 方式部署較不適合,所以把 Deployment 改為 DaemonSet ,在這份 yaml 中,直接這樣修改是沒問題的。
都修改完之後,就可以 deploy 了。
helm install --name=fluentd-loki ./ --namespace=logging

然後就可以到 grafana 的 UI 去做驗證了。
選擇 label 為 {env="dev"} 就可以看到透過 fluentd 取得的 audit log 了。
那這個 label 是哪來的? 

回頭看 values.yaml 的設定裡,有一個 extra_labels ,就是設定透過 fluentd 傳進去的 log 會有什麼 label 。

接著可以參考 grafana 官網,看看怎樣篩選需要的 log ,例如要找出 audit log 裡,verb 是 create 類型的,可以這樣篩選
{env="dev"} verb="create"


到此先告一段落囉。

沒有留言: