agent-platform release v4.28.19
Fixed
- The models Gateway reaches a served
LLMInferenceService: the llm-d workload’s network policy admits the workload’s own port, 8000 (giantswarm/agent-platform#525; proof 1 of giantswarm/giantswarm#37639). The connectivity chart’s -model-serving-llmisvc-workload CiliumNetworkPolicy admitted ingress on modelServing.networkPolicy.predictor.port — 8080, the classic InferenceService predictor’s, the one port every shape’s policy shared since #506 — while the workload pod the llm-d controller creates is reached on 8000 — the port KServe’s <name>-kserve-workload-svc targets and the rendered HTTPRoute’s backendRef names: the template’s llm-d routing sidecar (--port=8000 --vllm-port=8001), vLLM’s main on 8001 behind it. On gazelle (4.28.18, 2026-09-17 05:39Z, the first hands-free run of the proof to reach a Ready predictor) hubble showed the gateway’s SYNs to the pod on 8000 policy-denied, and every POST …/v1/chat/completions with a person’s id_token answered 503 upstream call failed: Connect: deadline has elapsed (without a token 401: the JWT policy worked). Each pod shape now carries its port in the chart’s one shape list (agent-platform.modelServing.podShapes): the classic predictor predictor.port (8080, unchanged), the llm-d workload the new modelServing.networkPolicy.llmisvcWorkload.port (8000), declared in both charts — the meta chart forwards its whole values tree to the connectivity release, so a connectivity-only default would have been shadowed by the meta chart’s tree exactly as the #522 lists were (#524). Every rule that names the port renders per shape: the ingress from the callers and from the kubelet (cilium), the kubernetes-flavour ingress, and the kagent agents’ egress, now one rule per shape on that shape’s port instead of both shapes on 8080. make verify-model-serving-policies ties each shape’s admitted port — in every one of those rules, as rendered from the connectivity defaults and from the values the meta chart forwards — to the port of the container the shape’s fixture pod is reached on (tests/fixtures/model-serving-llmisvc-workload-pod.yaml gains the routing sidecar the pod is reached through on 8000; main keeps its 8001), refuses two fixtures on one port, and fails a render whose llm-d value is the classic port (the 4.28.18 shape) naming the shape; make verify-meta (tests/verify-mirrored-values.py) holds every networkPolicy port equal between the two charts next to the fqdns / cidrs lists, both model-serving ports required. Every installation with model serving on gets two policy changes and no pod roll: the llm-d workload’s ingress moves to 8000, and the agents’ egress splits into one rule per shape. The live half — POST …/v1/chat/completions with a person’s id_token → 200 from the served model, without a token → 401 — is the proof’s.