【Monitoring】Grafana Loki在Kubernetes中的安装(超详细)

3,831 阅读5分钟

【本文内容】

  • 通过helm安装standalone mode(或叫Monolithic mode)的loki,即grafana/loki-stack
  • 在安装loki-stack的时候,一并安装Grafana(通过设置chart中的value:grafana.enabled=true)。
  • 在安装lock-stack的时候,一并安装promtail(通过设置chart中的value:promtail.enabled=true)。
  • 登陆Grafana UI。
  • Grafana Explore,通过LogQL(Log query language)查询日志
  • 部署自己的项目到kubernetes,测试日志自动归集到loki上(promtail功能),并通过Grafana展示。

【需要的知识】

【参考】

【环境】

  • 系统:MacOS
  • minikube version: v1.25.2
  • helm: v3.8.2

1. Grafana Loki介绍

Github:github.com/grafana/lok…

Loki是日志聚合系统,官网的介绍是:Loki: like Prometheus, but for logs.

基于Loki的日志系统分三个组件:

  • promtail:代理,用来收集日志,并将收集来的日志发送给loki。
  • loki:主要的服务,用来存储日志(database的功能)。
  • Grafana:用来查询以及展示日志(用到了LogQL)。

2. Grafana loki 安装

官网:grafana.com/docs/loki/l…

2.1 安装前准备

我准备了两个namespace:

  • monitoring: Loki相关的安装
  • app: 用来安装测试loki的spring boot application。

image.png

2.2 加上Loki的helm chart repository

开始添加官网的repo:

helm repo add grafana grafana.github.io/helm-charts

2.3 升级下版本

helm repo update

2.4 版本选择

image.png

官网上目前推荐的是microservices-helm以及simple-scalable-helm:

关于不同的部署模式,看这篇文章:

总结起来就是:

  • microservices模式:Microservices mode is recommended for very large Loki clusters or for clusters that require more control over scaling and cluster operations. 即微服务的部署模式比较适合大型的loki集群。
  • simple-scalable模式:读和写分离,更多关于simple-scalable的模式,可以看这个视频:New in Grafana Loki 2.4: The Simple Scalable Deployment Mode
  • 除了以上两种模式,还有一种是 Standalone mode,即官网上介绍的(Monolithic mode),通过文章( www.sobyte.net/post/2022-0… ),介绍:Installation of the monolithic model is very simple and is done directly using the Helm Chart package grafana/loki-stack.

综上,我采用的是standalone mode,即使用loki-stack进行安装:

2.5 开始安装Lock-stack:
2.5.1 首先查看这个模版使用的values,下载到本地

helm show values grafana/loki-stack > ./loki-stack.yaml

打开loki-stack.yaml可以看到,一些安装的配置。 我们去掉一些默认为false的选项配置,如fluent-bit,prometheus,filebeat,logstash等,然后因为我们需要用到grafana,所以把grafana.enabled置成true,得到的yaml内容为:

loki:
  enabled: true
  isDefault: true

promtail:
  enabled: true
  config:
    lokiAddress: http://{{ .Release.Name }}:3100/loki/api/v1/push

grafana:
  enabled: true
  sidecar:
    datasources:
      enabled: true
      maxLines: 1000
  image:
    tag: 8.3.5

ps.这一步可以不用做,那么在安装的时候只需要--set grafana.enabled=true即可。

2.5.2 开始安装loki-stack

这里我们使用了#2.5.1中修改好的yaml文件充当values进行安装:

helm upgrade --install loki --namespace=monitoring grafana/loki-stack --values ./loki-stack.yaml

image.png

2.5.3 检查

helm list -n monitoring

可以看到chart=loki-stack已经安装了: image.png

kubectl get all -n monitoring

可以看到namespace=monitoring下的kubernetes组件都已经下载并运行了: image.png

3. 在本地访问grafana

3.1 查看grafana的kubernetes service

在上述列出来的资源清单中,我们看到有个服务叫loki-grafana。通过kubectl describe service loki-grafana -n monitoring可以看到这个service指向的endpoint ip为172.17.0.10: image.png

查看pod的ip:

kubectl get pod -n monitoring -o wide

可以看到上述的loki-grafana指向的pod为loki-grafana-8568f898cb-s27xb: image.png

3.2 暴露service

接下来我们要做的是访问这个service。一般来说访问一个service可以通过ingress,或是external service的方式,最最简单的当然还是port-forward下:

从上面的service describe可以看到,service本身的port为80,我们用本地的3000端口转发到kubenetes中的3000:

kubectl -n monitoring port-forward service/loki-grafana 3000:80

image.png

3.3 本地访问granafa service

我们在本地访问:http://localhost:3000

image.png

3.4 登陆grafana

用户名为admin

密码需要查看下本地安装的secrets:

kubectl get secrets -n monitoring

找到grafana使用的secret: image.png

以yaml格式展示:

kubectl get secret loki-grafana -n monitoring -o yaml

image.png

复制password,用base64 decode下:

echo "bUJyNktNdjdhcWNhd3Z4ZUhmeHR2aGM4N2xVNGhxVllKMlZXQ0k4aA==" | base64 -d; echo

image.png

拿到了grafana的密码为mBr6KMv7aqcawvxeHfxtvhc87lU4hqVYJ2VWCI8h,登陆上述的ui。

登陆后的页面长这样: image.png

3.5 查看loki数据源

左侧Navigate - Configuration - Data sources: 可以看到已经为我们配置了Loki数据源: image.png

可以看到port配置的是3100,即kubernetes service中的loki: image.png

4. 通过LogQL查看日志

左侧Navigate,点击【Explore】: image.png

在Log browser中可以通过LogQL来查询日志。 关于LogQL,可查看官方文档:grafana.com/docs/loki/l…

【示例】
我们查看下namespace=monitoring的日志:

  • a. 确保选择的数据库是正确的,即Loki 。
  • b. 点击【Log browser】。
  • c. 按namespace选择,可以看到下面有3个namespace。
  • d. 选择namespace=monitoring。
  • e. 注意日志的时间范围,如果选的太短可能会没有日志,我选择了过去24小时内的日志。
  • f. 按点右上解的【Run query】。

image.png

这样即可打印出日志: image.png

5. 展示应用程序log

我准备了一个Spring boot的项目,写了一个很简单的deployment.yaml,其中replicas: 2即会启动两个pod,用来测试Loki的日志收集功能。

ps.这个项目是非常简单的Spring Boot项目,是我自己本地打包的项目,项目的具体信息,查看:【k8s学习】重写Spring Boot的Property,或者可以用现成的镜像,如nginx测试也是没有问题的。

部署项目,放在namespace=app下:

kubectl apply -f deployment.yaml -n app

image.png

在Grafana中查看日志: LogQL={namespace="app"} |= "Tomcat started"的意思是selector取出的是namespace=app,并且log中包含了Tomcat started字符的日志,可以看到两个pod的启动日志,都会被归集到Loki中,并且通过各式各式的LogQL按行进行展示:

image.png

可以看到我们在kubernetes中部署的项目的日志,会【自动】的归集到Loki中,这一步就是loki中的promtail agent帮忙做的。

LogQL非常强大,还可以按正则表达式进行查询,如:{namespace="app"} |~ "T.+ started"

关于LogQL的语法可参考官网。

比如filter的时候,可以用:

  • |=: Log line contains string
  • !=: Log line does not contain string
  • |~: Log line contains a match to the regular expression
  • !~: Log line does not contain a match to the regular expression

所以上述{namespace="app"} |~ "T.+ started"表示的是取出namespace=app下的日志,字符中有T的,中间无限个字符,但要匹配 started: image.png