將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
http://192.168.140.71:3000/
因為在資源配置檔案中配置了
所以可以看到已經有了loki的資料來源
點選explore就可以進行查詢操作
訪問minio
http://192.168.140.71:9001/login
配置部分
設定了使用者名稱密碼以及建立了儲存桶