Kubernetes Ingress not loading static assets

8/16/2019

I have a ReactJS front end, Spring boot backend app deployed on a baremetal Kubernetes cluster which is running Kubernetes Ingress and requests are proxied to it by HAProxy. When visiting the URL of the app, I can see it loads the index.html of the app but all other requests to static assets are not done properly.

The ingress resource of my app:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: app
name: app-ingress
annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$3
spec:
rules:
- host: devops
    http:
    paths:
    - path: /dev/app1(/|$)(.*)
        backend:
        serviceName: app1
        servicePort: 80

When inspecting the page which loads using Chrome Developer tools, I see that there are 6 outgoing calls to the static assets. The call that retrieves the index.html of the app completes succesfully but the calls that retrieve the static assets (ex: http://devops/dev/app1/static/js/4.2761693d.chunk.js) does not work properly as it retrieves the index.html page as well. (only the index.html page is served by all calls basically)

I had a feeling it is because of the nginx.ingress.kubernetes.io/rewrite-target annotation but removing it causes a 404 even on the index.html page.

I am using nginx ingress controller 0.25.1

EDIT:

This is the output when I exec into the container and run curl localhost:8080/dev/app1/static/js/4.2761693d.chunk.js (error fallback page)

enter image description here

This is the output when I run curl localhost:8080/tatic/js/4.2761693d.chunk.js (correctly loads the css)

enter image description here

-- user3583252
kubernetes
kubernetes-ingress
nginx-ingress

2 Answers

8/16/2019

You are most likely using rewrite target for wrong reasons. In this case all elements should start with /dev/app1 including inner calls. What you are doing is working for index page because you wrote it to have "/dev/app1" in before and ingress redirected it to "/" but inner call just called "/static/js/4.2761693d.chunk.js" . This caused the problem basically, because ingress didn't know the route therefore your service never get called to get the js file.

-- Akın Özer
Source: StackOverflow

8/17/2019

Somehow, when I change the rewrite annotation to this, it works:

nginx.ingress.kubernetes.io/rewrite-target: /$2

I didnt change anything else.

Now the application is accessible at devops/dev/app1/ (but it does not work without the / at the end)

I am not sure how this works. I had no logic behind it, I was just changing values in the ingress file to see if anything works.

Can someone explain why it works?

-- user3583252
Source: StackOverflow