【本文内容】
- 通过
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展示。
【需要的知识】
- 【k8s学习】Kubernetes新手学习,4小时视频笔记总结:www.jianshu.com/p/7901e01e4…
- 【k8s学习】Helm安装及Hello-world示例:www.jianshu.com/p/f4cc7b0ce…
【参考】
【环境】
- 系统: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 安装
2.1 安装前准备
我准备了两个namespace:
- monitoring: Loki相关的安装
- app: 用来安装测试loki的spring boot application。
2.2 加上Loki的helm chart repository
开始添加官网的repo:
helm repo add grafana grafana.github.io/helm-charts
2.3 升级下版本
helm repo update
2.4 版本选择
官网上目前推荐的是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 packagegrafana/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
2.5.3 检查
helm list -n monitoring
可以看到chart=loki-stack已经安装了:
kubectl get all -n monitoring
可以看到namespace=monitoring下的kubernetes组件都已经下载并运行了:
3. 在本地访问grafana
3.1 查看grafana的kubernetes service
在上述列出来的资源清单中,我们看到有个服务叫loki-grafana。通过kubectl describe service loki-grafana -n monitoring可以看到这个service指向的endpoint ip为172.17.0.10:
查看pod的ip:
kubectl get pod -n monitoring -o wide
可以看到上述的loki-grafana指向的pod为loki-grafana-8568f898cb-s27xb:
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
3.3 本地访问granafa service
我们在本地访问:http://localhost:3000
3.4 登陆grafana
用户名为admin
密码需要查看下本地安装的secrets:
kubectl get secrets -n monitoring
找到grafana使用的secret:
以yaml格式展示:
kubectl get secret loki-grafana -n monitoring -o yaml
复制password,用base64 decode下:
echo "bUJyNktNdjdhcWNhd3Z4ZUhmeHR2aGM4N2xVNGhxVllKMlZXQ0k4aA==" | base64 -d; echo
拿到了grafana的密码为mBr6KMv7aqcawvxeHfxtvhc87lU4hqVYJ2VWCI8h,登陆上述的ui。
登陆后的页面长这样:
3.5 查看loki数据源
左侧Navigate - Configuration - Data sources:
可以看到已经为我们配置了Loki数据源:
可以看到port配置的是3100,即kubernetes service中的loki:
4. 通过LogQL查看日志
左侧Navigate,点击【Explore】:
在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】。
这样即可打印出日志:
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
在Grafana中查看日志:
LogQL={namespace="app"} |= "Tomcat started"的意思是selector取出的是namespace=app,并且log中包含了Tomcat started字符的日志,可以看到两个pod的启动日志,都会被归集到Loki中,并且通过各式各式的LogQL按行进行展示:
可以看到我们在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: