For the complete documentation index, see llms.txt. Markdown versions of all docs pages are available by appending .md to any docs URL.
URL Rewriting
Convert the NGINX rewrite-target annotation to a regular expression HTTPRoute match and a kgateway TrafficPolicy path rewrite.
Path rewriting is common when backends expect a different path than what is exposed publicly. NGINX uses the rewrite-target annotation. When the rewrite uses capture groups from a regular expression path, the conversion tool creates a kgateway TrafficPolicy with a urlRewrite.pathRegex rewrite instead of a Gateway API URLRewrite filter.
Before: Ingress with Rewrite Target
In this example, requests to /api/v1/users are rewritten to /users before reaching the backend:
cat <<'EOF' > rewrite-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-demo
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /api/v1(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: backend-svc
port:
number: 80
EOFConvert
ingress2gateway print --providers=ingress-nginx --emitter=kgateway \
--input-file rewrite-ingress.yaml > rewrite-kgateway.yamlThe tool prints these messages:
- The tool does not translate HTTPS for the
api.example.comhost. By default, Ingress NGINX serves HTTPS for every host with a self-signed certificate. The generated Gateway has only an HTTP listener. To serve HTTPS, add an HTTPS listener to the Gateway. For more information, see HTTPS listener. Using case-insensitive regex path matches. The tool adds(?i)to the start of the path pattern, so the match ignores upper and lower case, like Ingress NGINX does.Path rewrites with capture group references are not supported. Despite this warning, the output has a TrafficPolicy with the rewrite. The rewrite needs one fix, as described in the next section.
After: Regular expression match and TrafficPolicy
cat rewrite-kgateway.yamlThe output has a Gateway, an HTTPRoute, and a TrafficPolicy. The HTTPRoute rule matches the path with a regular expression and has no URLRewrite filter. The TrafficPolicy targets only that rule, through the sectionName: rule-0 setting, and rewrites the path.
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: nginx
spec:
gatewayClassName: kgateway
listeners:
- hostname: api.example.com
name: api-example-com-http
port: 80
protocol: HTTP
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: rewrite-demo-api-example-com
spec:
hostnames:
- api.example.com
parentRefs:
- name: nginx
rules:
- backendRefs:
- name: backend-svc
port: 80
matches:
- path:
type: RegularExpression
value: (?i)/api/v1(/|$)(.*).*
name: rule-0
---
apiVersion: gateway.kgateway.dev/v1alpha1
kind: TrafficPolicy
metadata:
name: rewrite-demo-api-example-com-0
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: rewrite-demo-api-example-com
sectionName: rule-0
urlRewrite:
pathRegex:
pattern: (?i)/api/v1(/|$)(.*).*
substitution: /$2The tool copies the NGINX value /$2 into the substitution field as is. In kgateway, a substitution refers to a capture group with a backslash, such as \2, not with a dollar sign. With /$2, the backend gets the path /$2 instead of /users. To fix the rewrite, change the substitution to /\2.
Apply and verify
Apply the converted resources.
kubectl apply -f rewrite-kgateway.yamlReplace the TrafficPolicy with a version that uses /\2 as the substitution. A request to /api/v1/users now reaches the backend as /users.
kubectl apply -f- <<'EOF'
apiVersion: gateway.kgateway.dev/v1alpha1
kind: TrafficPolicy
metadata:
name: rewrite-demo-api-example-com-0
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: rewrite-demo-api-example-com
sectionName: rule-0
urlRewrite:
pathRegex:
pattern: (?i)/api/v1(/|$)(.*).*
substitution: /\2
EOFCheck the HTTPRoute and the TrafficPolicy.
kubectl get httproutes
kubectl get trafficpolicy rewrite-demo-api-example-com-0 -o jsonpath='{.spec.urlRewrite.pathRegex.substitution}'