Supervision de Milvus avec Grafana et Loki

Apr 12, 20246 min read

Introduction à la surveillance de Milvus avec Grafana et Loki

Cet article vous guidera dans la configuration de Grafana et Loki pour surveiller efficacement vos déploiements Milvus.

Milvus est une base de données vectorielle distribuée qui vise à stocker, indexer et gérer des vecteurs d’embedding massifs. Sa capacité à indexer et rechercher efficacement parmi des billions de vecteurs fait de Milvus un choix incontournable pour les charges de travail d’IA et de machine learning.

D’autre part, Grafana est une plateforme open-source de surveillance et d’observabilité, idéale pour visualiser des métriques, des journaux et des traces. Elle vous permet de créer des tableaux de bord pour suivre l’état et les performances du système. Loki s’associe à Grafana en tant que système d’agrégation de journaux, en s’inspirant de Prometheus. Il gère les journaux efficacement et à moindre coût. Ensemble, Grafana et Loki offrent une configuration de surveillance solide, renforçant l’observabilité pour Milvus et au-delà.

Prérequis

  • Docker - Assurez-vous que Docker est installé sur votre système.

  • Kubernetes - Préparez un cluster Kubernetes. Vous pouvez utiliser minikube or k3d pour le développement local ou le service Kubernetes d’un fournisseur cloud pour les environnements de production.

  • Helm - Installez Helm, un gestionnaire de paquets pour Kubernetes, afin de vous aider à gérer les applications Kubernetes, vous pouvez consulter notre documentation pour voir comment procéder https://milvus.io/docs/install_cluster-helm.md

  • Kubectl - Installez kubectl, un outil en ligne de commande pour interagir avec les clusters Kubernetes, afin de déployer des applications, inspecter et gérer les ressources du cluster, et consulter les journaux.

Configuration de K8s

Après avoir installé tout le nécessaire pour exécuter un cluster K8s, et si vous avez utilisé minikube, démarrez votre cluster avec :

minikube start

Vérifiez l’état de votre cluster K8s avec :

kubectl cluster-info

⚠️Vous devrez également déployer Milvus sur K8s, consultez notre guide de démarrage pour savoir comment procéder.

Déploiement de Grafana

Grafana est la plateforme d’analyse et de visualisation interactive que nous utiliserons. Elle offre une riche variété de graphiques, diagrammes et alertes. Elle vous permet d’interroger, visualiser et créer des alertes sur vos métriques, quel que soit l’endroit où elles sont stockées.

L’installation se fera avec Helm

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

helm install grafana grafana/grafana --namespace grafana --create-namespace

Vous pouvez vérifier que tout fonctionne correctement en exécutant

 ❯ 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

Déploiement de Loki et Promtail

Loki est un système d’agrégation de journaux inspiré de Prometheus. Il gère les journaux efficacement et à moindre coût. Loki utilise Promtail pour agréger les journaux. Promtail est un agent collecteur de journaux qui collecte, étiquette et envoie les journaux à Loki. Il est explicitement conçu pour Loki. Vous verrez qu’une instance de Promtail s’exécute sur chaque nœud Kubernetes.

L’approche de Loki en matière d’indexation des journaux est unique. Il n’indexe pas le texte réel des journaux. Au lieu de cela, les entrées de journaux sont intelligemment regroupées en flux, puis indexées avec des étiquettes. Cette méthode réduit considérablement les coûts et le délai entre l’ingestion des journaux et leur disponibilité dans les requêtes, offrant un soulagement dans la gestion des ressources.

Loki peut être déployé de différentes manières :

  1. Mode monolithique: Ce mode est simple, tous les composants de Loki s’exécutent au sein d’un seul processus. Il convient aux installations plus petites ou pour se familiariser avec Loki sans trop de complexité.

  2. Mode évolutif: Dans ce mode, les composants de Loki sont divisés en services distincts, tels que les distributors, ingesters, queriers, et autres.
    Cette configuration est conçue pour la haute disponibilité et l’évolutivité, et convient bien aux déploiements à grande échelle. Elle nécessite un stockage d’objets compatible S3 pour stocker les données de logs, qui peut être AWS S3, Google Cloud Storage, ou une solution auto-hébergée comme MinIO.

Pour installer Loki:

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

Cela installera loki dans l’espace de noms grafana-loki. Si l’espace de noms n’existe pas, Helm le créera pour vous.

Assurez-vous que tout fonctionne à nouveau correctement en exécutant ce qui suit:

❯ 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

Pour installer Promtail:

Avant d’installer Promtail, vous devrez le configurer pour communiquer avec Loki. Cela implique de modifier un fichier de configuration afin de spécifier l’URL du service Loki:

  1. Extraire la configuration Promtail par défaut :
helm show values grafana/promtail > promtail-overrides.yaml

Cette commande écrit les valeurs Promtail par défaut dans un fichier nommé promtail-overrides.yaml, que vous pouvez ensuite modifier.

  1. Modifier la configuration Promtail par défaut :

Modifiez promtail-overrides.yaml pour définir la valeur clients.url sur le point de terminaison du service Loki. Dans Kubernetes, les services sont accessibles via des enregistrements DNS, vous pouvez donc utiliser le nom DNS du service Loki : loki-loki-distributed-gateway.grafana-loki.svc.cluster.local

N.B. : Si vous avez déployé Loki dans un autre namespace ou sous un autre nom, ajustez l’URL en conséquence ; n’hésitez pas à consulter la documentation Kubernetes.

  1. Déployer Promtail avec votre fichier de configuration modifié :
helm upgrade --install --values promtail-overrides.yaml promtail grafana/promtail -n grafana-loki

Cette commande indique à Helm de déployer Promtail dans le namespace grafana-loki, en utilisant votre configuration personnalisée. Elle garantit que Promtail est configuré pour transférer les journaux vers Loki, finalisant ainsi votre configuration d’agrégation des journaux.

Comme d’habitude, assurez-vous que tout fonctionne en exécutant :

❯ 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

Configurer les sources de données et le tableau de bord Grafana

Maintenant que Loki et Promtail sont déployés, l’étape suivante consiste à intégrer Loki comme source de données dans Grafana, ce qui vous permet de visualiser et d’interroger vos journaux.

  1. Accéder à Grafana : Tout d’abord, vous devez accéder à votre instance Grafana. Si Grafana s’exécute dans votre cluster Kubernetes, vous pouvez utiliser le transfert de port pour accéder à l’interface Grafana depuis votre machine locale :
kubectl port-forward service/grafana 8080:80 -n grafana 
  1. Se connecter à Grafana : Le nom d’utilisateur par défaut pour Grafana est admin. Pour le mot de passe, Grafana en génère un aléatoire lorsqu’il est installé via Helm. Vous pouvez le récupérer avec :
kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo 

  1. Accéder aux sources de données : Une fois connecté, allez dans la barre latérale de Grafana, trouvez l’icône "Connections", puis sélectionnez "Data Sources".

  2. Ajouter Loki : Cliquez sur le bouton "Add data source", recherchez Loki, puis sélectionnez-le. Vous serez redirigé vers la page des paramètres de la source de données Loki.

  1. Configurer Loki dans Grafana : Saisissez l’URL du service Loki, qui ressemblera à http://loki-loki-distributed-gateway.grafana-loki.svc.cluster.local, en supposant une configuration par défaut. Cette URL pointe Grafana vers votre instance Loki au sein de votre cluster Kubernetes.

![](https://assets.zilliz.com/loki_ec0afc24d6.png

  1. Enregistrer et tester : Après avoir saisi l’URL du service Loki, cliquez sur "Save & Test". Grafana confirmera s’il peut se connecter avec succès à la source de données Loki.

Explorer vos journaux

Vous pouvez maintenant explorer vos journaux et vous assurer que tout fonctionne correctement et que vous pouvez voir les journaux de Milvus. Filtrez par nom app et utilisez milvus.

Si vous voyez des journaux comme sur la capture d’écran ci-dessus, félicitations, vous pouvez désormais surveiller et obtenir des informations sur les opérations de votre cluster Milvus grâce à Grafana et Loki ! 🚀

N’hésitez pas à consulter Milvus, la documentation sur la visualisation des métriques de Milvus dans Grafana, et à partager vos expériences avec la communauté en rejoignant notre Discord.

Mis à jour le Jul 09, 2026