Summary
TrafficProtectionPolicy spec changes made on the upstream control plane take an unbounded, unobservable amount of time to reach the edge data plane. During that window an edge serves the stale (previously-valid-or-invalid) WAF config, with no signal — on the cluster or in metrics — that a given edge is behind the control plane for a given policy.
This surfaced while investigating #242: a tenant corrected an inverted-paranoia TPP upstream, but the edge continued serving the old inverted config (which 500s 100% of the route via CRS 901500 fail-closed) for a window before converging.
Evidence
Observed on prod us-central-1-alice, policy ns-c5f1cf4e…/kev1n-proxy:
| Source |
generation |
paranoiaLevels |
| upstream (karmada control plane) |
8 |
{detection: 2, blocking: 2} (valid — tenant-corrected) |
edge us-central-1-alice (first read) |
7 |
{detection: 1, blocking: 2} (inverted — 500s all traffic) |
edge us-central-1-alice (later read) |
8 |
{detection: 2, blocking: 2} (converged) |
So the projection is eventually consistent — it did converge — but the edge served the broken inverted config for the lag window, and nothing exposed that the edge was a generation behind. This is not a stuck/broken sync; it's propagation latency with zero visibility.
Why it matters
Asks
- Observability: expose the applied TPP generation / resourceVersion per edge (metric or status), so control-plane vs edge skew is queryable. A
spec.observedGeneration-style signal on the edge-side attachment, or a metric labeled by policy + edge, would let us alert on lag.
- Bound / quantify the latency: measure typical and worst-case upstream→edge propagation time for a TPP spec change; decide whether it needs an SLO.
- (stretch) Consider surfacing staleness at the control plane so a tenant/operator sees "not yet applied on N edges" after an edit.
Not this issue
Related: #242, #255.
Summary
TrafficProtectionPolicyspec changes made on the upstream control plane take an unbounded, unobservable amount of time to reach the edge data plane. During that window an edge serves the stale (previously-valid-or-invalid) WAF config, with no signal — on the cluster or in metrics — that a given edge is behind the control plane for a given policy.This surfaced while investigating #242: a tenant corrected an inverted-paranoia TPP upstream, but the edge continued serving the old inverted config (which 500s 100% of the route via CRS 901500 fail-closed) for a window before converging.
Evidence
Observed on prod
us-central-1-alice, policyns-c5f1cf4e…/kev1n-proxy:paranoiaLevels{detection: 2, blocking: 2}(valid — tenant-corrected)us-central-1-alice(first read){detection: 1, blocking: 2}(inverted — 500s all traffic)us-central-1-alice(later read){detection: 2, blocking: 2}(converged)So the projection is eventually consistent — it did converge — but the edge served the broken inverted config for the lag window, and nothing exposed that the edge was a generation behind. This is not a stuck/broken sync; it's propagation latency with zero visibility.
Why it matters
*-aliceedges and 500+ project control planes, there is no per-edge/per-policy way to answer "is this edge serving the current generation of this TPP?"Asks
spec.observedGeneration-style signal on the edge-side attachment, or a metric labeled by policy + edge, would let us alert on lag.Not this issue
self.detection >= self.blocking, verified live on karmada) — recurrence prevention is tracked separately.Related: #242, #255.