封面圖片來自於 loki官網
1、loki是什么
Loki是一個水平可擴展,高可用性,多租戶的日志聚合系統,受到Prometheus的啟發。它的設計非常經濟高效且易於操作,因為它不會為日志內容編制索引,而是為每個日志流編制一組標簽。官方介紹說到:Like Prometheus, but for logs.
2、loki特點
與其他日志聚合系統相比,Loki:
- 不對日志進行全文索引。通過存儲壓縮的非結構化日志和僅索引元數據,
Loki操作更簡單,運行更便宜。 - 索引和組使用與
Prometheus已使用的相同標簽記錄流,使您可以使用與Prometheus已使用的相同標簽在指標和日志之間無縫切換。 - 特別適合存放
Kubernetes Pod日志; 諸如Pod標簽之類的元數據會被自動刪除和編入索引。 - 在
Grafana有本機支持(已經包含在Grafana 6.0或更新版本中)。
3、loki組成
Loki由3個組成部分組成:
- loki 是主服務器,負責存儲日志和處理查詢。
- promtail 是代理,負責收集日志並將其發送給loki。
- 用戶界面的Grafana。
4、loki安裝
loki的安裝方式包含如下:使用官方的docker鏡像單獨運行、使用helm工具在kubernetes上安裝、使用源碼構建。
本文采用的方法是基於kubernetes環境使用helm安裝。所以前提是需要有一個kubernetes環境並且安裝好了helm。
[root@k8s-qa-master-01 ~]# helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
[root@k8s-qa-master-01 ~]# helm repo list
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local http://127.0.0.1:8879/charts
4.1、添加helm的chart庫
[root@k8s-qa-master-01 ~]# helm repo add loki https://grafana.github.io/loki/charts
"loki" has been added to your repositories
[root@k8s-qa-master-01 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "loki" chart repository
Update Complete.
[root@k8s-qa-master-01 ~]# helm repo list
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local http://127.0.0.1:8879/charts
loki https://grafana.github.io/loki/charts
4.2、安裝loki及promtail
分為以下多種安裝方式:
- 默認安裝
helm upgrade --install loki loki/loki-stack
- 自定義
namespaces安裝
helm upgrade --install loki --namespace=loki-stack loki/loki-stack
- 選擇安裝,只安裝
loki或只安裝promtail
helm upgrade --install loki loki/loki
helm upgrade --install promtail loki/promtail --set "loki.serviceName=loki"
- 自定義配置安裝
方法一:在helm命令中使用--set參數覆蓋默認chart中的配置或者是chart中子chart的配置。
helm upgrade --install loki loki/loki-stack --set "key1=val1,key2=val2,..."
方法二:只下載相應的chart包,下載后修改默認配置再安裝。默認下載的chart包在~/.helm/cache/archive目錄下,例如修改默認promtail收集日志的目錄
[root@k8s-qa-master-01 archive]# pwd
/root/.helm/cache/archive
[root@k8s-qa-master-01 archive]# ls
loki-stack-0.16.3.tgz
[root@k8s-qa-master-01 archive]# tar xf loki-stack-0.16.3.tgz
[root@k8s-qa-master-01 archive]# vim loki-stack/charts/promtail/values.yaml
···
# Extra volumes to scrape logs from
volumes:
- name: docker
hostPath:
path: /data/docker/containers
- name: pods
hostPath:
path: /var/log/pods
volumeMounts:
- name: docker
mountPath: /data/docker/containers
readOnly: false
- name: pods
mountPath: /var/log/pods
readOnly: false
···
修改完配置后進行安裝
[root@k8s-qa-master-01 archive]# helm install ./loki-stack --name=loki --namespace=kube-system
NAME: loki
LAST DEPLOYED: Wed Sep 25 14:29:07 2019
NAMESPACE: kube-system
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 42s
==> v1/ClusterRoleBinding
NAME AGE
loki-promtail-clusterrolebinding 42s
==> v1/ConfigMap
NAME DATA AGE
loki-loki-stack-test 1 44s
loki-promtail 1 44s
==> v1/DaemonSet
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
loki-promtail 5 5 0 5 0 <none> 39s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
loki-0 0/1 Running 0 37s
loki-promtail-2lqzz 0/1 Running 0 36s
loki-promtail-8rpdj 0/1 ContainerCreating 0 37s
loki-promtail-h4lrm 0/1 Running 0 37s
loki-promtail-mbjws 0/1 Running 0 37s
loki-promtail-nj7k4 0/1 Running 0 36s
==> v1/Role
NAME AGE
loki 41s
loki-promtail 41s
==> v1/RoleBinding
NAME AGE
loki 40s
loki-promtail 40s
==> v1/Secret
NAME TYPE DATA AGE
loki Opaque 1 44s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
loki ClusterIP 10.68.3.79 <none> 3100/TCP 39s
loki-headless ClusterIP None <none> 3100/TCP 40s
==> v1/ServiceAccount
NAME SECRETS AGE
loki 1 43s
loki-promtail 1 42s
==> v1/StatefulSet
NAME READY AGE
loki 0/1 39s
==> v1beta1/PodSecurityPolicy
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
loki false RunAsAny MustRunAsNonRoot MustRunAs MustRunAs true configMap,emptyDir,persistentVolumeClaim,secret
loki-promtail false RunAsAny RunAsAny RunAsAny RunAsAny true secret,configMap,hostPath
NOTES:
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.
[root@k8s-qa-master-01 archive]# kubectl get pods -n kube-system|grep loki
loki-0 1/1 Running 0 2m11s
loki-promtail-2lqzz 1/1 Running 0 2m10s
loki-promtail-8rpdj 1/1 Running 0 2m11s
loki-promtail-h4lrm 1/1 Running 0 2m11s
loki-promtail-mbjws 1/1 Running 0 2m11s
loki-promtail-nj7k4 1/1 Running 0 2m10s
4.3、安裝grafana
本步驟的前提是還沒有安裝grafana,如果在安裝loki前已經安裝好,此步驟可忽略
安裝
helm install stable/grafana -n loki-grafana
獲取grafana密碼
kubectl get secret --namespace <YOUR-NAMESPACE> loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
訪問grafana,開啟端口轉發
kubectl port-forward --namespace <YOUR-NAMESPACE> service/loki-grafana 3000:80
如果將Loki和Promtail部署在不同的群集上,則可以在Loki前面添加一個Ingress。通過添加證書,您可以創建一個https端點。為了提高安全性,請在Ingress上啟用基本身份驗證,可參考地址
5、配置和使用
登錄到gfafana,配置loki的數據源

切換到grafana左側區域的Explore,即可進入到loki的頁面

點擊Log labels就可以把當前系統采集的日志標簽給顯示出來,可以根據這些標簽進行日志的過濾查詢,也可直接輸入過濾表達式,如圖所示,過濾出container名稱為jenkins的日志

6、日志選擇和過濾
6.1、日志選擇器
對於查詢表達式的標簽部分,將其用大括號括起來{},然后使用鍵值語法選擇標簽。多個標簽表達式用逗號分隔:
{app="mysql",name="mysql-backup"}
當前支持以下標簽匹配運算符:
- = 完全相等。
- != 不相等。
- =~ 正則表達式匹配。
- !~ 不進行正則表達式匹配。
例子:
{name=~"mysql.+"}
{name!~"mysql.+"}
6.2、日志過濾器
編寫日志流選擇器后,您可以通過編寫搜索表達式來進一步過濾結果。搜索表達式可以只是文本或正則表達式。
查詢示例:
{job="mysql"} |= "error"
{name="kafka"} |~ "tsdb-ops.*io:2003"
{instance=~"kafka-[23]",name="kafka"} != kafka.server:type=ReplicaManager
過濾器運算符可以被鏈接,並將順序過濾表達式-結果日志行將滿足每個過濾器。例如:
{job="mysql"} |= "error" != "timeout"
已實現以下過濾器類型:
- |= 行包含字符串。
- != 行不包含字符串。
- |~ 行匹配正則表達式。
- !~ 行與正則表達式不匹配。
regex表達式接受RE2語法。默認情況下,匹配項區分大小寫,並且可以將regex切換為不區分大小寫的前綴(?i)。
更多內容可參考官方說明
