基于AWS EKS集群部署Loki日志系统

Loki日志系统和ELK对比

Loki和ELK(Elasticsearch、Logstash、Kibana)都是用于处理和可视化日志数据的流行工具。选择哪个更好取决于你的具体需求、环境和偏好。以下是它们之间的一些比较:

Loki:

  1. 架构:
    • Loki 是由 Grafana 实现的,专为云原生环境设计。
    • 使用标签索引(label-based indexing)的方式来存储和查询日志数据。
  2. 存储:
    • 使用可扩展的对象存储(如 Amazon S3、GCS)进行长期存储。
    • 支持使用块存储进行短期存储。
  3. 开销:
    • 对于存储来说相对较轻量,可以处理大量日志数据。
  4. 适用场景:
    • 适用于云原生和容器化环境,特别是与 Kubernetes 结合使用。
  5. 成本:
    • 可能在存储方面的成本相对较低,尤其是对于长期存储。

ELK (Elasticsearch, Logstash, Kibana):

  1. 架构:
    • ELK 是一个集成的堆栈,包括 Elasticsearch 作为存储、Logstash 作为数据处理引擎、以及 Kibana 作为可视化工具。
  2. 存储:
    • Elasticsearch 通常用于存储和索引日志数据。
  3. 开销:
    • 相对来说,ELK 可能需要更多的资源和配置来处理大量的日志数据。
  4. 适用场景:
    • 适用于各种环境,从传统服务器到容器化环境都可以使用。
  5. 成本:
    • 可能在存储方面的成本相对较高,尤其是对于大规模的长期存储。

选择因素:

  1. 环境和工作负载: 如果你在 Kubernetes 或云原生环境中,LOKI 可能更适合,而 ELK 在传统环境中也能发挥作用。
  2. 存储成本: 如果对存储成本比较敏感,LOKI 的存储成本可能较低。
  3. 易用性和部署: ELK 提供一个完整的、一站式的解决方案,而 LOKI 更轻量、易于部署。
  4. 社区和生态系统: ELK 拥有庞大的社区支持和生态系统,而 LOKI 在这方面相对较新。
  5. 性能和可扩展性: ELK 可能需要更多的资源,但也可能提供更多的性能和可扩展性。

综合考虑以上因素,选择 LOki 还是 ELK 取决于你的具体需求、预算和环境。在实际使用之前,最好进行一些小规模的测试和评估,以确保选择符合你的实际需求。

Loki介绍

Loki 是 Grafana Labs 团队的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容设置索引,而是为每个日志流设置一组标签(就像 Prometheus 标签一样),官方的介绍就是:Like Prometheus, but for logs.,类似于 Prometheus 的日志系统

基于AWS EKS集群部署Loki日志系统

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

基于AWS EKS集群部署Loki日志系统

获取 loki-stack 的 Chart 包:

helm pull grafana/loki-stack --untar --version 2.8.0
tree -L 2 loki-stack
基于AWS EKS集群部署Loki日志系统

创建Bucket,和IAM,记录相关配置

新加坡创建一个Bucket(sg-eks-logs;arn:aws:s3:::sg-eks-logs)
创建IAM用户(iam-loki-s3),创建授权策略(sg-eks-logs-rules)授权给Bucket,,绑定权限策略到用户

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

记录用户accessid和accesskey

基于AWS EKS集群部署Loki日志系统

编辑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
基于AWS EKS集群部署Loki日志系统
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负载均衡和日志最大显示行数

基于AWS EKS集群部署Loki日志系统

安装loki:

helm upgrade --install loki -n loki -f values.yaml .

确保pod都是running状态后获取service

基于AWS EKS集群部署Loki日志系统

获取grafana密码,通过service地址测试登录,用户名为admin:

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

S3查看Bucket内数据:

基于AWS EKS集群部署Loki日志系统

登录Grafana网页界面:

输入service地址登录:

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

添加loki仪表盘

基于AWS EKS集群部署Loki日志系统

https://grafana.com/grafana/dashboards/15141

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

查询日志:

在Explore查询日志(推荐使用仪表盘):

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

Logql语法匹配内容

=: 完全匹配
!=: 不匹配
=~: 正则表达式匹配
!~: 正则表达式不匹配
|=:日志行包含的字符串
!=:日志行不包含的字符串
|~:日志行匹配正则表达式
!~:日志行与正则表达式不匹配

Logql语法参考文档:https://grafana.com/docs/loki/latest/logql/

仪表盘查询和搜索日志

打开配置好的仪表盘

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

在仪表盘界面可以导出日志,支持格式为.csv和.txt:

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

修改仪表盘最大查询行,减少可以减短加载时间及服务器压力

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

可以保存仪表盘相关设置及状态,方便下次使用

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

通过 api 查询 loki 中日志(大量日志更推荐):

记录svc LoadBalancer地址

基于AWS EKS集群部署Loki日志系统

需要暴露loki服务

vi ~/.bash_profile
# loki
export LOKI_ADDR=http://a543XXXXXXXXXXXXX.ap-southeast-1.elb.amazonaws.com:3100
source ~/bash_profile

查询有哪些labels

logcli labels

基于AWS EKS集群部署Loki日志系统

使用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

基于AWS EKS集群部署Loki日志系统

输入邀请用户名和邮件信息,如果没有配置SMPT可以关闭邮件发送,submit

基于AWS EKS集群部署Loki日志系统

创建好之后,点击Pending Invites --> Copy Invite

基于AWS EKS集群部署Loki日志系统

复制的IP地址是localhost:3000,我们这里改为自己的域名,设置新用户的密码,登录注册

基于AWS EKS集群部署Loki日志系统

添加Team

Configuration-> Teams--> Add Team,输入Team名称,即可创建新Team,这里创建名称为poolweb的Team

基于AWS EKS集群部署Loki日志系统

添加Team User

鼠标点击刚才创建好的Team,Team Members处Add member可添加用户到此Team中:

基于AWS EKS集群部署Loki日志系统

将dashboard授权给特定用户

假设我们将 dashboard(Loki Kubernetes Logs for poolweb) 授权给用户poolweb

基于AWS EKS集群部署Loki日志系统

可以选择读、编辑、管理员三种权限,这里给了poolweb组读权限

基于AWS EKS集群部署Loki日志系统

控制dashboard中的特定标签下的内容进行展示,可以通过标签来限制用户可访问的命名空间、容器等

基于AWS EKS集群部署Loki日志系统
基于AWS EKS集群部署Loki日志系统

保存dashboard

基于AWS EKS集群部署Loki日志系统

登录poolweb用户检查

基于AWS EKS集群部署Loki日志系统

发布者:LJH,转发请注明出处:https://www.ljh.cool/35573.html

(5)
上一篇 2023年4月5日 下午10:57
下一篇 2023年4月20日 上午1:26

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注