單體模式部署Loki服務

厚礼蝎發表於2024-07-18

將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

配置部分

設定了使用者名稱密碼以及建立了儲存桶

相關文章