使用 Grafana 和 Loki 搭建 Milvus 日志查询系统

2024-08-07

By Zilliz

使用 Grafana 和 Loki 搭建 Milvus 日志查询系统

本教程将介绍如何设置 Grafana 和 Loki 来有效监控您的 Milvus 实例。

Milvus 是一款分布式向量数据库,可高效存储、索引和管理万亿级 Embedding 向量,是搭建 AI 和 ML 应用的首选向量数据库系统。

Grafana 是一个开源的指标监控平台,提供可视化的指标和日志界面,允许用户自定义创建仪表板以监控系统状态和性能。本教程中将 Loki 与 Grafana 配合使用形成日志聚合系统的灵感来源于 Prometheus——以高效且低成本地方式管理日志。Grafana 和 Loki 共同构成了可靠的监控设置。

前提条件

  • Docker:确保您已安装 Docker。
  • Kubernetes:确保您已准备好 Kubernetes 集群。您可以在本地开发中使用 minikubek3d,或者在生产环境中使用由云服务供应商提供的 Kubernetes 服务。
  • Helm:确保您已安装 Helm 用于管理 Kubernetes 应用。您可以查看文档了解如何安装 Helm
  • Kubectl:确保您已安装 kubectl,一款用于与 Kubernetes 集群进行交互的命令行工具。具体功能包含部署应用、检查和管理集群资源、查看日志等。

设置 K8s

运行 K8s 集群:

minikube start

检查 K8s 集群状态:

kubectl cluster-info

您需要在 K8s 上部署 Milvus。更多详情,请参考指南

部署 Grafana

Grafana 是一个可视化的指标分析和交互平台,提供了丰富多样的图表、图形和告警,允许用户查询指标、生成可视化指标视图、创建告警。

使用 Helm 安装 Grafana:

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install grafana grafana/grafana --namespace grafana --create-namespace

查看运行状态。

 ❯ kubectl get all -n grafana                                                                                                        
NAME                          READY   STATUS    RESTARTS      AGE
pod/grafana-987d4c5c6-sb8t9   1/1     Running   1 (58m ago)   47h

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/grafana   ClusterIP   10.43.114.168   <none       80/TCP    47h

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/grafana   1/1     1            1           47h

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/grafana-987d4c5c6   1         1         1       47h

部署 Loki 和 Promtail

Loki 是一个日志聚合系统,用于高效管理日志。Loki 使用 Promtail 来聚合日志。Promtail 是一个日志收集代理,专为 Loki 设计,负责收集、标记并将日志发送到 Loki。您会看到每个 Kubernetes 节点上都运行着一个 Promtail 实例。

Loki 有着一套独特的日志索引方式。Loki 不会对日志的实际文本进行索引。相反,日志被智能地分组到日志流中,然后用标签进行索引。这种方法显著降低了成本,并缩短了日志获取到查询可用之间的时间,实现高效资源管理。

Loki 支持不同的方式部署:

  1. 单体模式:这种模式中,Loki 的所有组件都在单个进程中运行。它适合较小且简单的应用规模。
  2. 可扩展模式:这种模式中,Loki 的组件被分解为独立的服务,如分发器、摄取器、查询器等。这种设置设计适用于高可用性和可扩展性应用,非常适合大规模部署。这种模式需要一个兼容 S3 的对象存储来存储日志数据,例如 AWS S3、Google Cloud Storage 或者自托管解决方案,如 MinIO。

安装 Loki:

helm upgrade --install loki grafana/loki-distributed -n grafana-loki --create-namespace

上述命令将会在grafana-loki namespace 中安装 Loki. 如指定 namespace 不存在,Helm 将会自动为您创建一个该名称的 namespace。

查看运行状态:

❯ kubectl get all -n grafana-loki
NAME                                                        READY   STATUS    RESTARTS      AGE
pod/loki-loki-distributed-distributor-6b75796c6b-qvdbc      1/1     Running   1 (68m ago)   28h
pod/loki-loki-distributed-querier-0                         1/1     Running   1 (68m ago)   28h
pod/loki-loki-distributed-query-frontend-55574bdd64-5hhvl   1/1     Running   1 (68m ago)   28h
pod/loki-loki-distributed-ingester-0                        1/1     Running   1 (68m ago)   28h
pod/loki-loki-distributed-gateway-c6ccc655b-mkg5j           1/1     Running   0             67m
NAME                                                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
service/loki-loki-distributed-memberlist                ClusterIP   None           <none>        7946/TCP                     47h
service/loki-loki-distributed-ingester-headless         ClusterIP   None           <none>        3100/TCP,9095/TCP            47h
service/loki-loki-distributed-query-frontend-headless   ClusterIP   None           <none>        3100/TCP,9095/TCP,9096/TCP   47h
service/loki-loki-distributed-ingester                  ClusterIP   10.43.13.160   <none>        3100/TCP,9095/TCP            47h
service/loki-loki-distributed-querier-headless          ClusterIP   None           <none>        3100/TCP,9095/TCP            47h
service/loki-loki-distributed-distributor               ClusterIP   10.43.201.9    <none>        3100/TCP,9095/TCP            47h
service/loki-loki-distributed-query-frontend            ClusterIP   10.43.99.40    <none>        3100/TCP,9095/TCP,9096/TCP   47h
service/loki-loki-distributed-gateway                   ClusterIP   10.43.186.50   <none>        80/TCP                       47h
service/loki-loki-distributed-querier                   ClusterIP   10.43.53.211   <none>        3100/TCP,9095/TCP            47h
NAME                                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/loki-loki-distributed-distributor      1/1     1            1           47h
deployment.apps/loki-loki-distributed-query-frontend   1/1     1            1           47h
deployment.apps/loki-loki-distributed-gateway          1/1     1            1           47h
NAME                                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/loki-loki-distributed-distributor-6b75796c6b      1         1         1       47h
replicaset.apps/loki-loki-distributed-query-frontend-55574bdd64   1         1         1       47h
replicaset.apps/loki-loki-distributed-gateway-c6ccc655b           1         1         1       47h
NAME                                              READY   AGE
statefulset.apps/loki-loki-distributed-querier    1/1     47h
statefulset.apps/loki-loki-distributed-ingester   1/1     47h

安装 Promtail:

安装前需要先进行配置,以便实现 Promtail 与 Loki 间的交互。具体而言,需要编辑配置文件,输入 Loki service URL:

  1. 获取默认 Promtail 配置:
helm show values grafana/promtail > promtail-overrides.yaml

上述命令将默认 Promtail 配置写入一个名为 promtail-overrides.yaml 的文件。后续,您可以按需修改此配置文件。

  1. 编辑默认 Promtail 配置:

编辑 promtail-overrides.yaml 文件,将clients.url 的值修改为正确的 Loki service endpoint。您可以使用 Loki 的 DNS 名称作为 service endpoint。 本示例中使用 loki-loki-distributed-gateway.grafana-loki.svc.cluster.local。

s1.png s1.png

注意:如果您将 Loki 部署在其他的 namespace 中,请同步修改 URL。更多详情,请参考 K8s 文档。

  1. 使用修改后的配置文件部署 Promtail :
helm upgrade --install --values promtail-overrides.yaml promtail grafana/promtail -n grafana-loki

上述命令根据您的配置使用 Helm 在 grafana-loki namespace 中安装 Promtail。设置完成后,Promtail 就能够将日志发送至 Loki,实现日志聚合功能。 同样,检查运行状态:

❯ kubectl get all -n grafana-loki | grep promtail                                                                                    pod/promtail-qgl4t                                          1/1     Running   1 (77m ago)   28h
daemonset.apps/promtail   1         1         1       1            1           <none>          2d

配置 Grafana 数据源和面板

安装设置完 Loki 和 Promtail 后,需要将 Loki 作为数据源集成到 Grafana 中,从而实现日志可视化和查询功能。
连接至 Grafana:首先,需要先连接至 Grafana 实例。如果在您的 K8s 集群中运行 Grafana,请使用 port forwarding 将你的本地机器连接至 Grafana。
kubectl port-forward service/grafana 8080:80 -n grafana 
  1. 登录 Grafana:默认 Grafana 用户名为 admin. 请使用下方命令获取安装时自动生成的密码。
kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo 

s2.png s2.png

  1. 前往 Data Sources 页面:成功登录后,点击侧边栏中的 Connection 标志,选择 Data Source。

  2. 添加 Loki:点击 "Add data source" 按钮,搜索并选中 Loki。 您将自动跳转至 Loki 数据源设置页面。 333.png 333.png

  3. 设置 Loki 数据源:输入 Loki service URL。本例中使用默认配置: http://loki-loki-distributed-gateway.grafana-loki.svc.cluster.local 444.png 444.png

  4. 保存并测试配置:点击"Save & Test"按钮。 Grafana 会确认是否成功连接至 Loki 数据源。 555.png 555.png

查看日志

现在我们可以查看日志啦!我们可以添加过滤条件,过滤app 名称,筛选出 milvus 相关日志,用于检查 Milvus 是否正常运行。

666.png 666.png

如果日志结果和以上截图相似,那么恭喜您!您已成功使用 Grafana 和 Loki 搭建了一个 Milvus 监控系统!

  • Zilliz

    Zilliz

    准备好开始了吗?

    立刻创建 Zilliz Cloud 集群,存储和检索您的向量。

    免费试用 Zilliz Cloud