Wrap each backend RoundTripper returned by TransportManager with a thin zapBackendRoundTripper that dials selected upstreams via github.com/zap-proto/http instead of net/http. Allowlist comes from env INGRESS_ZAP_BACKENDS (comma-separated host:port). Empty/unset env keeps the wrapped transport untouched, so the change is purely additive. External (client-facing) TLS termination is unchanged. CRD schema is unchanged. One *zaphttp.Transport per backend addr (zaphttp pins to a single peer and ignores req.URL.Host). Adds reference doc with IngressRoute example and notes LLM.md.
2.1 KiB
title, description
| title | description |
|---|---|
| ZAP-HTTP Backend Transport | Use github.com/zap-proto/http for the ingress→backend hop on selected services. |
ZAP-HTTP Backend Transport
The ingress controller can dial selected backend services using
github.com/zap-proto/http instead
of net/http. External TLS termination is unchanged; only the
in-cluster hop changes wire format.
Enable
Set the INGRESS_ZAP_BACKENDS environment variable on the ingress pod
to a comma-separated list of host:port targets that should use
ZAP-HTTP. Any backend whose host:port is not in the list keeps
using the standard HTTP/HTTPS transport — the change is purely additive.
env:
- name: INGRESS_ZAP_BACKENDS
value: "gateway.hanzo.svc.cluster.local:8080,iam.hanzo.svc.cluster.local:8000"
When INGRESS_ZAP_BACKENDS is unset or empty, the controller behaves
identically to a build without this feature.
IngressRoute example
No CRD field changes. The IngressRoute simply points at the host:port that appears in the allowlist; the controller swaps the transport based on the backend address.
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: gateway
namespace: hanzo
spec:
entryPoints:
- websecure
routes:
- match: Host(`api.hanzo.ai`)
kind: Rule
services:
- name: gateway
port: 8080
tls:
secretName: hanzo-ai-tls
If the resolved upstream for the gateway service is
gateway.hanzo.svc.cluster.local:8080 and that address is in
INGRESS_ZAP_BACKENDS, the ingress will dial it via ZAP-HTTP.
Notes
- The wire format is
github.com/zap-proto/httpv0.1: length-prefixed Cap'n Proto frames over TCP. v0.2 will add the X-Wing PQ KEM handshake. - The backend service must speak ZAP-HTTP (use
zaphttp.ListenAndServeorzaphttp.Server). A regularnet/httpserver will not negotiate. - HTTP/2, HTTP/3, and WebSocket are not supported on ZAP-routed backends; v0.2 of zap-http will add streaming and pooling.
- The lookup is by
host:portof the resolved upstream (the value ofreq.URL.Hostat transport time), not by the public-facing domain.