EKS日志收集方案-PLG(Promtail+Loki+Grafana)

组件概述(什么是PLG?)

  • Promtail:日志收集代理,它通常被部署到需要监视应用程序的每台机器/容器上。Promtail主要是用来发现目标、将标签附加到日志流以及将日志推送到Loki。截止到目前,Promtail可以跟踪两个来源的日志:本地日志文件和systemd日志(仅支持AMD64架构)。
  • Loki:
  • Grafana:

特点和优势(为什么要用PLG?)

  • 成本低,Loki可以实现数据存储与计算解耦并对数据进行压缩,之后再将其存放到S3或GCS等,这相比于传统日志收集方案(ELK/EFK)将数据存储到磁盘的方式成本更低,容错更高。
  • 效率高,es中的日志数据作为非结构化JSON对象存储在磁盘上,每个对象的所有内容都会被索引。而Loki中的日志数据带有一组标签和值,且只有这组标签会被索引,这相比于es的完整索引方式更快,效率更高。

EKS部署PLG-本地索引/存储

备注:此部分亦可适用于原生Kubernetes集群

  1. 添加helm repo并更新
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
  1. 安装PLG到指定ns,其中grafana.enabled=true选项可以将Grafana一起进行部署。
    (这里安装的chart为2.5.0版本的loki-stack)
kubectl create namespace loki
helm upgrade --install loki --namespace=loki grafana/loki-stack --version 2.5.0 --set grafana.enabled=true
  1. 访问granfana UI(以Node port访问为例)
  • 暴漏Node端口以访问grafana ui
kubectl -n loki expose deployment loki-grafana --port=3000 --target-port=3000 --type=NodePort --name=grafana-ui
  • 获取grafana默认登陆密码
kubectl get secret --namespace loki loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

默认登陆用户名为:admin
打开:并输入默认用户名、密码访问grafana

  1. 查询日志
    登陆成功之后点击grafana侧边栏选择进入Explore界面,选择Loki数据源,选择Logs标签,最后在Logs Lables输入标签的查询条件,例如{namespace=“loki”},点击右上角Run Query即可获取相关日志。

扩展:PLG+AWS DynamoDB+AWS S3

备注:将Loki索引放在AWS Dynamo DB,数据存储放在AWSS3以充分利用云上资源减轻运维管理负担,降低数据存储成本。

  1. 配置AWS权限
    EKS日志收集方案-PLG(Promtail+Loki+Grafana)_第1张图片
    详细参考官方文档。

  2. 导出配置文件loki.yaml到本地

kubectl get secrets loki -n loki -o "jsonpath={.data['loki\.yaml']}" | base64 -d >> loki.yaml
  1. 修改loki.yaml
    备注:主要修改schema_config和storage_config即可
schema_config:
  configs:
    from: "2020-10-24"
    index:
      period: 0
      prefix: loki_index
    object_store: s3
    schema: v11
    store: aws
server:
  http_listen_port: 3100
storage_config:
  aws:
    s3: s3://cn-north-1/loki-test
    dynamodb:
      dynamodb_url: dynamodb://cn-north-1

schema_config中store:aws指定索引存储,object_store:s3指定日志存储,此处period值为0目的是保证所有索引信息都存储到一个表里,否则loki将会为每个时间段都单独创建表。prefix为表名称。
其他配置详细项参考官方文档。
4. 将修改后的loki.yaml更新到secret

kubectl -n loki create secret generic loki --from-file=./loki.yaml -o yaml --dry-run=client | kubectl apply -f -
  1. 重启stateful pod
kubectl -n loki rollout restart statefulset loki
  1. 检查日志
kubectl -n loki logs -f loki-0

如日志信息如下,则表示运行正常:
2022-09-15 17:58:53
level=info ts=2022-09-15T09:58:53.318001255Z caller=table_manager.go:531 msg=“provisioned throughput on table, skipping” table=loki_ read=300 write=1000
2022-09-15 17:58:52
level=info ts=2022-09-15T09:58:52.307757644Z caller=table_manager.go:324 msg=“synching tables” expected_tables=1

FQA

1.日志报错 “RequestCanceled: request context canceled\ncaused by: context deadline exceeded”
检查节点配置的AWS 权限是否正确。

你可能感兴趣的:(DevOps,grafana,kubernetes,容器)