I have an application running in kubernetes that I can access outside the cluster from my browser on:
http://myapp.internal/myapp/content
using the below Ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
app.kubernetes.io/instance: myapp
app.kubernetes.io/name: myapp
name: myapp
namespace: samples
spec:
rules:
- host: myapp.internal
http:
paths:
- backend:
serviceName: myapp
servicePort: 8080
path: /myapp/content
status:
loadBalancer:
ingress:
- {}
Now I would like to access it on:
instead but without modifying my application (that’s not an option at the moment).
Based on:
https://kubernetes.github.io/ingress-nginx/examples/rewrite/
it seems I can just do:
nginx.ingress.kubernetes.io/rewrite-target: /myapp/content
So I have updated my ingress to look like this:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /myapp/content
labels:
app.kubernetes.io/instance: myapp
app.kubernetes.io/name: myapp
name: myapp
namespace: samples
spec:
rules:
- host: myapp.internal
http:
paths:
- backend:
serviceName: myapp
servicePort: 8080
path: /content
status:
loadBalancer:
ingress:
- {}
I would now assume that when I enter:
in my browser the above rewrite-target
rule then translates that into:
http://myapp.internal//myapp/content
which it actually does. But instead of seeing my content I just get:
default backend - 404
Basically I need the reverse of this example:
https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/rewrite
So original example says:
rewrite.bar.com/something/new rewrites to rewrite.bar.com/new
Where I need:
rewrite.bar.com/new rewrites to rewrite.bar.com/something/new
What am I missing?
2
Answers
I think you it will work. Rewrite target means the URL where the traffic should be redirected.
Actually you do not need to set
nginx.ingress.kubernetes.io/rewrite-target: /myapp/content
. Understand the flow, by the path/myapp/content
you are accessingmyapp
service so you should only just replace the path (as you want to redirect the path)path: /content
, it will work fine. Now if you hit/content
path then it will go to same service (namedmyapp
) as like/myapp/content
in previous.The yaml should be like:
update
actually your question is not clear, you want to hit http://myapp.internal/content and redirect to http://myapp.internal/myapp/content? If it is what you are looking then it’s not possible by changing ingress, because your ingresd will match till http://myapp.internal and rest of the part /content will go to your service backed pod, now if in your service backed pod you have myapp/content then how can you send content to get that?
One thing you can do is: run a pod where you need to run another application with
/content
path and it will just redirect tomyapp/content
pod, both pod can backed by themyapp
service