日志聚合工具loki

琉璃5个月前技术文章111

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 listNAME    URL                                                   stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartslocal

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 updateHang 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 listNAME    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]# lsloki-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 fromvolumes:
- 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-systemNAME:   loki
LAST DEPLOYED: Wed Sep 25 14:29:07 2019NAMESPACE: 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 lokiloki-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)。


相关文章

RabbitMQ 集群部署

RabbitMQ 集群部署

1. 两种模式说到集群,小伙伴们可能第一个问题是,如果我有一个 RabbitMQ 集群,那么是不是我的消息集群中的每一个实例都保存一份呢?这其实就涉及到 RabbitMQ 集群的两种模式:1)普通集群...

MySQL性能优化(四)隐式类型转换

我们知道, where条件中,对一个索引字段进行运算会导致无法使用该字段的索引。有些情况下,即使没有显式地对索引字段进行运算,但是数据库会进行隐式类型转换,这也会导致无法使用索引。会发生隐式类型转换的...

Hive架构图及Hive SQL的执行流程

Hive架构图及Hive SQL的执行流程

1、Hive产生背景MapReduce编程的不便性HDFS上的文件缺少Schema(表名,名称,ID等,为数据库对象的集合)2、Hive是什么Hive的使用场景是什么?基于Hadoop做一些数据清洗啊...

RAC和DG的选择

RAC和DG的选择

RAC和DG的选择一、RAC1、什么是RAC实时应用集群,是负载均衡模式,两台机器同时工作参与到业务系统中,如果其中一个节点出现问题,所有的会话连接会转到另一个节点,保证业务系统正常运行,但是数据只有...

Pod终止-preStop

由于 Pod 所代表的是在集群中节点上运行的进程,当不再需要这些进程时允许其体面地 终止一般不应武断地使用 KILL 信号终止它们设计的目标是令你能够请求删除进程,并且知道进程何时被终止,同时也能够确...

oracle数据库日志清理

1、查看日志执行命令:SQL> show parameter dest;找到audit_file_dest,background_dump_dest,user_dump_dest,core_du...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。