nginx-ingress works well for /, but not for subpaths

8/9/2018

I have setup a name based ingress controller, but it doesn't seem to work for anything other than /.

So http://metabase.domain.com works but http://metabase.domain.com/style/app.css does not.

This is my config:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: domain
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "domain"
  name: domain-ingress
spec:
  rules:
  - host: metabase.domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: metabase
          servicePort: 80
  - host: jenkins.domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: jenkins
          servicePort: 80

From the nginx.conf in the everything looks normal too. For some reason the nginx access and error logs are also empty so can't find anything from there too

-- Amit
kubernetes
kubernetes-ingress
nginx
nginx-ingress

2 Answers

8/10/2018

As you mentioned, there is no error in the log files, and everything looks normal from your perspective. I may suggest to tune up ingress using annotations tags. I've checked documentation of ingress-nginx and found that below annotations may help a bit.

In some scenarios, the exposed URL in the backend service differs from the specified path in the Ingress rule. Without a rewrite, any request will return 404. Set the annotation

nginx.ingress.kubernetes.io/rewrite-target

to the path expected by the service.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /something

If the Application Root is exposed in a different path and needs to be redirected, set the annotation

nginx.ingress.kubernetes.io/app-root

to redirect requests for /.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/app-root: /app1
  name: approot
  namespace: default
spec:
  rules:
  - host: approot.bar.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /

If the application contains relative links, it is possible to add an additional annotation

nginx.ingress.kubernetes.io/add-base-url

that will prepend a base tag in the header of the returned HTML from the backend.

-- d0bry
Source: StackOverflow

8/11/2018

I got around to solving this, turns out somehow there was another ingress on my namespace that was a very old version of the nginx controller. I cleared my cluster and relaunched my ingress. Things worked out. Thanks for all the help everyone!

-- Amit
Source: StackOverflow