首页 > 解决方案 > 使用 Istio 网关和 VirtualService 时无法加载 Web 应用程序依赖项(JS、CSS)

问题描述

我正在使用 Helm 来部署各种包(PrestoDB、Apache Spark 等),对于这些工具中的每一个,我只是使用 Helm 使用基本配置来部署它们。

https://github.com/helm/charts/tree/master/stable/spark

https://github.com/helm/charts/tree/master/stable/presto

两者都仅使用 ClusterIP 服务进行部署以公开 Web UI,然后我创建一个网关,并使用 Istio 向 Web 应用程序的 VirtualService 可以在集群外部公开。使用 Helm 部署 PrestoDB 后,这是我部署的 Gateway 和 VirtualService:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: presto-gateway
  namespace: warehouse
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: presto
  namespace: warehouse
spec:
  hosts:
  - "*"
  gateways:
  - presto-gateway
  http:
  - match:
    - uri:
        prefix: /ui
    route:
    - destination:
        host: presto-warehouse
        port:
          number: 8080
EOF

这成功了,但是当我去加载 PrestoDB Web UI 时,我只看到文本,并且我可以在控制台中看到它似乎几乎所有的 JS/CSS 依赖项都无法加载。我可以看到,当我转到“ingressgateway/ui”时,只有一些纯文本,所有依赖项似乎只是从“ingressgateway”加载,而不是“ingressgateway/ui/vendor/xxx.js”等. 有没有办法重新路由网络应用程序从尝试从基域加载依赖项并在其前面加上“/ui”以便加载?当我尝试启动多个服务并将它们放在入口网关后面时,会发生这种情况 - spark 和其他服务都可以正常工作,但是 Web 应用程序在加载依赖项时遇到问题,您只能看到纯文本。

谢谢

标签: apache-sparkkuberneteskubernetes-helmprestoistio

解决方案


由于您使用 istio 您是否在集群中启用了sidecar 注入

有没有办法重新路由 Web 应用程序从尝试从基域加载依赖项并在其前面加上“/ui”以便加载?

如果我理解正确,您可以使用虚拟服务中存在的重写。

我在另一个stackoverflow问题中找到了一个很好的例子


推荐阅读