This page is generated from skills/eks-ingress-migration/references/traffic-routing.md. Edit the source, not this page.
Traffic & Routing Complexity
Rating model: Express every finding as Impact 1–5 using the Impact Indicator rubric (security/reputation · business/revenue · nature & effort to remediate). Band mapping is a starting point — GREEN→🟡 1–2, AMBER→🟠 3–4, RED→🔴 5 — but the Impact Indicator criteria set the final score (e.g. an easy-to-deploy prerequisite stays 🟡 low even if it blocks a path). All checks are read-only (
kubectl get/describe,aws … describe/list).
Purpose
Assess routing complexity and map current patterns to Gateway API HTTPRoute equivalents.
Checks to Execute
5.1 — Routing Pattern Mapping
What to check:
- Host-based routing → HTTPRoute
hostnamesfield - Path-based routing → HTTPRoute
matches[].path - Default backend → HTTPRoute with no matches (catch-all)
- Complexity per Ingress resource
How to check:
- For each Ingress, count
spec.rulesentries - Count unique hosts across all Ingress resources
- Check path types (Prefix, Exact, ImplementationSpecific)
- Flag ImplementationSpecific — Gateway API only supports Exact and PathPrefix
Gateway API mapping:
- Ingress
spec.rules[].host→ HTTPRoutespec.hostnames[] - Ingress
spec.rules[].http.paths[]→ HTTPRoutespec.rules[].matches[].path - Ingress
Prefix→ HTTPRoutePathPrefix - Ingress
Exact→ HTTPRouteExact - Ingress
ImplementationSpecific→ ❌ Must be converted to Exact or PathPrefix
Impact (per Impact Indicator):
- 🟡 1–2 (Low): Simple host+path routing, all Prefix/Exact — direct HTTPRoute mapping
- 🟠 3–4 (Medium): Some ImplementationSpecific paths or regex patterns needing conversion
- 🔴 5 (High): Heavy regex routing, >20 rules per Ingress, complex rewrite chains
- ⬜ Unknown: Cannot parse routing rules
Path-matching semantics change — converting regex/
ImplementationSpecific→PathPrefixis NOT behavior-preserving. ingress-nginx evaluates regex paths by rule order / regex specificity; ALB and Gateway API use "most specific path wins." A hard switch can silently route traffic to the wrong backend or yield 404s that generic monitoring misses. Do not flip path types blindly: build a routing comparison table (every host+path → backend) for NGINX vs the target, and shadow/replay representative requests to confirm 100% match before cutover. Treat any cluster with regex/ImplementationSpecificpaths as needing this validation step (raise its impact accordingly).
Report output format: In the report's "Current Config" column, show actual config as compact 1-liner:
Ingress/<name>: <host><path> → <backend>:<port> (<pathType>, TLS:<yes/no>)
Example: Ingress/shopping-app: /*→frontend:80 (Prefix, TLS:no)
Example: Ingress/nginx-alb: app.example.com/* → nginx-service:80 (Prefix, TLS:ACM)
5.2 — Advanced Traffic Features
What to check:
- Canary/weighted routing → HTTPRoute
backendRefs[].weight - Header-based routing → HTTPRoute
matches[].headers - URL rewriting → HTTPRoute
filters[].urlRewrite - Request redirect → HTTPRoute
filters[].requestRedirect - Request/response header modification → HTTPRoute
filters[].requestHeaderModifier - Authentication → No native Gateway API equivalent (use ALB Cognito/OIDC annotation)
- Rate limiting → No native equivalent (use AWS WAF)
- CORS → No native equivalent (use application-level or WAF)
How to check:
- Scan annotations for advanced features
- Map each to Gateway API equivalent or workaround
- Flag features with no equivalent
Impact (per Impact Indicator):
- 🟡 1–2 (Low): Features used have direct HTTPRoute equivalents (weighted routing, header matching, rewrites)
- 🟠 3–4 (Medium): Some features need AWS service substitution (WAF for rate limiting, Cognito for auth)
- 🔴 5 (High): Critical dependency on nginx lua/snippets with no Gateway API path
- ⬜ Unknown: Cannot determine feature usage
5.3 — Cross-Namespace Routing
What to check:
- Ingress resources referencing services in other namespaces
- Gateway API model: cross-namespace routing requires explicit ReferenceGrant
- Service mesh integration (Istio, Linkerd)
How to check:
- Check Ingress backends for cross-namespace references
- List Services of type ExternalName
- Check for Istio VirtualService / Linkerd ServiceProfile CRDs
Impact (per Impact Indicator):
- 🟡 1–2 (Low): All routing within same namespace — straightforward HTTPRoute conversion
- 🟠 3–4 (Medium): Some cross-namespace routing — need to create ReferenceGrant resources
- 🔴 5 (High): Heavy service mesh integration — Gateway API migration must coordinate with mesh
- ⬜ Unknown: Cannot determine cross-namespace routing
5.4 — ALB IngressGroup Sharing
What to check (read-only): alb.ingress.kubernetes.io/group.name and group.order on each Ingress.
- Multiple Ingresses (often across namespaces) sharing one
group.nameare served by a single ALB. This materially affects Gateway listener design and ALB consolidation during migration. - Record group membership in the topology JSON and Routing Topology — do not drop it.
5.5 — Declarative Blind Spot & Optional Route Verification
Blind spot (always note when snippets are present): topology and routing are derived from Ingress objects only. Routes injected via server-snippet / configuration-snippet (e.g. a raw location block) do not appear as Ingress rules/backends, so the 3D diagram and Routing Topology under-count them. State this limitation explicitly in the report whenever snippet annotations exist — these are exactly the routes that block migration.
Optional deep read (requires --allow-sensitive-data-access, still read-only):
- Enumerate snippet-injected routes:
kubectl exec <nginx-pod> -n <ns> -- nginx -Tand scan forlocationblocks not represented by an Ingress. - Verify live L7 behavior in-cluster: from a throwaway pod,
wget/curleach controller's ClusterIP with theHost:header and record the status code (200/301/308/404/5xx) in Routing Topology. This raises confidence that routing actually works (vs. config-only inference). Keep it optional — the assessment is config-first.
Topology data to collect: Record all routing patterns, hosts, paths, and features for the 3D visualization.