Grafana와 Loki로 Milvus 모니터링
Grafana와 Loki로 Milvus 모니터링 소개
이 게시물은 Milvus 배포를 효과적으로 모니터링하기 위해 Grafana와 Loki를 설정하는 과정을 안내합니다.
Milvus는 대규모 임베딩 벡터를 저장, 인덱싱 및 관리하는 것을 목표로 하는 분산 벡터 데이터베이스입니다. 수조 개의 벡터를 효율적으로 인덱싱하고 검색할 수 있는 능력 덕분에 Milvus는 AI 및 머신 러닝 워크로드에 적합한 선택지가 됩니다.
반면 Grafana는 모니터링 및 관찰 가능성을 위한 오픈 소스 플랫폼으로, 메트릭, 로그 및 트레이스를 시각화하는 데 이상적입니다. 시스템 상태와 성능을 추적하기 위한 대시보드를 만들 수 있습니다. Loki는 Prometheus에서 영감을 받은 로그 집계 시스템으로 Grafana와 함께 사용됩니다. 로그를 효율적이고 비용 효과적으로 관리합니다. Grafana와 Loki는 함께 Milvus 및 그 이상을 위한 관찰 가능성을 향상시키는 견고한 모니터링 구성을 제공합니다.
사전 요구 사항
Docker - Docker가 시스템에 설치되어 있는지 확인하세요.
Kubernetes - Kubernetes 클러스터를 준비하세요. 로컬 개발에는
minikube or k3d를 사용하거나 프로덕션 환경에는 클라우드 제공업체의 Kubernetes 서비스를 사용할 수 있습니다.Helm - Kubernetes용 패키지 관리자인 Helm을 설치하여 Kubernetes 애플리케이션 관리를 도우세요. 설치 방법은 당사 문서에서 확인할 수 있습니다 https://milvus.io/docs/install_cluster-helm.md
Kubectl - Kubernetes 클러스터와 상호작용하기 위한 명령줄 도구인
kubectl을 설치하여 애플리케이션을 배포하고, 클러스터 리소스를 검사 및 관리하며, 로그를 확인하세요.
K8s 설정
K8s 클러스터를 실행하는 데 필요한 모든 것을 설치한 후, minikube를 사용했다면 다음 명령으로 클러스터를 시작하세요:
minikube start
다음 명령으로 K8s 클러스터 상태를 확인하세요:
kubectl cluster-info
⚠️또한 K8s에 Milvus를 배포해야 합니다. 이를 수행하는 방법은 당사의 시작하기 가이드 를 참고하세요.
Grafana 배포
Grafana는 우리가 사용할 분석 및 대화형 시각화 플랫폼입니다. 다양한 차트, 그래프 및 알림을 제공합니다. 메트릭이 어디에 저장되어 있든 상관없이 메트릭을 쿼리하고, 시각화하고, 알림을 생성할 수 있습니다.
설치는 Helm으로 진행됩니다
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는 Prometheus에서 영감을 받은 로그 집계 시스템입니다. 로그를 효율적이고 비용 효과적으로 관리합니다. Loki는 로그를 집계하기 위해 Promtail을 사용합니다. Promtail은 로그를 수집하고, 레이블을 지정하며, Loki로 전송하는 로그 수집 에이전트입니다. Loki를 위해 명시적으로 만들어졌습니다. 각 Kubernetes 노드에서 Promtail 인스턴스가 실행되는 것을 볼 수 있습니다.
로그 인덱싱에 대한 Loki의 접근 방식은 독특합니다. 로그의 실제 텍스트를 인덱싱하지 않습니다. 대신 로그 항목을 지능적으로 스트림으로 그룹화한 다음 레이블로 인덱싱합니다. 이 방법은 비용과 로그 수집부터 쿼리에서 사용할 수 있게 되기까지의 시간을 크게 줄여, 리소스 관리에 안도감을 제공합니다.
Loki는 다양한 방식으로 배포할 수 있습니다:
모놀리식 모드: 이 모드는 간단하며, Loki의 모든 구성 요소가 단일 프로세스 내에서 실행됩니다. 더 작은 구성이나 큰 복잡성 없이 Loki에 익숙해지는 데 적합합니다.
확장 가능 모드: 이 모드에서는 Loki의 구성 요소가 distributors, ingesters, queriers 등과 같은 별도의 서비스로 분리됩니다.
이 구성은 고가용성과 확장성을 위해 설계되었으며, 대규모 배포에 잘 맞습니다. 로그 데이터를 저장하려면 S3 호환 객체 스토리지가 필요하며, 이는 AWS S3, Google Cloud Storage 또는 MinIO와 같은 자체 호스팅 솔루션일 수 있습니다.
Loki 설치 방법:
helm upgrade --install loki grafana/loki-distributed -n grafana-loki --create-namespace
이 명령은 grafana-loki 네임스페이스 내에 loki를 설치합니다. 네임스페이스가 존재하지 않으면 Helm이 대신 생성해 줍니다.
다음을 실행하여 모든 것이 다시 올바르게 작동하는지 확인하세요:
❯ 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의 서비스 URL을 지정하기 위해 구성 파일을 편집하는 작업이 포함됩니다:
- 기본 Promtail 구성 추출:
helm show values grafana/promtail > promtail-overrides.yaml
이 명령은 기본 Promtail 값을 promtail-overrides.yaml이라는 파일에 기록하며, 이후 이를 수정할 수 있습니다.
- 기본 Promtail 구성 편집:
promtail-overrides.yaml을 편집하여 clients.url 값을 Loki의 서비스 엔드포인트로 설정합니다. Kubernetes에서는 서비스를 DNS 레코드를 통해 접근할 수 있으므로, Loki 서비스의 DNS 이름을 사용할 수 있습니다: loki-loki-distributed-gateway.grafana-loki.svc.cluster.local
참고: Loki를 다른 네임스페이스에 배포했거나 다른 이름으로 배포했다면 URL을 그에 맞게 조정하세요. Kubernetes 문서를 확인해도 좋습니다.
- 수정한 구성 파일로 Promtail 배포:
helm upgrade --install --values promtail-overrides.yaml promtail grafana/promtail -n grafana-loki
이 명령은 Helm에 사용자 지정 구성을 사용하여 grafana-loki 네임스페이스에 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 인스턴스에 접근해야 합니다. Grafana가 Kubernetes 클러스터 내에서 실행 중이라면 포트 포워딩을 사용하여 로컬 머신에서 Grafana UI에 접근할 수 있습니다:
kubectl port-forward service/grafana 8080:80 -n grafana
- Grafana에 로그인하기: Grafana의 기본 사용자 이름은 admin입니다. 비밀번호의 경우, Grafana는 Helm을 통해 설치될 때 무작위로 생성합니다. 다음으로 가져올 수 있습니다:
kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
Data Sources로 이동하기: 로그인한 후 Grafana 사이드바로 이동하여 "Connections" 아이콘을 찾고 "Data Sources"를 선택합니다.
Loki 추가하기: "Add data source" 버튼을 클릭하고 Loki를 검색한 다음 선택합니다. Loki 데이터 소스 설정 페이지로 이동합니다.
- Grafana에서 Loki 구성하기: Loki 서비스의 URL을 입력합니다. 기본 설정을 가정하면
http://loki-loki-distributed-gateway.grafana-loki.svc.cluster.local와 같은 형태입니다. 이 URL은 Grafana가 Kubernetes 클러스터 내의 Loki 인스턴스를 가리키도록 합니다.

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.

Selecting the Right ETL Tools for Unstructured Data to Prepare for AI
Learn the right ETL tools for unstructured data to power AI. Explore key challenges, tool comparisons, and integrations with Milvus for vector search.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
Discover DeepRAG, an advanced retrieval-augmented generation (RAG) model that improves LLM accuracy by retrieving only essential data through step-by-step reasoning.



