0

我尝试使用以下配置通过 istio 入口路由我的微服务:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: test
      annotations:
        kubernetes.io/ingress.class: "istio"
    spec:
      rules:
      - http:
          paths:
          - path: /internal/v1.0/service
            backend:
              serviceName: sleep
              servicePort: 80
          - path: /external/v1.0/service
            backend:
              serviceName: sleep
              servicePort: 80

当我测试这个配置时,我得到了来自集群的 404 响应。似乎 istio 威胁到我作为正则表达式的路径

    → istioctl -n istio-shop get ingress-rule test-1-1
    destination: sleep.istio-shop.svc.cluster.local
    match:
      httpHeaders:
        uri:
          regex: /internal/v1.0/service
    route:
    - tags:
        servicePortNum: "80"
        tlsSecret: ""

我发现的唯一方法是摆脱“。” 在服务 API 版本中并使用如下内容:

- path: /internal/v1/service

结果是:

    → istioctl -n istio-shop get ingress-rule test-1-3
    destination: sleep.istio-shop.svc.cluster.local
    match:
      httpHeaders:
        uri:
          exact: /external/v1/service
    route:
    - tags:
        servicePortNum: "80"
        tlsSecret: ""

    - path: /internal/v1.*

结果是:

        → istioctl -n istio-shop get ingress-rule test-1-4
        destination: sleep.istio-shop.svc.cluster.local
        match:
          httpHeaders:
            uri:
              prefix: /external/v1
        route:
        - tags:
            servicePortNum: "80"
            tlsSecret: ""

uri 类型从“regex”更改为“prefix”和“exact”

我假设那个点“。” 被处理为正则表达式部分而不是常规符号。试图用“\”转义它,但没有结果。

那是一个错误吗?因为“/internal/v1.0/service”不是正则表达式

4

1 回答 1

0

正如您所注意到的,在将 Ingress 路径转换为 ​​Istio 匹配配置时,Istio 试图变得聪明,但在您的情况下,它看起来还不够聪明:https ://github.com/istio/pilot/blob/master/适配器/配置/入口/conversion.go#L95

一个简单的 ”。” 单独的字符(例如,没有后面的“*”)不应映射到正则表达式。

请在https://github.com/istio/issues/issues提交错误报告。谢谢

于 2017-10-02T14:57:41.583 回答