Loki日志系统和ELK对比
Loki和ELK(Elasticsearch、Logstash、Kibana)都是用于处理和可视化日志数据的流行工具。选择哪个更好取决于你的具体需求、环境和偏好。以下是它们之间的一些比较:
Loki:
- 架构:
- Loki 是由 Grafana 实现的,专为云原生环境设计。
- 使用标签索引(label-based indexing)的方式来存储和查询日志数据。
- 存储:
- 使用可扩展的对象存储(如 Amazon S3、GCS)进行长期存储。
- 支持使用块存储进行短期存储。
- 开销:
- 对于存储来说相对较轻量,可以处理大量日志数据。
- 适用场景:
- 适用于云原生和容器化环境,特别是与 Kubernetes 结合使用。
- 成本:
- 可能在存储方面的成本相对较低,尤其是对于长期存储。
ELK (Elasticsearch, Logstash, Kibana):
- 架构:
- ELK 是一个集成的堆栈,包括 Elasticsearch 作为存储、Logstash 作为数据处理引擎、以及 Kibana 作为可视化工具。
- 存储:
- Elasticsearch 通常用于存储和索引日志数据。
- 开销:
- 相对来说,ELK 可能需要更多的资源和配置来处理大量的日志数据。
- 适用场景:
- 适用于各种环境,从传统服务器到容器化环境都可以使用。
- 成本:
- 可能在存储方面的成本相对较高,尤其是对于大规模的长期存储。
选择因素:
- 环境和工作负载: 如果你在 Kubernetes 或云原生环境中,LOKI 可能更适合,而 ELK 在传统环境中也能发挥作用。
- 存储成本: 如果对存储成本比较敏感,LOKI 的存储成本可能较低。
- 易用性和部署: ELK 提供一个完整的、一站式的解决方案,而 LOKI 更轻量、易于部署。
- 社区和生态系统: ELK 拥有庞大的社区支持和生态系统,而 LOKI 在这方面相对较新。
- 性能和可扩展性: ELK 可能需要更多的资源,但也可能提供更多的性能和可扩展性。
综合考虑以上因素,选择 LOki 还是 ELK 取决于你的具体需求、预算和环境。在实际使用之前,最好进行一些小规模的测试和评估,以确保选择符合你的实际需求。
Loki介绍
Loki 是 Grafana Labs 团队的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容设置索引,而是为每个日志流设置一组标签(就像 Prometheus 标签一样),官方的介绍就是:Like Prometheus, but for logs.,类似于 Prometheus 的日志系统
Grafana Loki 主要由 3 部分组成:
- Loki:主服务,日志记录引擎,负责存储日志和处理查询
- Promtail:代理服务,负责收集日志并将其发送给 loki
- Grafana:UI 界面,通过 Web 界面来提供数据展示、查询、告警等功能。
安装部署loki
EKS客户端配置
以MacOS为例,可以在本地家目录下创建一个k8s目录:
mkdir ~/eks && cd ~/eks
helm安装(v3)
# macOS直接安装:
brew install helm
# linux
# 下载二进制包
wget https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
# 解压二进制包
tar zxf helm-v3.5.2-linux-amd64.tar.gz
# 复制可执行文件
cp -pr linux-amd64/helm /usr/local/bin/
# 验证安装是否成功
helm --help
使用 Helm 将 Loki 部署到 K8s 集群
helm repo add grafana https://grafana.github.io/helm-charts
更新仓库
helm repo update
搜索 loki
helm search repo loki
获取 loki-stack 的 Chart 包:
helm pull grafana/loki-stack --untar --version 2.8.0
tree -L 2 loki-stack
创建Bucket,和IAM,记录相关配置
新加坡创建一个Bucket(sg-eks-logs;arn:aws:s3:::sg-eks-logs)
创建IAM用户(iam-loki-s3),创建授权策略(sg-eks-logs-rules)授权给Bucket,,绑定权限策略到用户
记录用户accessid和accesskey
编辑loki-stack/values.yaml,修改配置
创建名称空间loki
kubectl create ns loki
创建accesskeyid和accesskeysecret,以secret形式保存
kubectl create secret generic iam-loki-s3 --from-literal=AWS_ACCESS_KEY_ID='AKIA************' --from-literal=AWS_SECRET_ACCESS_KEY='xBgs****************' -n loki
loki相关参数配置
vim loki-stack/values.yaml
loki:
enabled: true
isDefault: true
url: http://{{(include "loki.serviceName" .)}}:{{ .Values.loki.service.port }}
readinessProbe:
httpGet:
path: /ready
port: http-metrics
initialDelaySeconds: 45
livenessProbe:
httpGet:
path: /ready
port: http-metrics
initialDelaySeconds: 45
datasource:
jsonData: {}
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: iam-loki-s3
key: AWS_ACCESS_KEY_ID
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: iam-loki-s3
key: AWS_SECRET_ACCESS_KEY
config:
schema_config:
configs:
- from: 2021-05-12
store: boltdb-shipper
object_store: s3
schema: v11
index:
prefix: loki_index_
period: 24h
storage_config:
aws:
s3: s3://ap-southeast-1/sg-eks-logs
s3forcepathstyle: true
bucketnames: sg-eks-logs
region: ap-southeast-1
insecure: false
sse_encryption: false
boltdb_shipper:
shared_store: s3
cache_ttl: 24h
chunk_store_config:
max_look_back_period: 168h
table_manager:
retention_deletes_enabled: true
retention_period: 168h
limits_config:
max_entries_limit_per_query: 50000
相关参数:
- table_manager 其中的 retention_period: 168h 就表示保存 168 小时的日志
- max_look_back_period 指的是最大的查询时间
- max_entries_limit_per_query: 50000 表示最多可以加载50000条日志访问请求,这个值默认为5000
配置Grafana负载均衡和日志最大显示行数
安装loki:
helm upgrade --install loki -n loki -f values.yaml .
确保pod都是running状态后获取service
获取grafana密码,通过service地址测试登录,用户名为admin:
kubectl get secret --namespace loki loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
S3查看Bucket内数据:
登录Grafana网页界面:
输入service地址登录:
添加loki仪表盘
https://grafana.com/grafana/dashboards/15141
查询日志:
在Explore查询日志(推荐使用仪表盘):
Logql语法匹配内容
=: 完全匹配
!=: 不匹配
=~: 正则表达式匹配
!~: 正则表达式不匹配
|=:日志行包含的字符串
!=:日志行不包含的字符串
|~:日志行匹配正则表达式
!~:日志行与正则表达式不匹配
Logql语法参考文档:https://grafana.com/docs/loki/latest/logql/
仪表盘查询和搜索日志
打开配置好的仪表盘
在仪表盘界面可以导出日志,支持格式为.csv和.txt:
修改仪表盘最大查询行,减少可以减短加载时间及服务器压力
可以保存仪表盘相关设置及状态,方便下次使用
通过 api 查询 loki 中日志(大量日志更推荐):
记录svc LoadBalancer地址
需要暴露loki服务
vi ~/.bash_profile
# loki
export LOKI_ADDR=http://a543XXXXXXXXXXXXX.ap-southeast-1.elb.amazonaws.com:3100
source ~/bash_profile
查询有哪些labels
logcli labels
使用query功能,配合label查询对应的日志文件
查询namespace="pb-bch-f2pool",pod="sg-bch-common-5dd9fc9b5-pqgqn", 过去48个小时最新的10000 条日志,以json格式导出mylog.json中
logcli query '{namespace="pb-bch-f2pool",pod="sg-bch-common-5dd9fc9b5-pqgqn"}' --limit=10000 --since=48h -o jsonl > mylog.json && cat mylog.json | jq
--limit 限制日志条数, 默认30
-o 输出格式, 有三种default, jsonl, raw. raw 相比default 会抑制日志标签与时间戳的输出
按照日期导出日志:
# UTC时间:
logcli query '{namespace="pb-bch-f2pool",pod="sg-bch-common-5dd9fc9b5-pqgqn"}' --limit=1000 --from="2023-04-18T06:00:00Z" --to="2023-04-18T07:00:00Z" -o raw
# 本地(东八区)时间:
logcli query '{namespace="pb-bch-f2pool",pod="sg-bch-common-5dd9fc9b5-pqgqn"}' --limit=1000 --from="2023-04-18T14:00:00+08:00" --to="2023-04-18T15:00:00+08:00" -o raw
时时查询:
logcli query '{namespace="pb-bch-f2pool",pod="sg-bch-common-5dd9fc9b5-pqgqn"}' -f
支持Logql语法匹配内容:
logcli query '{namespace="pb-bch-f2pool",pod="sg-bch-common-5dd9fc9b5-pqgqn"} |= "height"' --limit=10000 --since=48h -o jsonl > mylog.json
细粒度分割用户权限
针对poolweb dashboard授权给poolweb组方案
创建用户
Configuration-> Users--> Invite
输入邀请用户名和邮件信息,如果没有配置SMPT可以关闭邮件发送,submit
创建好之后,点击Pending Invites --> Copy Invite
复制的IP地址是localhost:3000,我们这里改为自己的域名,设置新用户的密码,登录注册
添加Team
Configuration-> Teams--> Add Team,输入Team名称,即可创建新Team,这里创建名称为poolweb的Team
添加Team User
鼠标点击刚才创建好的Team,Team Members处Add member可添加用户到此Team中:
将dashboard授权给特定用户
假设我们将 dashboard(Loki Kubernetes Logs for poolweb) 授权给用户poolweb
可以选择读、编辑、管理员三种权限,这里给了poolweb组读权限
控制dashboard中的特定标签下的内容进行展示,可以通过标签来限制用户可访问的命名空间、容器等
保存dashboard
登录poolweb用户检查
发布者:LJH,转发请注明出处:https://www.ljh.cool/35573.html