天天看点

Loki:云原生日志分析系统运维笔记,简介、部署与使用一、Loki简介二、部署Loki三、Loki的使用

Loki:云原生日志分析系统运维笔记,简介、部署与使用一、Loki简介二、部署Loki三、Loki的使用

一、Loki简介

1.1 Loki是什么?🎆

[项目地址]:https://github.com/grafana/loki

[官方文档]:https://grafana.com/docs/loki/latest/

Loki

Grafana Labs

团队最新的开源项目,是一个水平可扩展,高可用性,多租户的==日志聚合系统==。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。

与其他日志系统不同,Loki 是围绕仅索引有关日志的元数据的想法构建的:标签(就像 Prometheus 标签一样)。然后,日志数据本身会被压缩并以块的形式存储在对象存储(例如 S3 或 GCS)中,甚至本地存储在文件系统中。小索引和高度压缩的块简化了操作并显着降低了 Loki 的成本。

Loki采用Go语言开发

1.2 Loki架构解析🦖

  • Loki: 主服务器,负责日志的存储和查询,参考了Prometheus的服务发现机制,将标签添加到日志流,而不是是像其它平台一样进行全文索引;
  • Promtail:负责收集日志并将其发送给Loki,主要用于发现采集目标及添加对应Label,最终发送给Loki;
  • Grafana:用来展示、查询日志,可在页面查询指定标签Pod的日志;

1.3 版本说明

|-V2.5.0 2022-04-12 🦖发布

|-V2.4.2 2022-01-13 🎊发布

|-V2.3.0 2021-08-07 🥳发布

1.4 日志系统的业务需求

  • 日志保留天数
  • 日志切割
  • 日志审计

二、部署Loki

Loki提供多种安装方式,有二进制、Helm、docker、docker-compose、Tanka等。

基于Helm的几种安装模式

grafana/loki-stack:单体模式

grafana/loki-canary:金丝雀;

grafana/loki-distributed:分布式;微服务模式,适合生产较大规模场景

grafana/loki-simple-scalable:简单可扩展,读写分离模式;

2.1 Loki部署(二进制)

Lovi v2.4.2

Promtail v2.4.3

Grafana v8.3.5

注意:此时不要下载 LogCLI 或 Loki Canary。

 LogCLI允许您在命令行界面中运行 Loki 查询。

 Loki Canary是一个审计 Loki 性能的工具。

2.1.1 安装Loki服务

1)创建工作目录

$ mkdir  /etc/loki/
           

2)下载二进制安装包

$ wget https://github.com/grafana/loki/releases/download/v2.4.2/loki-linux-amd64.zip
$ unzip loki-linux-amd64.zip
$ mv loki-linux-amd64  /usr/local/bin/loki
$ loki   -version
loki, version 2.4.2 (branch: HEAD, revision: 525040a32)
           

3)下载配置文件(通用)

$ wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml
$ mv  loki-local-config.yaml /etc/loki/
           

4)启动Loki

$ yum install coreutils
$ nohub  loki  --config.file=/etc/loki/loki-local-config.yaml &
           

会有read、write两个进程。

2.1.2 安装Promtail服务

Promtail服务用于采集日志。

1)创建目录

$ mkdir /etc/promtail
           

2)下载二进制文件

$ wget https://github.com/grafana/loki/releases/download/v2.4.2/promtail-linux-amd64.zip
$ unzip promtail-linux-amd64.zip
$ mv promtail-linux-amd64  /usr/local/bin/promtail 
$ promtail  -version
promtail, version 2.4.2
           

2)下载配置文件

$ wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml
$ mv promtail-local-config.yaml /etc/promtail/
$ vim /etc/promtail/promtail-local-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/*log   #采集的日志文件目录 /var/log/*/*log
           

3)启动Promtail

$ nohup promtail  --config.file=/etc/promtail/promtail-local-config.yaml &
$ ss -ntulp | grep promtail
           

2.1.3 安装Grafana

1)下载二进制包

$ wget https://dl.grafana.com/oss/release/grafana-8.3.5.linux-amd64.tar.gz
$ tar zxvf grafana-8.3.5.linux-amd64.tar.gz
$ mv grafana-8.3.5  /usr/local/grafana
$ cd /usr/local/grafana
$ mv  bin/grafana-server  /usr/local/bin/
$ mv  bin/grafana-cli  /usr/local/bin/
           

2)安装服务器端图像渲染组件

$ yum install -y fontconfig freetype* urw-fonts
           

3)安装grafana的插件

$ rafana-cli plugins list-remote   #查看可以安装的插件
$ grafana-cli plugins install alexanderzobnin-zabbix-app  #zabbix插件
$ grafana-cli plugins install grafana-clock-panel    #时钟插件
           

4)编写服务启动文件

$ vim /usr/lib/systemd/system/grafana-server.service
[Unit]
Description=Grafana
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/grafana-server -homepath /usr/local/grafana
Restart=on-failure

[Install]
WantedBy=multi-user.target
           

-homepath: 指定工作目录;

5)启动Grafana

$ systemctl enable --now grafana-server.service
$ systemctl status  grafana-server.service
           

6)登录Grafana

在浏览器输入主机IP:3000

默认用户名:admin

默认密码:admin 首次登录会进行修改密码操作

默认配置文件位置:/etc/grafana/grafana.ini

默认数据库使用sqlite3位置:/var/lib/grafana/grafana.db 可修改为其他数据库

2.3 Helm部署Loki(单体模式)

单体模式可快速部署一套Loki环境,将多个服务封装到一个Pod中,且未做数据的持久化,主要用于Demo环境,不适合用于生产。

$ kubectl create namespace loki
$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm repo list
$ helm search repo grafana
$ helm pull  grafana/loki-stack  --untar
$ cd loki-stack/
$ vim values.yaml 
grafana:
  enabled: true    #启用Grafana组件
  sidecar:
    datasources:
      enabled: true
      maxLines: 1000
  image:
    tag: 8.3.5
$ helm install loki-stack . -n loki
$ kubectl -n loki  edit  svc loki-stack-grafana
spec:
  type: NodePort
           

2.4 Helm部署Loki(读写分离模式)

Loki提供Helm的安装方式。

其它安装配置:https://grafana.com/docs/loki/latest/installation/helm/

Loki是以StatefulSet控制器部署的,副本数默认为1,且未做数据的持久化,生产需要修改副本数并做持久化。

镜像清单:

 grafana/loki:2.5.0

 docker.io/grafana/loki:2.5.0

 grafana/agent:v0.25.1

 quay.io/prometheus-operator/prometheus-config-reloader:v0.47.0

 nginxinc/nginx-unprivileged:1.19-alpine

 grafana/agent-operator:v0.25.1

loki-v2.4.2

promtail-v2.4.2

grafana-v8.3.5

2.4.1 环境准备

1)创建命名空间

$ kubectl create namespace loki
           

2)安装Helm

如果你已经安装好helm了,可以忽略本步骤。

$ wget https://get.helm.sh/helm-v3.7.2-linux-amd64.tar.gz
$ tar zxvf helm-v3.7.2-linux-amd64.tar.gz
$ cp  linux-amd64/helm  /usr/local/bin/
$ helm versio
           

3)添加Chart仓库

$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm repo list
NAME   	URL
grafana	https://grafana.github.io/helm-charts
$ helm repo update
           

搜索chart

$ helm search repo grafana/loki
           

Loki-stack:将多个进程封装到一个Pod内,未做数据持久化,适用于测试环境;

搜索chart所有版本

$ helm search repo grafana/loki-simp -l

2.4.2 安装Loki

1)下载Chart包

$ helm pull grafana/loki-simple-scalable --untar --version 0.3.3
           

--untar: 下载解压;

--version:指定版本;0.3.3对应是app版本是2.4.2,比较稳定些!

2)修改values.yaml配置

$ cd loki-simple-scalable/
$ vim values.yaml
write:
  persistence:
     storageClass: loki-storage  #指定创建的storageclass名
read:
  persistence:
     storageClass: loki-storage
           

3)安装Loki

$ helm install loki . -n loki
$ helm  -n loki ls
           

4)服务状态验证

查看Pod & Service是否正常!

$ kubectl -n loki get pods
$ kubectl -n loki get svc
           

2.4.3 安装Promtail

为了验证应用是否正常,接下来我们再安装 Promtail 和 Grafana 来进行数据的读写。

获取 promtail 的 Chart 包并解压:

$ helm pull grafana/promtail --untar
$ cd promtail
$ vim values.yaml
image:
  tag: 2.4.2
config:
  clients:
    - url: http://loki-gateway/loki/api/v1/push
           

注意:

我们需要将 Promtail 中配置的 Loki 地址为 http://loki-gateway/loki/api/v1/push,这样就是 Promtail 将日志数据首先发送到 Gateway 上面去,然后 Gateway 根据我们的 Endpoints 去转发给 write 节点.

$ helm install  promtail . -n loki
NAME: promtail
LAST DEPLOYED: Wed Jul  6 21:43:05 2022
NAMESPACE: loki
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
           

2.4.4 安装Grafana

grafana/grafana:9.0.2

$ helm pull grafana/grafana
$ tar zxvf grafana-6.32.1.tgz
$ cd grafana/
$ vim values.yaml
service:
  enabled: true
  type: NodePort    #修改为NodePort
  port: 80
  targetPort: 3000
$ helm install grafana . -n loki
 
$ helm install loki-grafana grafana/grafana
           

登录Grafana

查看Grafana密码

$ kubectl -n loki get secret grafana -o jsonpath="{.data.admin-password}" | base64  --decode ; echo
           

添加数据源-Loki

Explore——Loki

2.5 Helm部署Loki(微服务模式)

本处安装2.4.2版本的Loki

1)搜索Chart包

$ helm search repo grafana/loki-distributed -l |  grep  2.4.2
           

2)下载Chart包

$ helm pull grafana/loki-distributed --untar --version 0.47.4
$ cd loki-distributed/
           

--untar: 下载解压;

--version:指定版本;0.47.4对应是app版本是2.4.2,比较稳定些!

3)修改values.yaml

ingester:
  persistence:
    size: 10Gi
    storageClass: loki-storage
querier:
   persistence:
     size: 10Gi
     storageClass: loki-storage
compactor:
   persistence:
     size: 10Gi
     storageClass: loki-storage
indexGateway:
  enabled: false
#或者:
$ sed  -i '/storageClass/s/null/loki-storage/' values.yaml
           

Install安装

$ helm  install loki . -n  loki
NAME: loki
LAST DEPLOYED: Wed Jul 13 10:07:51 2022
NAMESPACE: loki
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
***********************************************************************
 Welcome to Grafana Loki
 Chart version: 0.47.4
 Loki version: 2.4.2
***********************************************************************
Installed components:
* gateway
* ingester
* distributor
* querier
* query-frontend
           

三、Loki的使用

3.1 Loki语法

Loki是参考Prometheus进行设计的,查询语法和PromQL类似,比如查询命名空间为kube-lidabai下的所有Pod的日志,在Log browser输入{namespace=”kube-lidabai”},然后点击Run query就可以了。
           

Loki语法支持正则表达式、Pipeline;

更复杂的语法:https://grafana.com/docs/loki/latest/logql

查看指定命名空间&指定Pod的日志:

{namespace= "kube-lidabai ",pod=~"lidabai.*"}

过滤包含avg的字段的日志

{namespace= "kube-lidabai ",pod=~"lidabai.*" |~ "avg"}

还可以使用logfmt对日志进行格式化,然后进行值的判断;

例如:找到包含avg的字段,并且longest的值大于16ms的日志

{namespace= "kube-lidabai ",pod=~"lidabai.*" |~ "avg" | logfmt | longest > 16ms}

值匹配

{namespace= "kube-lidabai ",pod=~"lidabai.*" |~ "avg" | logfmt | longest > 16ms and avg > 6ms}

3.2 Loki开启多租户