日志聚合工具loki



封面圖片來自於 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)。

更多內容可參考官方說明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM