Loki 安装部署

发布时间: 更新时间: 总字数:1705 阅读时间:4m 作者: IP上海 分享 网址

介绍常见的 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
      • 3000
    • Promtail
    • MinIO
      • 9000 api
      • 9001 console, 账号信息:loki/supersecret
    • gateway
      • 3100
    • 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
loki-config.yaml ...
---
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
promtail-local-config.yaml ...
---
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:
docker-compose.yaml ...
---
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 也可以合并为一个服务,参考
  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
    • loki-data
    • loki-ruler

模拟日志

使用 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

配置

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数