单体模式部署Loki服务
将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.7
command: "-config.file=/etc/loki/config.yaml -target=all" #添加参数-target=all
ports:
- 3100:3100
- 7946
- 9095
volumes:
- ./loki-config.yaml:/etc/loki/config.yaml
depends_on:
- minio
healthcheck:
......
完整配置文件
.
├── 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.7
user: root
entrypoint:
- "chown"
- "10001:10001"
- "/loki"
volumes:
- ./loki:/loki
networks:
- loki
loki:
image: *lokiImage
command: "-config.file=/etc/loki/config.yaml -target=all"
ports:
- 3100:3100
- 7946
- 9095
volumes:
- ./loki-config.yaml:/etc/loki/config.yaml
depends_on:
- minio
healthcheck:
test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]
interval: 10s
timeout: 5s
retries: 5
networks: &loki-dns
loki:
aliases:
- gateway
grafana:
#image: grafana/grafana:latest
image: grafana/grafana:10.2.6-ubuntu
environment:
- 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=false
user: '0'
volumes:
- ./grafana:/var/lib/grafana
- ./provisioning:/etc/grafana/provisioning
depends_on:
- loki
entrypoint:
- sh
- -euc
- |
mkdir -p /etc/grafana/provisioning/datasources
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
url: http://loki:3100
jsonData:
httpHeaderName1: "X-Scope-OrgID"
secureJsonData:
httpHeaderValue1: "tenant1"
EOF
/run.sh
ports:
- "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: 10s
timeout: 5s
retries: 5
networks:
- loki
# for testing purposes only, disable in production
# 生成json类型的日志
loggen-json:
image: &flogImage mingrammer/flog:0.4.3
command:
- --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=log
volumes:
- ./loki/:/var/log/
# 生成combined类型的日志
loggen-apache-combined:
image: *flogImage
command: -f apache_combined -d 2000ms -l
networks:
- loki
# 生成common类型的日志
loggen-apache-common:
image: *flogImage
command: -f apache_common -d 1500ms -l
networks:
- loki
promtail:
image: grafana/promtail:2.9.7
volumes:
- ./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.yaml
ports:
- 9080
depends_on:
- loki
networks:
- loki
minio:
image: minio/minio:RELEASE.2024-04-18T19-09-19Z
entrypoint:
- 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=off
ports:
- "9000"
- "9001:9001"
volumes:
- ./.data/minio:/data
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ]
interval: 15s
timeout: 20s
retries: 5
networks:
- loki
loki配置文件
loki-config.yaml
---
server:
# 配置 Loki 的 HTTP 监听端口。这里设置为 3100
http_listen_port: 3100
memberlist:
# 配置 Loki 的成员列表。这里设置了一个成员,地址为 loki:7946
join_members:
- loki:7946
# 用于配置 Loki 的数据存储模式。
# 设置一个配置,从 2021 年 8 月 1 日开始,使用 tsdb 存储引擎,s3 对象存储,v13 模式。
# 索引前缀设置为 index_,索引内存存储周期设置为 24 小时。
schema_config:
configs:
- from: 2021-08-01
store: tsdb
object_store: s3
schema: v13
index:
prefix: index_
period: 24h
# 配置 Loki 的通用设置
common:
# 设置路径前缀为 /loki 就比如如果要push数据上来,那路径就应该是/loki/api/v1/push
path_prefix: /loki
# 副本因子为 1
replication_factor: 1
# 存储设置使用 S3 存储,连接到 MinIO 服务器,端点设置为 minio:9000,启用不安全模式
# 使用 loki-data 存储桶,访问密钥 ID 为 loki,访问密钥为 111111111,强制使用路径风格。
storage:
# 连接minio
s3:
endpoint: minio:9000
insecure: true
bucketnames: loki-data
access_key_id: loki
secret_access_key: 111111111
s3forcepathstyle: 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/push
tenant_id: tenant1
# 配置日志源加载各种日志,并处理各种日志
scrape_configs:
# 配置一个名为 loggen_apache_common 的作业,使用 Docker 服务发现从 Docker 套接字获取日志源。
- job_name: loggen_apache_common
docker_sd_configs:
- host: unix:///var/run/docker.sock
# 每 5 秒刷新一次服务发现配置
refresh_interval: 5s
# 过滤 Docker 容器名称,只收集名称为 loggen-apache-common 的容器的日志
filters:
- name: name
values: ['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 标签重命名为 container
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container'
- job_name: container_scrape
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
filters:
- name: name
values: ['loggen-apache-combined']
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container'
# 收集 /var/log/generated-logs.txt 文件中的日志
- job_name: generated-logs
static_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
因为在资源配置文件中配置了
所以可以看到已经有了loki的数据源
点击explore就可以进行查询操作
访问minio
http://192.168.140.71:9001/login
配置部分
设置了用户名密码以及创建了存储桶
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/18308569
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2023-07-18 go通过API的方式操作docker
2023-07-18 go语言读取docker容器的日志
2023-07-18 go语言中动态读取日志