使用 Loki 采集微服務(wù)日志
前面我們介紹了 Grafana Labs 推出了 Loki V2 版本,新版本提供了不少新的特性,這里我們就來介紹下如何在 Kubernetes 上使用新版本的 Loki 吧。
在配置 Loki 之前,我們先安裝一些微服務(wù)來產(chǎn)生一些日志和事件,然后通過 Loki 來采集這些日志數(shù)據(jù),這里我們會使用 FluentBit 將日志轉(zhuǎn)發(fā)給 Loki,然后使用 Grafana 上的 Loki 數(shù)據(jù)源來分析日志。
示例應(yīng)用
這里我們在 Kubernetes 集群上使用啟用了 Istio 的命名空間來安裝示例應(yīng)用 microservices-demo,如果你沒有安裝 Istio,可以直接查看官方文檔進(jìn)行安裝配置。Istio 安裝完成后,我可以創(chuàng)建一個新的命名空間來進(jìn)行測試:
$?kubectl?create?ns?demo
#?Enable?istio?sidecar?injection
$?kubectl?label?namespace?demo?istio-injection=enabled?
然后安裝 microservices-demo 這個應(yīng)用:
#?Clone?the?repo?with?all?microservices?to?be?deployed
$?git?clone?https://github.com/GoogleCloudPlatform/microservices-demo
$?cd?microservices-demo
#?Install?the?services
#?鏡像默認(rèn)是gcr的,需要自行替換可訪問的鏡像地址
$?kubectl?apply?-n?demo??-f?./release/kubernetes-manifests.yaml
......
#?Setup?istio?gateway?and?virtual?services?for?routing
$?kubectl?apply?-n?demo??-f?./release/istio-manifests.yaml
gateway.networking.istio.io/frontend-gateway?created
virtualservice.networking.istio.io/frontend-ingress?created
virtualservice.networking.istio.io/frontend?created
serviceentry.networking.istio.io/whitelist-egress-googleapis?created
serviceentry.networking.istio.io/whitelist-egress-google-metadata?created
安裝完成后,可以使用 kubectl -n demo get pods 來查看是否正常。
$?kubectl?get?pods?-n?demo
NAME?????????????????????????????????????READY???STATUS????RESTARTS???AGE
adservice-66949bd448-4thj4???????????????2/2?????Running???0??????????29m
cartservice-9d88457-27qnk????????????????2/2?????Running???2??????????29m
checkoutservice-5cb565d6cd-fsqdv?????????2/2?????Running???0??????????29m
currencyservice-69746f5bfb-6m7dj?????????2/2?????Running???0??????????29m
emailservice-f4b7dddd4-vw4gn?????????????2/2?????Running???0??????????29m
frontend-644d768794-glmfj????????????????2/2?????Running???0??????????29m
loadgenerator-7895d4cdb6-jbb68???????????2/2?????Running???7??????????29m
paymentservice-7bcf59648-d2zks???????????2/2?????Running???0??????????29m
productcatalogservice-797f6494f8-fgl2b???2/2?????Running???0??????????29m
recommendationservice-7c5c6b8d56-5q99s???2/2?????Running???0??????????29m
redis-cart-74594bd569-mt9np??????????????2/2?????Running???0??????????29m
shippingservice-658875bd74-gmpgn?????????2/2?????Running???0??????????29m
接著我們可以通過 Istio gateway 端點(diǎn)來訪問演示應(yīng)用程序。

這個微服務(wù)演示應(yīng)用是一個由多個不同語言編寫的服務(wù)組成的在線商店,該應(yīng)用程序可以用來添加商品到購物車、更改交易貨幣和結(jié)賬,所有這些操作都由不同的服務(wù)來完成。
安裝 Loki 和 FluentBit
示例應(yīng)用程序安裝完成后,我們就可以開始安裝 Loki 了,這里我們使用 Helm 來快速安裝,首先添加 Chart 倉庫:
#?Add?the?loki?helm?chart
$?helm?repo?add?loki?https://grafana.github.io/loki/charts
$?helm?repo?update
Chart 倉庫配置完成后就可以直接進(jìn)行安裝了:
#?Create?the?namespace?to?install?loki
$?kubectl?create?ns?loki
#?Apply?the?loki?helm?chart
$?helm?upgrade?--install?loki?--namespace=loki?loki/loki??--set?fluent-bit.enabled=true,promtail.enabled=false,grafana.enabled=true,prometheus.enabled=true,prometheus.alertmanager.persistentVolume.enabled=true,prometheus.server.persistentVolume.enabled=true
Release?"loki"?does?not?exist.?Installing?it?now.
NAME:?loki
LAST?DEPLOYED:?Thu?Nov?19?11:48:00?2020
NAMESPACE:?loki
STATUS:?deployed
REVISION:?1
TEST?SUITE:?None
NOTES:
Verify?the?application?is?working?by?running?these?commands:
??kubectl?--namespace?loki?port-forward?service/loki?3100
??curl?http://127.0.0.1:3100/api/prom/label
安裝的時候要注意設(shè)置 fluent-bit.enabled=true,這樣就可以使用 FluentBit 作為日志轉(zhuǎn)發(fā)器了,接下來,安裝 FluentBit:
$?helm?upgrade?--install?fluent-bit?--namespace=loki?loki/fluent-bit?--set?loki.serviceName=loki.loki.svc.cluster.local
Release?"fluent-bit"?does?not?exist.?Installing?it?now.
NAME:?fluent-bit
LAST?DEPLOYED:?Thu?Nov?19?11:51:12?2020
NAMESPACE:?loki
STATUS:?deployed
REVISION:?1
TEST?SUITE:?None
NOTES:
Verify?the?application?is?working?by?running?these?commands:
??kubectl?--namespace?loki?port-forward?daemonset/fluent-bit-fluent-bit-loki?2020
??curl?http://127.0.0.1:2020/api/v1/metrics/prometheus
安裝完成后我們可以使用用 kubectl -n loki get pods 命令查看 loki 命名空間中正在運(yùn)行的 pod。
$?kubectl?get?pods?-n?loki
NAME???????????????????????????????READY???STATUS??????????????RESTARTS???AGE
fluent-bit-fluent-bit-loki-2jrd8???1/1?????Running?????????????5??????????4m20s
fluent-bit-fluent-bit-loki-knbjj???1/1?????Running?????????????0??????????20m
fluent-bit-fluent-bit-loki-wsbwl???1/1?????Running?????????????0??????????69s
grafana-5d45cc9674-wb8fn???????????1/1?????Running?????????????0??????????12m
loki-0?????????????????????????????1/1?????Running?????????????0??????????23m
接下來我們通過安裝 Grafana 來使用 Loki 進(jìn)行一些日志查詢。
安裝 Grafana
同樣首先添加 Grafana Chart 倉庫:
$?helm?repo?add?grafana?https://grafana.github.io/helm-charts
$?helm?repo?update
這里我們將 Grafana 也安裝在 loki 這個命名空間中:
$?helm?upgrade?--install?grafana?--namespace=loki?grafana/grafana
安裝完成后查看 Pod 的狀態(tài):
$?kubectl?get?pods?-n?loki
NAME???????????????????????????????READY???STATUS????RESTARTS???AGE
fluent-bit-fluent-bit-loki-4g7nh???1/1?????Running???0??????????6m20s
fluent-bit-fluent-bit-loki-dt8bj???1/1?????Running???0??????????6m
fluent-bit-fluent-bit-loki-wsbwl???1/1?????Running???0??????????12m
grafana-5d45cc9674-wb8fn???????????1/1?????Running???0??????????24m
loki-0?????????????????????????????1/1?????Running???0??????????34m
配置 Loki
這里我們直接使用 port-forward 來訪問 Grafana 服務(wù):
$?kubectl?-n?loki?port-forward?svc/grafana?8080:80
#?Navigate?to?http://localhost:8080?in?the?browser
在在瀏覽器中打開網(wǎng)址 http://localhost:8080 即可訪問,初次登錄需要輸入用戶名和密碼,用戶名為 admin,對應(yīng)的密碼可以用下面的命令獲取:
$?kubectl?get?secret?--namespace?loki?grafana?-o?jsonpath="{.data.admin-password}"?|?base64?--decode?;?echo
#?The?password?for?the?admin?user
登錄完成后,我們就可以添加 Loki 作為數(shù)據(jù)源了,從左側(cè)面板,選擇配置 -> 數(shù)據(jù)源:
在數(shù)據(jù)源視圖中,點(diǎn)擊添加數(shù)據(jù)源,然后選擇 Loki。
給數(shù)據(jù)源起一個名字,然后設(shè)置一個 Grafana 實(shí)例可以訪問的 Loki URL。我們這里由于 Loki 和 Grafana 都在相同的命名空間中運(yùn)行,不需要使用任何驗(yàn)證方案,因此不需要其他配置,單擊 "保存和測試"。您應(yīng)該會看到一條確認(rèn)消息 Data source connected and labels found.。
日志查詢
現(xiàn)在 Grafana 已經(jīng)連接到 Loki 了,接下來我們可以查詢部署到 demo 命名空間的示例應(yīng)用的日志,我們可以查找錯誤,通過 trace id 查找事務(wù)等等。
在 Grafana 頁面中,從側(cè)面板中選擇 "探索",選擇上一步中添加的 Loki數(shù)據(jù)源,在查詢框中,輸入 {namespace="demo"},然后點(diǎn)擊 "運(yùn)行查詢",正常我們就可以看到日志返回了。
此外我們還可以添加更多的過濾器和標(biāo)簽,來縮小我們想要查詢的日志范圍。要查看來自 demo 命名空間的 istio-sidecars 的日志,可以使用語句 {container="istio-proxy", namespace="demo"} 進(jìn)行查詢,我們也可以查找那些非正常的狀態(tài)碼的 http 請求 {namespace="demo"} |= "http.resp.status"!= "200"。
我們還可以對來自日志的數(shù)據(jù)進(jìn)行一些聚合分析。比如這里面匯總過去5分鐘內(nèi) demo 命名空間的 http 狀態(tài)碼,查詢語句為:sum(count_over_time({namespace="demo"} |= "http.resp.status" | json [5m])) by (http_resp_status)
上面的綠線代表 302 狀態(tài)碼,黃線代表 200 狀態(tài)碼,過去5分鐘內(nèi)沒有其他狀態(tài)碼。關(guān)于 Loki 的查詢語言 LogQL 還有很多高級的操作,我們可以通過官方文檔查看更多。
此外查詢歷史記錄還會被保存下來,這樣我們就可以在將來重新訪問一個查詢歷史了,查詢檢查器還可以報(bào)告有關(guān)查詢執(zhí)行的指標(biāo)。
“參考鏈接:https://medium.com/swlh/getting-up-and-running-with-grafana-loki-e8d841c7182f
”
訓(xùn)練營推薦

?點(diǎn)擊屏末?|?閱讀原文?|?即刻學(xué)習(xí)






