Skip to content

Commit 134b23d

Browse files
authored
docs: multi-SG Prometheus prereq for ai-service-metrics check (#939)
1 parent 889843a commit 134b23d

2 files changed

Lines changed: 70 additions & 3 deletions

File tree

docs/integrator/eks-dynamo-networking.md

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,42 @@ If system components and GPU workloads are on different node groups/security gro
88
- `Unable to create lease` (etcd unreachable)
99
- `JetStream not available` (NATS unreachable)
1010

11+
The conformance validator's `ai-service-metrics` check adds a third requirement:
12+
it dials Prometheus over the cluster Service (typically
13+
`kube-prometheus-prometheus.monitoring.svc:9090`). The orchestrator Job that
14+
runs the check tolerates every taint and has no node-affinity toward
15+
Prometheus, so the kube-scheduler may place it on any worker node — including
16+
one whose ENI is in a security group that cannot reach the Prometheus pod.
17+
18+
When that happens, the dial times out at 5 s and the check is marked `failed`:
19+
20+
```
21+
[SERVICE_UNAVAILABLE] Prometheus unreachable at http://kube-prometheus-prometheus.monitoring.svc:9090 — verify network connectivity
22+
```
23+
24+
The outcome is **non-deterministic from run to run** on the same cluster: the
25+
first scheduling decision is a tie-break, and subsequent runs are dominated by
26+
image-locality scoring (whichever node pulled the validator image first keeps
27+
winning). A re-run on a "freshly working" cluster is therefore not a reliable
28+
signal that the SG topology is correct.
29+
30+
This is tracked in [issue #933](https://github.com/NVIDIA/aicr/issues/933);
31+
this page documents the cluster-side prerequisite until the validator gains
32+
`podAffinity` toward Prometheus.
33+
1134
## Required Security Group Rules
1235

1336
Allow ingress from the GPU node security group to the system node security group on:
14-
- TCP `2379`
15-
- TCP `4222`
37+
- TCP `2379` — etcd (dynamo-platform)
38+
- TCP `4222` — NATS / JetStream (dynamo-platform)
39+
- TCP `9090` — Prometheus (required for the `ai-service-metrics` conformance check)
40+
41+
The `9090` rule is symmetrically required: the validator orchestrator pod may
42+
land on **any** worker node, so every node group whose pods can host the
43+
orchestrator must be able to reach the Prometheus pod's IP on `9090`. On
44+
clusters with separate customer/system ENI subnets (e.g. DGXC EKS), this means
45+
the system SG must accept ingress from the customer SG (and any other worker
46+
SG), not only from itself.
1647

1748
Example:
1849

@@ -28,10 +59,17 @@ aws ec2 describe-instances \
2859
--query "Reservations[0].Instances[0].SecurityGroups[*].GroupId" \
2960
--output text
3061

31-
# 2) Allow etcd + NATS from GPU SG -> system SG
62+
# 2) Allow etcd + NATS + Prometheus from GPU SG -> system SG
3263
aws ec2 authorize-security-group-ingress --group-id <system-sg-id> \
3364
--protocol tcp --port 2379 --source-group <gpu-sg-id>
3465

3566
aws ec2 authorize-security-group-ingress --group-id <system-sg-id> \
3667
--protocol tcp --port 4222 --source-group <gpu-sg-id>
68+
69+
aws ec2 authorize-security-group-ingress --group-id <system-sg-id> \
70+
--protocol tcp --port 9090 --source-group <gpu-sg-id>
3771
```
72+
73+
If the cluster has more than two worker security groups, repeat the `9090`
74+
rule for each non-system SG that can host pods — the validator orchestrator
75+
has no scheduling preference and may land on any of them.

docs/user/validation.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,35 @@ Common reasons and their cause:
359359
| `skipped - no-cluster mode` | `message` | `--no-cluster` was passed — the runner short-circuits every phase before dispatching any Job | Remove the flag to run behavioral checks |
360360
| `skipped due to previous phase failure` | `message` | An earlier phase failed and subsequent phases are skipped | Fix the earlier phase first, then re-run |
361361

362+
### `ai-service-metrics` fails with "Prometheus unreachable"
363+
364+
On EKS clusters that split worker and system pods across separate security
365+
groups (e.g. DGXC EKS with distinct customer/system ENI subnets), the
366+
conformance check `ai-service-metrics` can fail non-deterministically with:
367+
368+
```
369+
[SERVICE_UNAVAILABLE] Prometheus unreachable at http://kube-prometheus-prometheus.monitoring.svc:9090 — verify network connectivity
370+
```
371+
372+
The validator orchestrator Job tolerates every taint and has no node-affinity
373+
toward Prometheus, so the kube-scheduler may place it on any worker node —
374+
including one whose ENI is in a security group whose ingress to the
375+
Prometheus-hosting SG is missing or asymmetric. The outcome is **not stable
376+
across re-runs**: image-locality scoring tends to keep the pod on whatever
377+
node won the first scheduling decision, so a passing run on a fresh cluster
378+
does not prove the SG topology is correct.
379+
380+
This is a cluster-side prerequisite, not an AICR bug per se — see
381+
[EKS Dynamo Networking Prerequisites](../integrator/eks-dynamo-networking.md#required-security-group-rules)
382+
for the SG ingress rules required for Prometheus (`tcp/9090`). The underlying
383+
issue is tracked at [#933](https://github.com/NVIDIA/aicr/issues/933).
384+
385+
Workaround when SG changes are not available: re-run the check until the
386+
orchestrator lands on a node whose SG can reach Prometheus, then leave the
387+
image cached there so image-locality keeps subsequent runs on the same node.
388+
This is unreliable and should not be used as the steady-state validation
389+
strategy.
390+
362391
### Benchmark Job stuck or timed out
363392

364393
Each performance check has a Job-level `activeDeadlineSeconds` set by the catalog's `timeout:`. For `inference-perf`, the full pipeline (workload ready → endpoint health → benchmark) can take up to 30 min on cold-start clusters. If it still times out:

0 commit comments

Comments
 (0)