【问题标题】:Istio VirtualService - broken URLsIstio VirtualService - 损坏的 URL
【发布时间】:2020-12-09 09:18:16
【问题描述】:

救命!

我正在使用 Istio 在 Kubernetes 中设置服务网格。虚拟服务定义将流量路由到所需的服务:

(...)
  http:
  - match:
    - uri:
        prefix: /drill/
    rewrite:
      uri: /
    route:
    - destination:
        host: drill-service.drill.svc.cluster.local
        port:
          number: 8047

但是,当调用入口点时

https://<HOST>:<NODEPORT_INGRESS_GW>/drill

我确实看到了 HTML 页面,但 URL 已损坏且 CSS 表未正确加载。原因是 HTML 源代码指向了错误的目标:

li><a href="/storage">Storage</a></li>

而不是

li><a href="/drill/storage">Storage</a></li>

我该如何解决这个问题?

谢谢,

马特

【问题讨论】:

    标签: url kubernetes-ingress istio


    【解决方案1】:

    当您使用rewrite 时,您需要在虚拟服务中为您的依赖项(如 css 和 js)添加路径。

    @Rinor here 很好地解释了重写的整个过程以及应该如何配置。


    这个Istio in practise 教程也很好解释。

    让我们分解应该路由到前端的请求:

    确切路径 / 应该路由到前端以获取 Index.html

    前缀路径 /static/* 应该被路由到前端以获取前端所需的任何静态文件,例如 层叠样式表JavaScript 文件强>。

    匹配正则表达式 ^.*.(ico|png|jpg)$ 的路径应路由到前端,因为它是页面需要显示的图像。

    http:
      - match:
        - uri:
            exact: /
        - uri:
            exact: /callback
        - uri:
            prefix: /static
        - uri:
            regex: '^.*\.(ico|png|jpg)$'
        route:
        - destination:
            host: frontend             
            port:
              number: 80
    

    另外你可以看看here


    编辑

    为什么你的例子不起作用

    使用您当前的虚拟服务,您的请求将如下所示:

    http://www.page.com/drill/
    
    Rewritten: http://www.page.com/
    
    
    http://www.page.com/drill/storage
    
    Rewritten: http://www.page.com/storage
    

    所以现在您必须更改虚拟服务配置,例如无需重写的路径或更改您的应用程序依赖项位置,因此 istio 实际上可以看到 /drill/storage 路径与您当前的虚拟服务,现在它看到 /storage path ,这里什么都没有,因为真正的路径是/drill/storage

    http:
      - match:
        - uri:
            prefix: /
        - uri:
            prefix: /drill/storage/
        - uri:
            prefix: /...
    

    我的建议

    如果您将域配置为虚拟服务主机,您可以尝试使用此虚拟服务:

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: istio-vs
    spec:
      hosts:
      - "drill.domain.com"
      gateways:
      - gateway
      http:
      - match:
        - uri:
            prefix: /
        rewrite:
          uri: /drill/
        route:
        - destination:
            host: drill-service.drill.svc.cluster.local
            port:
              number: 8047
    

    使用此虚拟服务,您的请求将如下所示:

    http://www.page.com/
    
    Rewritten: http://www.page.com/drill/
    
    
    http://www.page.com/storage
    
    Rewritten: http://www.page.com/drill/storage
    

    【讨论】:

    • 嗨,Jakub,感谢您的回答,但这不起作用(或者我不明白)。我确实在您的参考资料中看到了示例,但我必须扩展 URL(添加钻头)而不是像示例中那样缩短。添加另一个 URI 后,URL 被破坏。我必须添加rewrite-URI吗?
    • 嗨@MBR 我已经编辑了我的答案,向您解释为什么当前配置不起作用以及您可能会尝试解决的问题。
    • 嗨,Jakub,感谢您的回答。我确实想要其他方式的配置。传入的请求page.com/drill 应该路由到drill-service.drill.svc.cluster.local 这似乎很简单,但我没有找到任何关于如何做到这一点的参考。问候马蒂亚斯
    • @MBR 即使您只使用- match: - uri: prefix: /,它仍然会被路由到 Drill-service,您将其指定为您的虚拟服务主机。关键是您当前的配置,您的网址配置错误,它将无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2019-09-25
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多