kube-prometheus-stack에 Prometheus, Grafana, Alertmanager, kube-state-metrics, node-exporter를 구성하고 NVIDIA DCGM Exporter와 vLLM ServiceMonitor를 연결했다. 모든 monitoring Pod가 Running 상태가 되었고 Prometheus에서 dcgm-exporter, gemma4-vllm을 포함한 active target 15개가 모두 up으로 확인됐다.
동일한 chat completion 요청을 5회 실행한 결과 HTTP 200 성공률은 100%였다. 첫 요청은 9.934335초, 이후 4회는 평균 1.638398초였다. 첫 요청 이후 시간이 안정된 현상은 확인했지만, warm-up과 cache 중 어느 요소가 얼마나 기여했는지는 추가 metrics 비교가 필요하다.
Prometheus stack과 DCGM Exporter가 모두 실행됐고, DCGM Exporter와 vLLM ServiceMonitor도 생성됐다. DCGM Exporter는 다른 component보다 준비에 시간이 조금 더 걸렸지만 restart 없이 1/1 Running에 도달했다.
기존 component의 restart는 모두 같은 과거 시점에 발생했고 현재 Pod는 Running을 유지하고 있다. 이번에 새로 기동한 node-exporter와 DCGM Exporter는 restart가 없다.
2. node-exporter mount propagation 복구
node-exporter는 image pull 이후 container runtime spec 생성 단계에서 실패했다.
node-exporter CreateContainerError event
Normal Pulled 69s (x788 over 171m) kubelet spec.containers{node-exporter}: Container image "quay.io/prometheus/node-exporter:v1.12.1-distroless" already present on machine and can be accessed by the podWarning Failed 69s (x779 over 169m) kubelet spec.containers{node-exporter}: (combined from similar events): Error: failed to generate container "f74839a53058626ab736f4df86e16849bfe25e846779c1ff66bec62861d05d56" spec: failed to generate spec: path "/" is mounted on "/" but it is not a shared or slave mount
Pulled: ghcr.io/prometheus-community/charts/kube-prometheus-stack:87.16.1Digest: sha256:68268aff2017d9b1c2bdce70742e65d6e7f6722beb680cd18b4fb5c22061fc36Release "kube-prometheus-stack" has been upgraded. Happy Helming!NAME: kube-prometheus-stackLAST DEPLOYED: Thu Jul 16 10:47:37 2026NAMESPACE: monitoringSTATUS: deployedREVISION: 2TEST SUITE: NoneNOTES:kube-prometheus-stack has been installed. Check its status by running: kubectl --namespace monitoring get pods -l "release=kube-prometheus-stack"Get Grafana 'admin' user password by running: kubectl --namespace monitoring get secrets kube-prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echoAccess Grafana local instance: export POD_NAME=$(kubectl --namespace monitoring get pod -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=kube-prometheus-stack" -oname) kubectl --namespace monitoring port-forward $POD_NAME 3000Get your grafana admin user password by running: kubectl get secret --namespace monitoring -l app.kubernetes.io/component=admin-secret -o jsonpath="{.items[0].data.admin-password}" | base64 --decode ; echoVisit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
key
값
해석
chart
kube-prometheus-stack:87.16.1
기존 설치 chart version 유지
namespace
monitoring
기존 monitoring namespace 유지
release status
deployed
Helm upgrade 반영 성공
revision
2
두 번째 release revision
override
mountPropagation=None
private host root와 충돌하는 전달 요구 제거
이후 node-exporter Pod가 1/1 Running, restart 0으로 정상화됐다.
동일 prompt에서 첫 요청 이후 응답 시간이 약 1.62~1.68초로 수렴했다. 이는 warm-up 또는 cache 영향을 시사하지만, 원인을 확정하려면 요청별 GPU utilization, KV/prefix cache, token throughput metrics를 함께 비교해야 한다.
6. Prometheus GPU와 vLLM metric 확인
6-1. GPU utilization
DCGM_FI_DEV_GPU_UTIL
15분 범위에서 GPU utilization이 idle 구간의 0%부터 최대 약 62%까지 변했다. 값이 시간에 따라 실제로 변한 것은 DCGM Exporter가 고정된 dummy 값이 아니라 GPU 활동을 지속적으로 수집하고 있음을 보여 준다.
6-2. GPU temperature
DCGM_FI_DEV_GPU_TEMP
같은 시간 범위에서 GPU temperature는 약 44~50°C로 관측됐다. utilization 변화에 따라 온도도 완만하게 변해 GPU 상태 metric 수집 경로가 정상적으로 동작하는 것을 확인했다.
세 값이 모두 0인 것은 metric 수집 실패가 아니다. 이 값들은 현재 상태를 나타내는 gauge이므로 요청이 끝난 idle 시점에는 다시 0이 된다. 특히 약 1.6초에 끝나는 짧은 요청은 Prometheus scrape interval 사이에서 시작하고 종료되면 num_requests_running graph에 잡히지 않을 수도 있다. 완료된 요청의 활동량은 gauge보다 누적 counter의 증가량으로 확인하는 편이 적합하다.