Kubernetes Nginx Ingress not redirect properly to path routing services

10/17/2019

I'm using ingress for kubernetes. My ingress is kubernetes nginx ingress. And routing configs don't work and redirect me root path in every request in https section All configs is given below

cat frontapi-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: swagger-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: preprod-ops.kblab.local
    http:
      paths:
      - backend:
          serviceName: kb-workplace
          servicePort: 8080
        path: /
      - backend:
          serviceName: gw-branch
          servicePort: 8443
        path: /api
$ cat swagger-portal.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: swagger-portal
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: preprod-ops.kblab.local
    http:
      paths:
      - backend:
          serviceName: swagger-portal
          servicePort: 9001
        path: /swagger-portal

Above config works properly with http config but, below config doesn't work with https config. It only works swagger-portal section

$cat frontapi-ingress-https.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/secure-verify-ca-secret: preprod.kblab.local
    kubernetes.io/ingress.class: nginx
  generation: 1
  name: app-ingress
spec:
  rules:
  - host: preprod.kblab.local
    http:
      paths:
      - backend:
          serviceName: gw-branch
          servicePort: 8443
        path: /api
      - backend:
          serviceName: kb-workplace
          servicePort: 8080
        path: /
      - backend:
          serviceName: acs-alfresco
          servicePort: 8080
        path: /acs
  tls:
  - hosts:
    - preprod.kblab.local
  - secretName: preprod.kblab.local

$ cat swagger-portal-https.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: swagger-portal
spec:
  rules:
  - host: preprod.kblab.local
    http:
      paths:
      - backend:
          serviceName: swagger-portal
          servicePort: 9001
        path: /swagger-portal/a
  tls:
  - hosts:
    - preprod.kblab.local
  - secretName: preprod.kblab.local

Thanks in advance.

-- Babak Mammadov
kubernetes

1 Answer

10/17/2019

You are setting the nginx.ingress.kubernetes.io/rewrite-target: / annotation on your swagger-portal-https.yaml Ingress, which explicitly implies the redirection to the root path.

If you want to preserve the request path, you need to remove this annotation.

-- Eduardo Baitello
Source: StackOverflow