单体模式部署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

http://192.168.140.71:3000/

因为在资源配置文件中配置了

所以可以看到已经有了loki的数据源

点击explore就可以进行查询操作

访问minio

http://192.168.140.71:9001/login

配置部分

设置了用户名密码以及创建了存储桶

posted @ 2024-07-18 00:36  厚礼蝎  阅读(61)  评论(0编辑  收藏  举报