K8s之Pod日志收集新貴Loki初體驗(yàn)
大多數(shù)的伙伴已經(jīng)熟悉了EFK和Filebeat的使用,實(shí)際上無論是Filebeat還是Fluentd,都是將數(shù)據(jù)存儲(chǔ)在Elasticsearch集群,之后用Kibana進(jìn)行查詢,所以為了查看日志,我們不得不去搭建一個(gè)Elasticsearch集群,但Elasticsearch集群本身的維護(hù)很麻煩,也比較消耗資源,如果不想大費(fèi)周章地去維護(hù)ELK技術(shù)棧,那么Loki將是一個(gè)很好的選擇。本文我們在Kubernetes集群中搭建一個(gè)Loki?Stack,用于收集集群內(nèi)Pod的日志。
一、安裝Loki?Stack
Loki提供了Helm的安裝方式,可以直接下載包進(jìn)行安裝,首先添加并更新Loki的Helm倉庫:
"grafana" has been added to your repositoriesHang tight while we grab the latest from your chart repositories.........Successfully got an update from the "grafana" chart repository
創(chuàng)建Loki?Namespace:
namespace/loki created
創(chuàng)建Loki?Stack:
# helm upgrade --install loki grafana/loki-stack --set grafana.enabled=true --set grafana.service.type=NodePort -n lokiNAME: lokiNAMESPACE: lokiSTATUS: deployedREVISION: 1NOTES:The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.See http://docs.grafana.org/features/datasources/loki/ for more detail.
上述安裝攜帶了Grafana,如果公司已經(jīng)有Grafana,可以不用安裝,添加一個(gè)Loki的源即可。安裝時(shí),沒有開啟Loki的數(shù)據(jù)持久化,如果需要保留數(shù)據(jù),需要配置動(dòng)態(tài)存儲(chǔ),然后配置StorageClass即可,另外Loki只部署了一個(gè)副本,真正使用時(shí)需要3個(gè)以上的實(shí)例。
查看Pod的狀態(tài):
# kubectl get po -n lokiNAME READY STATUS RESTARTS AGEloki-0 1/1 Running 0 4m23sloki-grafana-5b57955f9d-48z6l 1/1 Running 0 4m23sloki-promtail-2n24m 1/1 Running 0 4m23sloki-promtail-59slx 1/1 Running 0 4m23sloki-promtail-6flzq 1/1 Running 0 4m23sloki-promtail-gq2hk 1/1 Running 0 4m23sloki-promtail-sqwtv 1/1 Running 0 4m23s
查看Grafana的Service暴露的端口號:
# kubectl get svc -n lokiNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEloki ClusterIP 192.168.67.18 <none> 3100/TCP 7m54sloki-grafana NodePort 192.168.103.121 <none> 80:31053/TCP 7m54sloki-headless???ClusterIP????None????????????????<none>????????3100/TCP????????7m54s
之后通過任意一個(gè)安裝了kube-proxy節(jié)點(diǎn)的IP加上31053即可訪問Grafana,如圖1所示。

圖1 訪問Grafana
查看Grafana密碼(賬號為admin):
kubectl get secret --namespace loki loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echoeD47DAbzhyPLgDeSM8C0LvBi3DksU73vZND8t4h0
登錄后,按圖2所示單擊即可查看Loki語法指南。

圖2?訪問Explore
其他安裝配置可以參考:https://grafana.com/docs/loki/latest/installation/helm/。
二、Loki語法入門
Loki是參考Prometheus設(shè)計(jì)的,所以查詢語法和PromQL類似,比如查詢命名空間為kube-system下的所有Pod的日志,只需要在Log?browser中輸入{namespace="kube-system"},然后單擊Run?query即可,如圖3所示。

圖3?查詢?nèi)罩?/span>
最下方為日志詳情,如圖4所示。

圖4 日志詳情
可以看到每條日志都被添加了很多標(biāo)簽,之后可以通過標(biāo)簽過濾日志,比如查看命名空間為kube-system且Pod名稱包含calico的日志(下面的語法將不再提供截圖,讀者可以自行測試):
{namespace="kube-system", pod=~"calico.*"}相當(dāng)于=~,類似的語法還有:
l?=~:正則模糊匹配。
l?=:完全匹配。
l?!=:不等于。
l?!~:正則模糊不等于。
Loki語法同時(shí)支持Pipeline,比如需要過濾日志包含avg字段的日志:
{namespace="kube-system", pod=~"calico.*"} |~ "avg"查詢到的日志如圖5所示。

圖5 ?AVG過濾后的日志
還可以使用logfmt對日志進(jìn)行格式化,然后進(jìn)行值的判斷,比如找到包含avg字段并且longest的值大于16ms的日志:
{namespace="kube-system", pod=~"calico.*"} |~ "avg" | logfmt | longest > 16ms得到的日志如圖6所示,和上一個(gè)結(jié)果相比,只有longest大于16ms的日志,其他的均已被過濾掉。

圖6?longest過濾后的日志

