From 179e12b9a90980621741a8411a46adbef2139850 Mon Sep 17 00:00:00 2001 From: rock Date: Fri, 11 Sep 2026 10:46:15 +0900 Subject: [PATCH] feat: vLLM Prometheus metrics scraping (#37) Add ServiceMonitor for llm-serving namespace. Wire prometheus.io annotations to all vLLM pods (reasoning, ornith, embeddings, reranker). Scrape /metrics@8080 every 30s with proper relabeling. --- k8s/apps/llm-serving/embeddings.yaml | 8 +++++ k8s/apps/llm-serving/ornith.yaml | 8 +++++ k8s/apps/llm-serving/reasoning.yaml | 8 +++++ k8s/apps/llm-serving/reranker.yaml | 8 +++++ .../monitoring/servicemonitors/vllm.yaml | 30 +++++++++++++++++++ 5 files changed, 62 insertions(+) create mode 100644 k8s/infra/monitoring/servicemonitors/vllm.yaml diff --git a/k8s/apps/llm-serving/embeddings.yaml b/k8s/apps/llm-serving/embeddings.yaml index 5ceb6b3..72a2c5c 100644 --- a/k8s/apps/llm-serving/embeddings.yaml +++ b/k8s/apps/llm-serving/embeddings.yaml @@ -45,6 +45,14 @@ spec: volumeMounts: - mountPath: /mnt/models name: models + podMetadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "8080" + prometheus.io/path: "/metrics" + labels: + app.kubernetes.io/name: llm-embeddings + app.kubernetes.io/part-of: llm-serving maxReplicas: 1 minReplicas: 1 nodeSelector: diff --git a/k8s/apps/llm-serving/ornith.yaml b/k8s/apps/llm-serving/ornith.yaml index 5abfa20..47e3243 100644 --- a/k8s/apps/llm-serving/ornith.yaml +++ b/k8s/apps/llm-serving/ornith.yaml @@ -83,6 +83,14 @@ spec: volumeMounts: - mountPath: /mnt/models name: models + podMetadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "8080" + prometheus.io/path: "/metrics" + labels: + app.kubernetes.io/name: llm-ornith + app.kubernetes.io/part-of: llm-serving deploymentStrategy: type: Recreate # 1 replica -- ornith:35b only. qwen2.5:3b moved to CPU on cp-2. diff --git a/k8s/apps/llm-serving/reasoning.yaml b/k8s/apps/llm-serving/reasoning.yaml index d9ff660..f936a78 100644 --- a/k8s/apps/llm-serving/reasoning.yaml +++ b/k8s/apps/llm-serving/reasoning.yaml @@ -104,6 +104,14 @@ spec: name: models - mountPath: /dev/shm name: shm + podMetadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "8080" + prometheus.io/path: "/metrics" + labels: + app.kubernetes.io/name: llm-reasoning + app.kubernetes.io/part-of: llm-serving deploymentStrategy: type: Recreate maxReplicas: 1 diff --git a/k8s/apps/llm-serving/reranker.yaml b/k8s/apps/llm-serving/reranker.yaml index eded1cd..6d45d94 100644 --- a/k8s/apps/llm-serving/reranker.yaml +++ b/k8s/apps/llm-serving/reranker.yaml @@ -45,6 +45,14 @@ spec: volumeMounts: - mountPath: /mnt/models name: models + podMetadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "8080" + prometheus.io/path: "/metrics" + labels: + app.kubernetes.io/name: llm-reranker + app.kubernetes.io/part-of: llm-serving maxReplicas: 1 minReplicas: 1 nodeSelector: diff --git a/k8s/infra/monitoring/servicemonitors/vllm.yaml b/k8s/infra/monitoring/servicemonitors/vllm.yaml new file mode 100644 index 0000000..9218dd1 --- /dev/null +++ b/k8s/infra/monitoring/servicemonitors/vllm.yaml @@ -0,0 +1,30 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: vllm + namespace: monitoring + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/part-of: llm-serving +spec: + namespaceSelector: + matchNames: + - llm-serving + selector: + matchLabels: + app.kubernetes.io/part-of: llm-serving + endpoints: + - port: http + interval: 30s + scrapeTimeout: 10s + path: /metrics + scheme: http + relabelings: + - sourceLabels: [__meta_kubernetes_namespace] + targetLabel: namespace + - sourceLabels: [__meta_kubernetes_pod_name] + targetLabel: pod + - sourceLabels: [__meta_kubernetes_service_name] + targetLabel: service + - sourceLabels: [__meta_kubernetes_pod_label_app_kubernetes_io_name] + targetLabel: app