将Loki的所有微服务组件打包部署到单一进程中
适合小规模系统的日志存储场景(每天不超过100G)
在必要时,可部署共享外部对象存储的多实例进行水平扩容
- 在配置文件loki.yaml的ring配置段中定义日志数据的跨实例分发
支持高可的部署方式
- 多个实例需要配置共享的外部对象存储
- 需要设定合理的复制因子
最简单的操作模式是整体部署模式。
可以通过设置命令行参数来启用整体模式。此模式将 Loki 的所有微服务组件作为单个二进制或 Docker 映像在单个进程中运行。
需要给loki加个参数-target=all
部署
本地快速部署Loki Stack
- 依赖环境:docker和docker-compose
- 示例组件
- Loki Server
- Grafana
- Promtail
- MinIO
- Flog:专用于用生成http服务访问日志的示例
整体架构
主要的loki参数-target=all
networks:loki:volumes:loki:grafana:services:loki:image: grafana/loki:2.9.7command: "-config.file=/etc/loki/config.yaml -target=all" #添加参数-target=allports:- 3100:3100- 7946- 9095volumes:- ./loki-config.yaml:/etc/loki/config.yamldepends_on:- miniohealthcheck:......
完整配置文件
.
├── docker-compose.yaml
├── loki-config.yaml
└── promtail-local-config.yaml
docker-compose.yaml文件
networks:loki:services:# Since the Loki containers are running as user 10001 and the mounted data volume is owned by root,# Loki would not have permissions to create the directories.# Therefore the init container changes permissions of the mounted directory.init:image: &lokiImage grafana/loki:2.9.7user: rootentrypoint:- "chown"- "10001:10001"- "/loki"volumes:- ./loki:/lokinetworks:- lokiloki:image: *lokiImagecommand: "-config.file=/etc/loki/config.yaml -target=all"ports:- 3100:3100- 7946- 9095volumes:- ./loki-config.yaml:/etc/loki/config.yamldepends_on:- miniohealthcheck:test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]interval: 10stimeout: 5sretries: 5networks: &loki-dnsloki:aliases:- gatewaygrafana:#image: grafana/grafana:latestimage: grafana/grafana:10.2.6-ubuntuenvironment:- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource- GF_PATHS_PROVISIONING=/etc/grafana/provisioning# 开启免密登录#- GF_AUTH_ANONYMOUS_ENABLED=true#- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin# 设置密码- GF_SECURITY_ADMIN_PASSWORD=111111# 不允许注册- GF_USERS_ALLOW_SIGN_UP=falseuser: '0'volumes:- ./grafana:/var/lib/grafana- ./provisioning:/etc/grafana/provisioningdepends_on:- lokientrypoint:- sh- -euc- |mkdir -p /etc/grafana/provisioning/datasourcescat <<EOF > /etc/grafana/provisioning/datasources/ds.yamlapiVersion: 1datasources:- name: Lokitype: lokiaccess: proxyurl: http://loki:3100jsonData:httpHeaderName1: "X-Scope-OrgID"secureJsonData:httpHeaderValue1: "tenant1"EOF/run.shports:- "3000:3000"healthcheck:# test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" ]test: [ "CMD-SHELL", "curl --silent --fail http://localhost:3000/api/health || exit 1" ]interval: 10stimeout: 5sretries: 5networks:- loki# for testing purposes only, disable in production# 生成json类型的日志loggen-json:image: &flogImage mingrammer/flog:0.4.3command:- --loop- --format=json- --number=1 # number of log lines to generate per second- --delay=1000ms # delay between log lines- --output=/var/log/generated-logs.txt- --overwrite- --type=logvolumes:- ./loki/:/var/log/# 生成combined类型的日志loggen-apache-combined:image: *flogImagecommand: -f apache_combined -d 2000ms -lnetworks:- loki# 生成common类型的日志loggen-apache-common:image: *flogImagecommand: -f apache_common -d 1500ms -lnetworks:- lokipromtail:image: grafana/promtail:2.9.7volumes:- ./promtail-local-config.yaml:/etc/promtail/config.yaml:ro- /var/run/docker.sock:/var/run/docker.sock- ./loki/:/var/log/command: -config.file=/etc/promtail/config.yamlports:- 9080depends_on:- lokinetworks:- lokiminio:image: minio/minio:RELEASE.2024-04-18T19-09-19Zentrypoint:- sh- -euc- |mkdir -p /data/loki-data && \mkdir -p /data/loki-ruler && \minio server /data --console-address ":9001"environment:- MINIO_ROOT_USER=loki- MINIO_ROOT_PASSWORD=111111111- MINIO_PROMETHEUS_AUTH_TYPE=public- MINIO_UPDATE=offports:- "9000"- "9001:9001"volumes:- ./.data/minio:/datahealthcheck:test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ]interval: 15stimeout: 20sretries: 5networks:- loki
loki配置文件
loki-config.yaml
---
server:# 配置 Loki 的 HTTP 监听端口。这里设置为 3100http_listen_port: 3100
memberlist:# 配置 Loki 的成员列表。这里设置了一个成员,地址为 loki:7946join_members:- loki:7946# 用于配置 Loki 的数据存储模式。
# 设置一个配置,从 2021 年 8 月 1 日开始,使用 tsdb 存储引擎,s3 对象存储,v13 模式。
# 索引前缀设置为 index_,索引内存存储周期设置为 24 小时。
schema_config:configs:- from: 2021-08-01store: tsdbobject_store: s3schema: v13index:prefix: index_period: 24h
# 配置 Loki 的通用设置
common:# 设置路径前缀为 /loki 就比如如果要push数据上来,那路径就应该是/loki/api/v1/pushpath_prefix: /loki# 副本因子为 1replication_factor: 1# 存储设置使用 S3 存储,连接到 MinIO 服务器,端点设置为 minio:9000,启用不安全模式# 使用 loki-data 存储桶,访问密钥 ID 为 loki,访问密钥为 111111111,强制使用路径风格。storage:# 连接minios3:endpoint: minio:9000insecure: truebucketnames: loki-dataaccess_key_id: lokisecret_access_key: 111111111s3forcepathstyle: true# 配置 Loki 的环形存储。这里使用 memberlist 作为键值存储。ring:kvstore:store: memberlist
# 配置 Loki 的规则存储。这里使用 S3 存储,存储桶名称为 loki-ruler
ruler:storage:s3:bucketnames: loki-ruler
promtail的配置文件
promtail-local-config.yaml
---
server:# 设置监听端口http_listen_port: 9080# 设置 gRPC 监听端口,这里设置为 0,表示不启用 gRPC 监听grpc_listen_port: 0# 部分用于配置 Promtail 保存日志读取位置信息的文件。这里设置为 /tmp/positions.yaml
positions:filename: /tmp/positions.yaml# 配置 Promtail 将处理后的日志发送到 Loki 的接口。
# 这里设置了一个客户端,将日志发送到 http://loki:3100/loki/api/v1/push,并设置租户 ID 为 tenant1,后面grafana也会用到租户,他们在同一租户下才能获取到相同的内容
clients:- url: http://loki:3100/loki/api/v1/pushtenant_id: tenant1# 配置日志源加载各种日志,并处理各种日志
scrape_configs:# 配置一个名为 loggen_apache_common 的作业,使用 Docker 服务发现从 Docker 套接字获取日志源。- job_name: loggen_apache_commondocker_sd_configs:- host: unix:///var/run/docker.sock# 每 5 秒刷新一次服务发现配置refresh_interval: 5s# 过滤 Docker 容器名称,只收集名称为 loggen-apache-common 的容器的日志filters:- name: namevalues: ['loggen-apache-common']# 定义处理日志的管道阶段pipeline_stages:- regex:#expression: '^(?P<remote_host>\S+) (?P<user_identifier>\S+) (?P<user>\S+) \[(?P<ts>[^\]]+)\] \"(?P<request>[^\"]+)\" (?P<status>\d+) (?P<bytes_sent>\d+)$'#expression: '^(?P<_>\S+) (?P<_>\S+) (?P<_>\S+) \[(?P<_>[^\]]+)\] \"(?P<_>[^\"]+)\" (?P<status>\d+) (?P<_>\d+)$'# 用正则表达式取出匹配到的内容expression: '^.* (?P<status>\d+) (?P<_>\d+)$'# 然后将取出来的内容添加到日志流的标签中,标签名是status- labels:status:# 重新标记源标签。这里将 __meta_docker_container_name 标签重命名为 containerrelabel_configs:- source_labels: ['__meta_docker_container_name']regex: '/(.*)'target_label: 'container'- job_name: container_scrape docker_sd_configs:- host: unix:///var/run/docker.sockrefresh_interval: 5sfilters:- name: namevalues: ['loggen-apache-combined']relabel_configs:- source_labels: ['__meta_docker_container_name']regex: '/(.*)'target_label: 'container'# 收集 /var/log/generated-logs.txt 文件中的日志- job_name: generated-logsstatic_configs:- targets:- localhost# 设置作业标签和日志文件路径标签labels:job: generated-logs__path__: /var/log/generated-logs.txt# 定义处理日志的管道阶段pipeline_stages:# 用json格式解析,然后提取出method字段的值,给http_method变量 提取status字段的值,给http_status变量- json:expressions:http_method: 'method'http_status: "status"# 然后将这两个变量添加到标签中- labels:http_method:http_status:
启动
$ docker compose up -d
$ docker compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
loki-grafana-1 grafana/grafana:10.2.6-ubuntu "sh -euc 'mkdir -p /…" grafana 8 hours ago Up 8 hours (unhealthy) 0.0.0.0:3000->3000/tcp, ::
loki-init-1 grafana/loki:2.9.7 "chown 10001:10001 /…" init 8 hours ago Exited (0) 8 hours ago
loki-loggen-apache-combined-1 mingrammer/flog:0.4.3 "flog -f apache_comb…" loggen-apache-combined 8 hours ago Up 8 hours
loki-loggen-apache-common-1 mingrammer/flog:0.4.3 "flog -f apache_comm…" loggen-apache-common 8 hours ago Up 8 hours
loki-loggen-json-1 mingrammer/flog:0.4.3 "flog --loop --forma…" loggen-json 8 hours ago Up 8 hours
loki-loki-1 grafana/loki:2.9.7 "/usr/bin/loki -conf…" loki 8 hours ago Up 8 hours (healthy) 0.0.0.0:3100->3100/tcp, ::2810->7946/tcp, 0.0.0.0:32809->9095/tcp, :::32809->9095/tcp
loki-minio-1 minio/minio:RELEASE.2024-04-18T19-09-19Z "sh -euc 'mkdir -p /…" minio 8 hours ago Up 8 hours (healthy) 0.0.0.0:9001->9001/tcp, ::2808->9000/tcp
loki-promtail-1 grafana/promtail:2.9.7 "/usr/bin/promtail -…" promtail 8 hours ago Up 8 hours 0.0.0.0:32811->9080/tcp, :
测试访问
curl 127.0.0.1:3100/ready
curl 127.0.0.1:3100/services
curl 127.0.0.1:3100/memberlist
访问grafana
http://192.168.140.71:3000/
因为在资源配置文件中配置了
所以可以看到已经有了loki的数据源
点击explore就可以进行查询操作
访问minio
http://192.168.140.71:9001/login
配置部分
设置了用户名密码以及创建了存储桶