用 Ansible 定制 Loki 部署

运维或平台团队早已依靠指标的可见性迅速响应问题,而曾经,想对日志也做到这一点还只是梦想。幸运的是,Grafana Loki 改变了日志技术栈,让日志具备与指标同等的可见性。

原文写作时,随着 Loki 3.0 的发布,作者建议尚未使用 Loki 的读者开始尝试。

针对不同部署模式,可选择 Helm、Tanka、Docker 或 Docker Compose、本地安装、从源码安装等多种方式,详见Grafana Loki 安装指南。

这些安装方式各有用途,能让你按具体场景灵活部署。不过,这里要介绍另一种方案:Ansible Loki Role。它支持 Debian、Ubuntu 和 Red Hat,最初从 Voidquark 的 Loki 仓库迁移至 Grafana Ansible collection。我很高兴参与这个 role 的持续维护与改进。

出于可扩展性考虑,Loki 部署主要围绕 Kubernetes 展开。但如果你还没走到这一步,只想进行实验,或者组织规模较小、已经熟悉 Ansible,又希望部署 Loki,这个方案就很适合。下面开始配置这个 Ansible role。

开始前需要准备什么

  • 部署好 Ansible 控制节点。
  • 在控制节点安装 Ansible Grafana collection。
  • 阅读 Ansible Loki Role 的 README。
  • 创建简单的默认 playbook,或按需求定制。

以下假定你已经配置好 Ansible,并阅读 Loki role 的 README。先安装 Ansible Grafana collection:

ansible-galaxy collection install grafana.grafana

使用默认部署

先演示采用默认配置的开箱即用部署。创建名为 function_loki-default.play 的 playbook,用默认设置部署 Loki:

- name: Deploy Loki using the default configuration
  hosts: loki
  become: true
  roles:
    - role: grafana.grafana.loki

执行 playbook:

ansible-playbook function_loki-default.play

至此,默认部署流程完成。不过,大多数人还会按需求调整配置。接下来看看如何定制。

定制部署

你可以按需要配置各组件。下面的示例使用:

  • 文件系统存储。
  • 与 Alertmanager 配合的 ruler。
  • 一条简单的 SSH 告警规则。
  • 保留周期为四周的 compactor。
  • 其他自定义参数。

创建名为 function_loki-customized.play 的 playbook:

- name: Deploy Loki using the local filesystem
  hosts: loki
  become: true
  roles:
    - role: grafana.grafana.loki
  vars:
    loki_querier:
      max_concurrent: 16
      engine:
        max_look_back_period: 672h
    loki_storage_config:
      tsdb_shipper:
        active_index_directory: "{{ loki_working_path }}/tsdb-index"
        cache_location: "{{ loki_working_path }}/tsdb-cache"
      filesystem:
        directory: "{{ loki_working_path }}/chunks"
    loki_ingester:
      wal:
        enabled: true
        dir: "{{ loki_working_path }}/wal"
      lifecycler:
        address: 127.0.0.1
        ring:
          kvstore:
            store: inmemory
          replication_factor: 1
        final_sleep: 0s
      chunk_idle_period: 1h
      max_chunk_age: 2h
      chunk_target_size: 1048576
      query_store_max_look_back_period: 672h
    loki_limits_config:
      split_queries_by_interval: 0
      reject_old_samples: true
      reject_old_samples_max_age: 168h
      max_query_length: 0
      max_query_series: 50000
      retention_period: 672h
      allow_structured_metadata: false
      max_query_lookback: 672h
    loki_compactor:
      working_directory: "{{ loki_working_path }}/compactor"
      compaction_interval: 10m
      retention_enabled: true
      retention_delete_delay: 2h
      retention_delete_worker_count: 150
      delete_request_store: filesystem
    loki_common:
      path_prefix: "{{ loki_working_path }}"
      storage:
        filesystem:
          rules_directory: "{{ loki_working_path }}/rules"
      replication_factor: 1
      ring:
        instance_addr: 127.0.0.1
        kvstore:
          store: inmemory
    loki_ruler:
      rule_path: "{{ loki_working_path }}/rules_tmp"
      ring:
        kvstore:
          store: inmemory
      enable_api: true
      enable_alertmanager_v2: true
      alertmanager_url: http://localhost:9093
    loki_ruler_alerts:
      - name: Logs.sshd
        rules:
        - alert: SshLoginFailed
          expr: |
            count_over_time({job=~"secure"} |="sshd[" |~": Failed|: Invalid|: Connection closed by authenticating user" | __error__="" [15m]) > 6
          for: 0m
          labels:
            severity: critical
          annotations:
            summary: "{% raw %}SSH authentication failure (instance {{ $labels.instance }}).{% endraw %}"
            description: "{% raw %}Increase of SSH authentication failures in last 15 minutes\\n VALUE = {{ $value }}{% endraw %}"

执行补充:保存定制 playbook 后,还需要执行 ansible-playbook function_loki-customized.play,才能应用这份配置;先确认 inventory 中的 loki 主机组指向预期目标。原文没有为定制配置单独列出这一步命令。

定制实例部署后,下一步是把日志发送到 Loki。可以使用 Grafana Alloy 或 Promtail 等方式;这些方式见发送日志文档。

日志进入 Loki 后,可以用 LogCLI 或 Grafana 查询。通过 Grafana 浏览日志前,要先在 Grafana 实例中连接 Loki 数据源。如果你通过 Ansible 部署 Grafana,Grafana role 也在同一个 collection 中:可以在 inventory 中配置数据源,再次运行 Grafana Ansible role。

若未使用该 role,可按数据源管理文档添加数据源。

设置完成后,打开 Grafana URL 下的 /explore,选择 Loki 数据源,即可开始探索日志,详见Grafana 日志探索文档。

还有一点:这个 role 是幂等的,会按 inventory 中的配置部署 Loki。如果要清理并移除整个部署,使用 loki_uninstall 标签。不指定标签时,role 以部署模式运行。

ansible-playbook function_loki-customized.play -t loki_uninstall

下一步

按以上步骤,你的 Loki 实例已经运行起来;下面假定日志正在传入。继续学习时,可以制作符合需求的仪表盘。寻找灵感时,可看看 NGINX 日志仪表盘或作者的仪表盘,包括 SSH Logs、Promtail Monitoring、SUDO Logs 和 Nextcloud Logs,它们都以 Loki 为数据源。也可以继续阅读 Loki 配置文档和 Loki role 文档。

祝部署顺利,享受 Loki 的探索过程。如果管理 Loki 技术栈让你感到负担,也可以考虑 Grafana Cloud,通过托管服务管理日志。

原文:How to customize your Loki deployment with Ansible;Michal Vaško,2024年7月6日,Grafana Labs。作者是 cloudWerkstatt 的 DevOps 工程师,热爱开源与可观测性。依转载授权汉化,保留原作者署名和完整配置。文中的第一人称指原作者。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容