helm快速生效方法
wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
tar -zxvf helm-v3.2.1-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/local/bin
chmod a+x /usr/local/bin/helm
在 Kubernetes 上使用FluentBit+Loki +Grafana查看微服務(wù)日志
安裝 Loki 和 FluentBit
開始安裝 Loki ,使用 Helm 來快速安裝,首先添加 Chart 倉庫:
# Add the loki helm chart
helm repo add loki https://grafana.github.io/helm-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í)候要注意設(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

安裝 Grafana ,使用 Loki 進(jìn)行一些日志查詢
helm upgrade --install my-release --namespace=loki loki/grafana
安裝完成后查看 Pod 的狀態(tài):
kubectl get pods -n loki

配置 Loki
這里我們直接使用 port-forward 來訪問 Grafana 服務(wù):
kubectl --namespace loki port-forward $POD_NAME 3000
Navigate to http://localhost:8080 in the browser
在在瀏覽器中打開網(wǎng)址 http://localhost:8080 即可訪問,初次登錄需要輸入用戶名和密碼,用戶名為 admin,對應(yīng)的密碼可以用下面的命令獲?。?/p>
kubectl get secret --namespace loki my-release-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
# The password for the admin user
查看loki命名空間中的service
kubectl get svc -n loki

這里因?yàn)橐宬8s集群外能訪問到所以將ClusterIP 修改為NodePort類型,具體修改后內(nèi)容如下
kubectl edit svc my-release-grafana -n loki
spec:
clusterIP: 10.100.87.199
externalTrafficPolicy: Cluster
ports:
- name: service
nodePort: 30060
port: 80
protocol: TCP
targetPort: 3000
修改好以后保存即可。
生效之后就可以在192.168.100.203:30060訪問grafana了。

登錄完成后,我們就可以添加 Loki 作為數(shù)據(jù)源了,從左側(cè)面板,選擇配置 -> 數(shù)據(jù)源:

在數(shù)據(jù)源視圖中,點(diǎn)擊添加數(shù)據(jù)源,然后選擇 Loki。

給數(shù)據(jù)源起一個(gè)名字,然后設(shè)置一個(gè) Grafana 實(shí)例可以訪問的 Loki URL。我們這里由于 Loki 和 Grafana 都在相同的命名空間中運(yùn)行,不需要使用任何驗(yàn)證方案,因此不需要其他配置,單擊 "保存和測試"。您應(yīng)該會(huì)看到一條確認(rèn)消息 Data source connected and labels found.。

http://loki.loki.svc.cluster.local:3100/
日志查詢
現(xiàn)在 Grafana 已經(jīng)連接到 Loki 了,接下來我們可以查詢部署到 demo 命名空間的示例應(yīng)用的日志,我們可以查找錯(cuò)誤,通過 trace id 查找事務(wù)等等。
在 Grafana 頁面中,從側(cè)面板中選擇 "探索",選擇上一步中添加的 Loki數(shù)據(jù)源,在查詢框中,輸入{namespace="default"},然后點(diǎn)擊 "運(yùn)行查詢",正常我們就可以看到日志返回了。

此外我們還可以添加更多的過濾器和標(biāo)簽,來縮小我們想要查詢的日志范圍。要查看來自 default 命名空間的 shida-getaway 的日志,可以使用語句 {namespace="default",container="shida-getaway"} 進(jìn)行查詢,我們也可以查找那些非正常的狀態(tài)碼的 http 請求 {namespace="default"} |= "http.resp.status"!= "200"。
我們還可以對來自日志的數(shù)據(jù)進(jìn)行一些聚合分析。比如這里面匯總過去5分鐘內(nèi) default 命名空間的 http 狀態(tài)碼,查詢語句為:sum(count_over_time({namespace="default"} |= "http.resp.status" | json [5m])) by (http_resp_status)

上面的綠線代表 302 狀態(tài)碼,黃線代表 200 狀態(tài)碼,過去5分鐘內(nèi)沒有其他狀態(tài)碼。關(guān)于 Loki 的查詢語言 LogQL 還有很多高級的操作,我們可以通過官方文檔查看更多。
此外查詢歷史記錄還會(huì)被保存下來,這樣我們就可以在將來重新訪問一個(gè)查詢歷史了,查詢檢查器還可以報(bào)告有關(guān)查詢執(zhí)行的指標(biāo)。
<main>
<article class="baidu_pl">
日志過濾器,更多參考官網(wǎng)
編寫日志流選擇器后,您可以通過編寫搜索表達(dá)式來進(jìn)一步過濾結(jié)果。搜索表達(dá)式可以只是文本或正則表達(dá)式。
查詢示例:
{job="mysql"} |= "error"
{name="kafka"} |~ "tsdb-ops.*io:2003"
{instance=~"kafka-[23]",name="kafka"} != kafka.server:type=ReplicaManager
過濾器運(yùn)算符可以被鏈接,并將順序過濾表達(dá)式-結(jié)果日志行將滿足每個(gè)過濾器。例如:
{job="mysql"} |= "error" != "timeout"
已實(shí)現(xiàn)以下過濾器類型:
- |= 行包含字符串。
- != 行不包含字符串。
- |~ 行匹配正則表達(dá)式。
- !~ 行與正則表達(dá)式不匹配。
regex表達(dá)式接受RE2語法。默認(rèn)情況下,匹配項(xiàng)區(qū)分大小寫,并且可以將regex切換為不區(qū)分大小寫的前綴(?i)。
參考資料:https://blog.csdn.net/weixin_39765280/article/details/111248445