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 비교가 필요하다.
실행 명령과 manifest는 내부 Runbook에 유지한다. Mount propagation 자체의 개념은 별도 기술 문서에 분리했다.
1. monitoring component 기동 상태
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의 증가량으로 확인하는 편이 적합하다.