nginx ingress sub path redirection
Looks like your ingress is not serving anything /devops/*
. Try adding another path /devops/*
with the same backend. Basically this:
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: my-ingress namespace: ingress-nginx annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/add-base-url : "true"spec: rules: - host: master1.dev.local http: paths: - backend: serviceName: devops1 servicePort: 10311 path: /devops/* - backend: serviceName: devops1 servicePort: 10311 path: /devops
Update: the above has been deprecated in favor of something like this:
apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 name: rewrite namespace: defaultspec: rules: - host: master1.dev.local http: paths: - backend: serviceName: devops1 servicePort: 10311 path: /devops(/|$)(.*)
If you access http://hostname/devops/logs
directly from your browser, certainly you will get what you want. But since you click the hyperlink in the homepage, then you can only get http://hostname/logs
, which will be certainly failed.
So, you need /logs
backend configured in your ingress yaml to get it processed, and configure nginx.ingress.kubernetes.io/configuration-snippet
to ensure /logs
not get rewrote, like this:
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: my-ingress namespace: ingress-nginx annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/add-base-url : "true" nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^/logs /logs break;spec: rules: - host: master1.dev.local http: paths: - backend: serviceName: devops1 servicePort: 10311 path: /logs - backend: serviceName: devops1 servicePort: 10311 path: /devops
The nginx.ingress.kubernetes.io/x-forwarded-prefix
annotation can be used for this purpose.
It adds x-forwarded-prefix
header to http request with a value from this annotation. You can use it, if your backend support such header.
For example, Spring Boot application can handle it by using property:
server.forward-headers-strategy=framework
In your case ingress would look like the following:
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: my-ingress namespace: ingress-nginx annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/x-forwarded-prefix: /devopsspec: rules: - host: master1.dev.local http: paths: - backend: serviceName: devops1 servicePort: 10311 path: /devops
This solution has its downsides. It forces you to declare each service in separate ingress.