輕量級 k8s 應(yīng)用日志收集方案 loki

前言

微服務(wù)早已是一個(gè)過時(shí)的熱詞,同時(shí),容器 和 k8s 的出現(xiàn)讓它更一步成為了一種時(shí)尚。同樣會帶來很多附贈的問題,日志收集就是其中一個(gè)比較重要的問題。當(dāng)應(yīng)用容器化之后,需要查看日志,如果還需要登錄服務(wù)器,找到對應(yīng)目錄,然后 tail 查看,成本太高了,極大的影響效率。當(dāng)前其實(shí)日志收集方案很多,在實(shí)踐了多個(gè)方案之后,我終于能在今天寫出我個(gè)人認(rèn)為我最喜歡的一個(gè)方案了 loki

我的需求

技術(shù)上沒有銀彈,需要根據(jù)實(shí)際需求來選擇方案,那么我的需求是這樣的,你可以做個(gè)比較:

  1. 當(dāng)前所有的應(yīng)用是部署在 k8s 中的,需要收集所有的應(yīng)用的日志到一個(gè)地方做展示
  2. 部署最好要輕量,對于性能要求并不高(當(dāng)前日志量并不大)
  3. 日志展示方式友好,能支持基本的時(shí)間查詢,或者是定位到某個(gè)關(guān)鍵字

可選方案

從之前的公司包括個(gè)人的一些項(xiàng)目上都嘗試過很多不同的組合和方案,列舉出三個(gè)最具有可比性的方案:(以下為個(gè)人使用案例,并不能代表所有大眾觀點(diǎn),圖片來源本地測試服,線上日志不允許公開,但同樣禁止轉(zhuǎn)載~)

ELK

image.png

這似乎是業(yè)界最成熟的日志收集方案之一了,因?yàn)闊o論你問哪個(gè)有點(diǎn)經(jīng)驗(yàn)的程序員,提到日志收集,必然會給到這個(gè),我當(dāng)然不是說這個(gè)方案不行,因?yàn)槲抑篮芏喙径疾捎昧诉@個(gè)方案,并且穩(wěn)定運(yùn)行著,所以這個(gè)方案我也嘗試去使用過,帶來的問題有下面幾個(gè):

  1. 部署并不容易,當(dāng)前現(xiàn)在已經(jīng)好很多了,當(dāng)年確實(shí)手工部署比較困難,會有很多意外
  2. 占用資源過多,特別是 logstash,懂得都懂
  3. ES 使用比較困難,上手成本比較高,因?yàn)椴⒉皇撬械拈_發(fā)對于 ES 的使用都是熟練的,包括我自己都是需要查看文檔之后才能回憶起來很多操作

當(dāng)然后面改進(jìn)了:變成了 EFK

其中的 F 可以是 filebeat、fluentd、fluent-bit 這樣日志采集的部分可以占用更少的資源,使用上會更加輕量一些,所以,其實(shí)現(xiàn)在 EFK 算是一個(gè)通用的商業(yè)日志收集的解決方案了。我覺得如果是一個(gè)中型或者大型的項(xiàng)目可以使用這樣成熟的解決方案,沒有問題。

FIC

FIC 可能小眾一些,但是這是我第二個(gè)使用上來說對于我來說使用下來感覺不錯(cuò)的方案:fluentbit + influxdb + chronograf

其實(shí)我蠻喜歡 influxdb 這家公司出品的東西的,使用感覺還不錯(cuò),因?yàn)?influxdb 作為一個(gè)時(shí)序數(shù)據(jù)庫來說其實(shí)非常輕量了,部署也很方便,配置上面也比較簡單,主要還是日志收集上面的配置,并且 influxdb 的使用比起 es 來說理解起來更加的簡單一點(diǎn),更容易上手

image.png

部署方式:http://www.lxweimin.com/p/c5faf3c10bce

在使用的 FIC 的時(shí)候,我發(fā)現(xiàn)它對于單體應(yīng)用還是相當(dāng)友好的,搭建使用都非常舒服,并且 chronograf 的頁面比 kibana 個(gè)人認(rèn)為要舒服很多,簡潔。當(dāng)然也有它自己的問題:

  1. influxdb 還是比較吃內(nèi)存的
  2. 日志量大的時(shí)候 chronograf 明顯第一次進(jìn)去會卡,不知道現(xiàn)在優(yōu)化沒有,然后如果當(dāng)入庫數(shù)據(jù)異常的時(shí)候其實(shí)頁面會報(bào)錯(cuò)的:之前我提過 issue 應(yīng)該已經(jīng)修復(fù)
  3. 日志關(guān)鍵字搜索的時(shí)候會卡,準(zhǔn)確的說比較慢
  4. 其實(shí) fluentbit 對于多行日志的處理很雞肋,因?yàn)槊考颐繎舻娜罩靖袷狡鋵?shí)不太一樣,公司內(nèi)部日志格式都不一樣,我還嘗試重新自己造過輪子,發(fā)送到 influxdb ,后面才發(fā)現(xiàn) filebeat 也能滿足要求。
  5. tag 會爆炸,塞日志的時(shí)候,如果日志量巨大,因?yàn)闀鶕?jù)日志級別打 tag 建立索引,而 influxdb 是有默認(rèn)限制的,所以當(dāng)時(shí)也踩了坑,調(diào)整了配置后得以解決

但是 其實(shí) FIC 對于系統(tǒng)日志也就是 syslog 的監(jiān)控還是有著自己獨(dú)特的一面,有機(jī)會你可以嘗試一下,還是相當(dāng)不錯(cuò)的,這個(gè)方案我也使用了一段時(shí)間了。

Loki

這是我當(dāng)前使用過一段時(shí)間之后,最終認(rèn)可的一個(gè)方案:https://github.com/grafana/loki

其實(shí)在使用 FIC 的時(shí)候我就猶豫過當(dāng)時(shí)要不要使用 loki 猶豫當(dāng)時(shí)的公司內(nèi)部沒有大力推 k8s ,多數(shù)都是 docker-compose 的使用,更多的是小單體居多的。而當(dāng)時(shí) loki 也是沒有很多的實(shí)際使用經(jīng)驗(yàn),不敢往上推,怕出問題。但是后面有了機(jī)會實(shí)踐之后就真香了。

其實(shí) loki 包含三個(gè)組件:

  1. Promtail:日志收集工具
  2. Loki:日志聚合系統(tǒng)
  3. Grafana:可視化工具

grafana 其實(shí)很熟悉了,很多監(jiān)控展示都用到它了,用起來也相當(dāng)?shù)氖娣泻芏嗟恼故痉绞剑?dāng)時(shí)在比較的時(shí)候,當(dāng)初 grafana 還只有表格展示模式,所以就比較尷尬,后面出現(xiàn)了 log 模式就很舒服了。

image.png

我覺得 loki 讓我舒服在下面幾個(gè)點(diǎn):

  1. k8s 內(nèi)部署非常方便,幾乎是一個(gè) helm 就能部署好了,不需要額外的配置,默認(rèn)的配置已經(jīng)足夠日常的使用了
  2. 能篩選到某應(yīng)用,甚至到某個(gè) pod 的日志,查問題的時(shí)候非常方便
  3. 支持關(guān)鍵字搜索,我甚至不需要調(diào)整原有的日志格式,就能有很好的支持,如果調(diào)整輸出日志的格式為官方推薦的 logfmt 的話可能更加靠譜
  4. 日志數(shù)據(jù)本身會被壓縮,使用成本低
  5. 幾乎沒有入侵:我沒有調(diào)整日志格式,不需要建立特定的 sidecar 去監(jiān)控日志也就不需要改動原有的 deployment 的 yaml 配置,就是使用 loki 不需要我改動什么就能用起來

但是畢竟沒有 ES 那么多建立的索引,當(dāng)日志量大的時(shí)候搜索沒有那么快,但是也足夠滿足我的要求了,足夠用了。(當(dāng)然如果調(diào)整loki一些參數(shù)如緩存等可以大大加快查詢速度,個(gè)人沒有調(diào)整,已經(jīng)足夠使用)

雖然網(wǎng)上見到有吐槽過性能的,但是目前個(gè)人使用下來暫時(shí)沒有遇到瓶頸。后面還會持續(xù)關(guān)注@TODO。

PS: 需要注意的是,你的應(yīng)用日志需要輸出到 stdout 中 這里有關(guān) k8s 日志收集方案不做過多討論,因?yàn)榫W(wǎng)上的方案大多三種,一種 stdout,一種掛 sidecar,一種用 DaemonSet 各有各的說法。

部署

官方已經(jīng)給出了很多部署的方案,其中我選擇的是 helm,非常輕松:https://grafana.com/docs/loki/latest/installation/helm/

# 添加 repo 并更新
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

# 注意這里后面是 -stack 的是默認(rèn)打包好在一起的,沒stack的是默認(rèn)只有 loki 的,自定義安裝請參考官網(wǎng)給出的命令
helm upgrade --install loki --namespace=<YOUR-NAMESPACE> grafana/loki-stack

# 安裝 grafana
helm install loki-grafana --namespace=<YOUR-NAMESPACE> grafana/grafana

# 查看 grafana 的密碼
kubectl get secret --namespace <YOUR-NAMESPACE> loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

# 臨時(shí)暴露 端口 進(jìn)行訪問測試
kubectl port-forward --namespace <YOUR-NAMESPACE> service/loki-grafana 3000:80

然后設(shè)置對應(yīng)的 service 暴露出你需要使用的端口即可,其實(shí)非常容易操作。

使用 admin 和上面查看的 grafana 的密碼即可進(jìn)入,然后添加數(shù)據(jù)源選擇 loki

image.png

注意這里的地址輸入 http://loki:3100 即可,沒有什么其他需要配置的。我真的覺得 so easy

如果沒有意外,就可以使用 grafana 的 explorer 進(jìn)行日志查看的了,前提是運(yùn)行一段時(shí)間,讓你的輸出一些日志。

關(guān)鍵字檢索

其實(shí)我一開始還擔(dān)心沒辦法進(jìn)行日志關(guān)鍵字檢索,找了半天,才發(fā)現(xiàn)很簡單,只需要在最上面的輸入框中寫入 {job="mysql"} |= "error" 其中的 error 就是你要找的關(guān)鍵字,就可以了,還有一些正則表達(dá)式這里就不多介紹了,explorer 打開的一開始有提示的。

總結(jié)

其他使用細(xì)節(jié)因?yàn)樯婕熬唧w生產(chǎn)使用,不方便截圖,我將一些必要的的鏈接參考扔在下面,應(yīng)該足夠你使用了。

總的來說,我要的 loki 都有,并且部署方便,想要替換也很方便,直接刪掉就好了,然后滿足我日志查看的全部需求,而且占用資源情況也沒有其他幾個(gè)那么高,完美~ 后悔沒有早點(diǎn)用上它。不過后面也會持續(xù)追蹤使用情況,后面會再出一個(gè)有關(guān)使用過程中的坑點(diǎn)的博客。

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容