运维或平台团队早已依靠指标的可见性迅速响应问题,而曾经,想对日志也做到这一点还只是梦想。幸运的是,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,通过托管服务管理日志。










暂无评论内容