介绍常见的 Loki 安装部署方式
部署模式
- 参考
- Loki 程序基于微服务架构设计,有多个组件构成,常见的部署模块包括:
all
单体模式:将所有微服务组件打包部署到单一进程中
- 适合小规模系统的日志存储场景(每天不错过100G)
- 必要时,可部署共享外部对象存储来水平扩展
- 在配置文件
loki.yaml
的 ring 配置 secion 中定义日志数据的跨实例分发
- 支持高可用的部署方式
- 多个实例需要配置共享的外部对象存储
- 需要设定合理的复制因子
individual
微服务模式
simple scalable deployment
模式包括 read
, write
, backend
Component |
individual |
all |
read |
write |
backend |
Distributor |
x |
x |
|
x |
|
Ingester |
x |
x |
|
x |
|
Query Frontend |
x |
x |
x |
|
|
Query Scheduler |
x |
x |
|
|
x |
Querier |
x |
x |
x |
|
|
Index Gateway |
x |
|
|
|
x |
Compactor |
x |
x |
|
|
x |
Ruler |
x |
x |
|
|
x |
Bloom Compactor (Experimental) |
x |
|
|
|
x |
Bloom Gateway (Experimental) |
x |
|
|
|
x |
单体模式(all)
- 参考
- 环境依赖
- 部署的组件
- Loki Server
- 3100 read/write
- 7946
- 9095
- Grafana
- Promtail
- MinIO
- 9000 api
- 9001 console, 账号信息:loki/supersecret
- gateway
- Flog 专用于生成 http 服务访问日志示例
# 1. Create a directory called evaluate-loki
mkdir evaluate-loki && cd evaluate-loki
# 2. Download loki-config.yaml, promtail-local-config.yaml, and docker-compose.yaml
wget https://raw.githubusercontent.com/grafana/loki/v2.9.8/examples/getting-started/loki-config.yaml -O loki-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/v2.9.8/examples/getting-started/promtail-local-config.yaml -O promtail-local-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/v2.9.8/examples/getting-started/docker-compose.yaml -O docker-compose.yaml
# 3. Deploy the sample Docker image
docker-compose up -d
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
evaluate-loki-gateway-1 nginx:latest "sh -euc 'cat <<EOF …" gateway About a minute ago Up 17 seconds (healthy) 80/tcp, 0.0.0.0:3100->3100/tcp, :::3100->3100/tcp
evaluate-loki-grafana-1 grafana/grafana:10.2.6-ubuntu "sh -euc 'mkdir -p /…" grafana About a minute ago Up 16 seconds (health: starting) 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
evaluate-loki-loggen-apache-combined-1 mingrammer/flog:0.4.3 "flog -f apache_comb…" loggen-apache-combined About a minute ago Up 21 seconds
evaluate-loki-loggen-apache-common-1 mingrammer/flog:0.4.3 "flog -f apache_comm…" loggen-apache-common About a minute ago Up 21 seconds
evaluate-loki-loggen-json-1 mingrammer/flog:0.4.3 "flog --loop --forma…" loggen-json About a minute ago Up 21 seconds
evaluate-loki-minio-1 minio/minio "sh -euc 'mkdir -p /…" minio About a minute ago Up 21 seconds (healthy) 0.0.0.0:9001->9001/tcp, :::9001->9001/tcp, 0.0.0.0:32800->9000/tcp, :::32800->9000/tcp
evaluate-loki-promtail-1 grafana/promtail:2.9.8 "/usr/bin/promtail -…" promtail About a minute ago Up 16 seconds 0.0.0.0:32805->9080/tcp, :::32805->9080/tcp
evaluate-loki-read-1 grafana/loki:2.9.8 "/usr/bin/loki -conf…" read About a minute ago Up 18 seconds (health: starting) 0.0.0.0:3101->3100/tcp, :::3101->3100/tcp, 0.0.0.0:32803->7946/tcp, :::32803->7946/tcp, 0.0.0.0:32801->9095/tcp, :::32801->9095/tcp
evaluate-loki-write-1 grafana/loki:2.9.8 "/usr/bin/loki -conf…" write About a minute ago Up 18 seconds (health: starting) 0.0.0.0:3102->3100/tcp, :::3102->3100/tcp, 0.0.0.0:32804->7946/tcp, :::32804->7946/tcp, 0.0.0.0:32802->9095/tcp, :::32802->9095/tcp
# 4. (Optional) Verify that the Loki cluster is up and running
$ curl http://localhost:3101/ready
ready
$ curl http://localhost:3102/ready
ready
# 监控指标
curl http://localhost:3101/metrics
curl http://localhost:3102/metrics
# 配置
curl http://localhost:3101/config
curl http://localhost:3102/config
# 当前Memberlist Status、KV Store、Memberlist Cluster Members、Message History
http://localhost:3101/memberlist
http://localhost:3102/memberlist
# 5. (Optional) Verify that Grafana Alloy is running.
$ curl http://localhost:3000
---
server:
http_listen_port: 3100
memberlist:
join_members:
- loki:7946
schema_config:
configs:
- from: 2021-08-01
store: boltdb-shipper
object_store: s3
schema: v11
index:
prefix: index_
period: 24h
common:
path_prefix: /loki
replication_factor: 1
storage:
s3:
endpoint: minio:9000
insecure: true
bucketnames: loki-data
access_key_id: loki
secret_access_key: supersecret
s3forcepathstyle: true
ring:
kvstore:
store: memberlist
ruler:
storage:
s3:
bucketnames: loki-ruler
---
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://gateway:3100/loki/api/v1/push
tenant_id: tenant1
# scrape_configs:
# - job_name: flog_scrape
# docker_sd_configs:
# - host: unix:///var/run/docker.sock
# refresh_interval: 5s
# relabel_configs:
# - source_labels: ['__meta_docker_container_name']
# regex: '/(.*)'
# target_label: 'container'
scrape_configs:
- job_name: loggen_apache_common
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
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+)$'
- labels:
status:
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'
- job_name: generated-logs
static_configs:
- targets:
- localhost
labels:
job: generated-logs
__path__: /var/log/generated-logs.txt
pipeline_stages:
- json:
expressions:
http_method: 'method'
http_status: "status"
- labels:
http_method:
http_status:
---
version: "3.8"
networks:
loki:
services:
read:
image: &lokiImage grafana/loki:2.9.8
command: "-config.file=/etc/loki/config.yaml -target=read"
ports:
- 3101: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:
- loki
write:
image: *lokiImage
command: "-config.file=/etc/loki/config.yaml -target=write"
ports:
- 3102:3100
- 7946
- 9095
volumes:
- ./loki-config.yaml:/etc/loki/config.yaml
healthcheck:
test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]
interval: 10s
timeout: 5s
retries: 5
depends_on:
- minio
networks:
<<: *loki-dns
promtail:
image: grafana/promtail:2.9.8
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:
- gateway
networks:
- loki
minio:
image: minio/minio
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=supersecret
- 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
grafana:
#image: grafana/grafana:latest
image: grafana/grafana:10.2.6-ubuntu
environment:
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
depends_on:
- gateway
- read
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://gateway: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" ]
interval: 10s
timeout: 5s
retries: 5
networks:
- loki
gateway:
image: nginx:latest
depends_on:
- read
- write
entrypoint:
- sh
- -euc
- |
cat <<EOF > /etc/nginx/nginx.conf
user nginx;
worker_processes 5; ## Default: 1
events {
worker_connections 1000;
}
http {
resolver 127.0.0.11;
server {
listen 3100;
location = / {
return 200 'OK';
auth_basic off;
}
location = /api/prom/push {
proxy_pass http://write:3100\$$request_uri;
}
location = /api/prom/tail {
proxy_pass http://read:3100\$$request_uri;
proxy_set_header Upgrade \$$http_upgrade;
proxy_set_header Connection "upgrade";
}
location ~ /api/prom/.* {
proxy_pass http://read:3100\$$request_uri;
}
location = /loki/api/v1/push {
proxy_pass http://write:3100\$$request_uri;
}
location = /loki/api/v1/tail {
proxy_pass http://read:3100\$$request_uri;
proxy_set_header Upgrade \$$http_upgrade;
proxy_set_header Connection "upgrade";
}
location ~ /loki/api/.* {
proxy_pass http://read:3100\$$request_uri;
}
}
}
EOF
/docker-entrypoint.sh nginx -g "daemon off;"
ports:
- "3100:3100"
healthcheck:
test: ["CMD", "service", "nginx", "status"]
interval: 10s
timeout: 5s
retries: 5
networks:
- loki
# flog:
# image: mingrammer/flog
# command: -f json -d 1s -l
# networks:
# - loki
# for testing purposes only, disable in production
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/
loggen-apache-combined:
image: *flogImage
command: -f apache_combined -d 2000ms -l
networks:
- loki
loggen-apache-common:
image: *flogImage
command: -f apache_common -d 1500ms -l
networks:
- loki
loki:
image: grafana/loki:2.9.8
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
grafana
- grafana 默认配置了 loki 的 datasource
- 访问
http://localhost:3000
打开 grafana,在 Home
-> Connections
-> Configuration
-> Data sources
可以看到 loki 已经配置
- 点击
loki
进入配置页,点击 Test
测试成功
- 点击左侧的
Explore
进入 logQL 编写页面,支持两种模式
- Builder logQL 构建器
- Code 手动写 logQL
minio
- 访问 127.0.0.1:9001 账号信息:loki/supersecret
- 默认创建 2 个 bucket
模拟日志
使用 mingrammer/flog
生成了模拟日志,直接参考了马哥的配置,生成的文件:
ls loki/generated-logs.txt
loki/generated-logs.txt
使用 Docker 安装 loki
mkdir loki
cd loki
wget https://raw.githubusercontent.com/grafana/loki/v2.9.2/cmd/loki/loki-local-config.yaml -O loki-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/v2.9.2/clients/cmd/promtail/promtail-docker-config.yaml -O promtail-config.yaml
docker run --name loki -d -v $(pwd):/mnt/config -p 3100:3100 grafana/loki:2.9.2 -config.file=/mnt/config/loki-config.yaml
docker run --name promtail -d -v $(pwd):/mnt/config -v /var/log:/var/log --link loki grafana/promtail:2.9.2 -config.file=/mnt/config/promtail-config.yaml
Helm
配置