日志聚合分析系统——Lokinode
什么是Loki?git
Loki 是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计很是经济高效且易于操做,由于它不会为日志内容编制索引,而是为每一个日志流编制一组标签,专门为 Prometheus 和 Kubernetes 用户作了相关优化。github
与传统日志收集系统(例ELK)相比,Loki的优点有哪些?算法
解决痛点?docker
无需再去其余界面,或者终端上查看单个Pod的日志数据库
总体架构vim
Loki的架构并不难,主要是如下三部分组成:服务器
Loki 使用与 Prometheus 相同的服务发现和标签从新标记库,编写了 Promtail。在 Kubernetes 中 Promtail 以 DaemonSet 方式运行在每一个节点中,经过 Kubernetes API 获得日志的正确元数据,并将它们发送到Loki,以下图:架构
能够看到,Loki中主要的组件有Distributor、Ingester和Querier三个。app
负责写入的组件有Distributor和Ingester两个:
Distributor
Promtaif 一旦将日志发送给Loki,Distributor 就是第一个接收日志的组件。因为日志的写入量可能很大,因此不能在它们传入时并行写入数据库,要先进行批处理和压缩数据。
Ingester
Ingester 接收到日志并开始构建 Chunk:
Ingester 是一个有状态组件,负责构建和刷新Chunk,当Chunk达到必定数量或者时间后,刷新到存储中去,每个流日志对应一个Ingester。index和Chunk各自使用单独的数据库,由于他们存储额数据类型不一样。
负责读的组件则是Querier:
读取就比较简单,由 Querier 负责给定一个时间范围和标签选择器,也就是收到读请求:
搭建使用
上边主要介绍的Loki的工做流程及组件,下面咱们实际搭建操做下:
Loki项目地址:https://github.com/grafana/loki/
1、经过Helm部署:
## 添加chart helm repo add loki https://grafana.github.io/loki/charts ## 更新chart helm repo update ## 将loki template下载到本地 helm fetch loki/loki-stack ## 解压并自定义修改参数 tar zxvf loki-stack-2.0.2.tgz cd loki-stack/ $$ ls charts Chart.yaml README.md requirements.lock requirements.yaml templates values.yaml cd charts/ $$ ls filebeat fluent-bit grafana logstash loki prometheus promtail
开始helm安装前要注意几个点:
一、能够修改values.yaml文件,指定是否开启Grafana、Prometheus等服务,默认不开启的:
loki: enabled: true promtail: enabled: true fluent-bit: enabled: false grafana: enabled: true sidecar: datasources: enabled: true image: tag: 6.7.0 prometheus: enabled: false
在此只开启Grafana
修改Grafana的values.yaml,使其Service暴露方式为NodePort(默认为ClusterIp):
vim charts/grafana/values.yaml
service: type: NodePort port: 80 nodePort: 30002 # 端口范围:30000-32767 targetPort: 3000 # targetPort: 4181 To be used with a proxy extraContainer annotations: {} labels: {} portName: service
还有一处帐号密码能够自定义修改下:
# Administrator credentials when not using an existing secret (see below)
adminUser: admin
adminPassword: admin
2、promtail服务在构建时会自动挂载:
这就须要特别注意一下,若是是修改过docker默认的存储路径的,须要将mount的路径进行修改,promtail找不到对应的容器日志
具体docker 存储路径,可使用docker info 命令查询
vim charts/promtail/values.yaml
volumes: - name: docker hostPath: path: /data/lib/docker/containers ## 个人是放在了data下 - name: pods hostPath: path: /var/log/pods volumeMounts: - name: docker mountPath: /data/lib/docker/containers ## 挂载点也要进行修改 readOnly: true
- name: pods mountPath: /var/log/pods readOnly: true
开始安装:
helm install -n loki --namespace loki -f values.yaml ../loki-stack 2020/11/11 17:18:54 Warning: Merging destination map for chart 'logstash'. The destination item 'filters' is a table and ignoring the source 'filters' as it has a non-table value of: <nil> NAME: loki LAST DEPLOYED: Wed Nov 11 17:18:53 2020 NAMESPACE: loki STATUS: DEPLOYED RESOURCES: ==> v1/ClusterRole NAME AGE loki-promtail-clusterrole 1s loki-grafana-clusterrole 1s ==> v1/ClusterRoleBinding NAME AGE loki-promtail-clusterrolebinding 1s loki-grafana-clusterrolebinding 1s ==> v1/ConfigMap NAME DATA AGE loki-grafana 1 1s loki-grafana-test 1 1s loki-loki-stack 1 1s loki-loki-stack-test 1 1s loki-promtail 1 1s ==> v1/DaemonSet NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE loki-promtail 2 2 0 2 0 <none> 1s ==> v1/Deployment NAME READY UP-TO-DATE AVAILABLE AGE loki-grafana 0/1 1 0 1s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE loki-0 0/1 ContainerCreating 0 2s loki-grafana-56bf5d8d-8zcgp 0/1 Init:0/1 0 2s loki-promtail-6r24r 0/1 ContainerCreating 0 2s loki-promtail-fvnfc 0/1 ContainerCreating 0 2s ==> v1/Role NAME AGE loki-promtail 1s loki-grafana-test 1s loki 1s ==> v1/RoleBinding NAME AGE loki-promtail 1s loki-grafana-test 1s loki 1s ==> v1/Secret NAME TYPE DATA AGE loki Opaque 1 1s loki-grafana Opaque 3 1s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE loki ClusterIP 10.109.216.219 <none> 3100/TCP 1s loki-grafana NodePort 10.100.203.138 <none> 80:30002/TCP 1s loki-headless ClusterIP None <none> 3100/TCP 1s ==> v1/ServiceAccount NAME SECRETS AGE loki 1 1s loki-grafana 1 1s loki-grafana-test 1 1s loki-promtail 1 1s ==> v1/StatefulSet NAME READY AGE loki 0/1 1s ==> v1beta1/PodSecurityPolicy NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES loki false RunAsAny MustRunAsNonRoot MustRunAs MustRunAs true configMap,emptyDir,persistentVolumeClaim,secret,projected,downwardAPI loki-grafana false RunAsAny RunAsAny RunAsAny RunAsAny false configMap,emptyDir,projected,secret,downwardAPI,persistentVolumeClaim loki-grafana-test false RunAsAny RunAsAny RunAsAny RunAsAny false configMap,downwardAPI,emptyDir,projected,secret loki-promtail false RunAsAny RunAsAny RunAsAny RunAsAny true secret,configMap,hostPath,projected,downwardAPI,emptyDir ==> v1beta1/Role NAME AGE loki-grafana 1s ==> v1beta1/RoleBinding NAME AGE loki-grafana 1s
建立完成后,经过暴露的svc访问Grafana:
[root@Centos8 loki-stack]# kubectl get svc -n loki NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE loki ClusterIP 10.109.216.219 <none> 3100/TCP 113s loki-grafana NodePort 10.100.203.138 <none> 80:30002/TCP 113s loki-headless ClusterIP None <none> 3100/TCP 113s
2、开始使用Loki
经过服务器ip+30002访问,登陆成功后,有一点须要注意的地方,也是很是容易踩坑的地方!!!
若是是安装Loki时采用的以上方法,开启了Grafana,那系统会自动配置好Data sources,应该不会有什么问题。
可是,若是是手动搭建的Grafana,须要手动添加Data Sources时,必定注意:
数据源名称中的Loki,L必定要是大写!!!
若是不是大写,会致使链接不到Loki源,通常回报错:Error connecting to datasource: Loki: Bad Gateway. 502
若是是Loki,L大写,结局彻底不同
数据源添加完毕后,开始查看日志
点击Explore,能够看到选择labels的地方
如下是labels的展示形式
选择一个app:grafana的标签查看一下
默认Loki会将stdout(正常输出)类型和stderr(错误输出)类型所有展现出来
若是只想查看stderr错误输出类型的日志,能够点击stderr旁边的放大镜来展现:
此时显示的所有为错误日志
除了这种办法,还能够直接经过上边的搜索栏,进行自定义的筛选,具体的语法问题,能够再自行查询学习。
还能够查看 Prometheus 的 metrics 信息:
Loki的搭建及简单的使用就到此结束了