【问题标题】:Kubernetes Ingress not loading static assetsKubernetes Ingress 不加载静态资产
【发布时间】:2019-12-22 17:23:30
【问题描述】:

我有一个 ReactJS 前端,Spring boot 后端应用程序部署在一个运行 Kubernetes Ingress 的裸机 Kubernetes 集群上,请求由 HAProxy 代理到它。访问应用程序的 URL 时,我可以看到它加载了应用程序的 index.html,但对静态资产的所有其他请求都没有正确完成。

我的应用的入口资源:

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

在检查使用 Chrome 开发人员工具加载的页面时,我看到有 6 个对静态资产的传出调用。检索应用程序的index.html 的调用成功完成,但检索静态资产的调用(例如:http://devops/dev/app1/static/js/4.2761693d.chunk.js)在检索index.html 页面时无法正常工作。 (基本上所有调用只提供index.html 页面)

我感觉这是因为 nginx.ingress.kubernetes.io/rewrite-target 注释,但即使在 index.html 页面上删除它也会导致 404。

我正在使用 nginx 入口控制器 0.25.1

编辑:

这是我执行到容器中并运行 curl localhost:8080/dev/app1/static/js/4.2761693d.chunk.js(错误后备页面)时的输出

这是我运行 curl localhost:8080/tatic/js/4.2761693d.chunk.js 时的输出(正确加载 css)

【问题讨论】:

  • 您的 Spring 应用程序是否在 /static/ 路由上提供静态资产目录?
  • @AnkitDeshpande 在“常规”部署中,Spring 应用程序将在package.json 文件的homepage 字段中定义的路由上提供静态资产。对于此部署,我已输入 http://devops/dev/app1 作为 homepage 字段的值
  • 另外,通过常规部署,我的意思是手动部署,即构建 jar 和 java -jar jar_name.jar
  • 尝试连接到 pod 并运行 curl localhost<port>/dev/app1/static/js/4.2761693d.chunk.js,这会返回什么?
  • 检查这是否有帮助:*.com/a/47860209/3968921

标签: kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

不知何故,当我将重写注释更改为此时,它可以工作:

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

我没有改变其他任何东西。

现在可以通过devops/dev/app1/ 访问该应用程序(但如果没有最后的/,它将无法工作)

我不确定这是如何工作的。我没有逻辑,我只是​​更改入口文件中的值以查看是否有效。

有人可以解释它为什么起作用吗?

【讨论】:

  • "nginx.ingress.kubernetes.io/rewrite-target: /$3" 行告诉入口使用第三组的值,而路径中只有 2 个组:" /dev/app1(/|$)(.*)”。即 (/|$) -> $1 和 (.*) -> $2
【解决方案2】:

您很可能出于错误的原因使用了重写目标。在这种情况下,所有元素都应该以 /dev/app1 开头,包括内部调用。你正在做的是为索引页面工作,因为你之前写过它有 "/dev/app1" 并且入口将它重定向到 "/" 但内部调用只是称为 "/static/js/4.2761693d.chunk.js" 。这基本上导致了问题,因为入口不知道路由,因此您的服务永远不会被调用来获取 js 文件。

【讨论】:

  • 您好,感谢您的回答。我也是这么想的,但是如果我添加nginx.ingress.kubernetes.io/rewrite-target: /dev/app1/$3,那不应该解决问题吗?此外,如果我完全删除注释,即使 index.html 页面也不会加载
  • 对延迟回复深表歉意
  • 如果没有rewrite-target就不行,你是怎么想出使用rewrite-target的?