Ingress 将流量发送到域根

Ingress sends traffic to the domain root

我有一个工作负载通过名称为 online-forms-lib-serviceNodePort 服务公开。此工作负载具有 /version 路由。

我还有以下入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: online-forms-lib-service
          servicePort: 80
        path: /formslib/

问题是,/version 路线不可用:

example.com/formslib/version

如何解决?

更新

当我调用时,它会转到应用程序根目录:

example.com/formslib/

从那里添加任何路径都会将我定向到默认后端

更新 添加注释:

  annotations:
    ingress.kubernetes.io/rewrite-target: /

还是一样的行为。

实际上,Ingress resource mostly relies on the Ingress controller 在 K8s 集群中实现,目的是传播 Ingress 规则并提供负载平衡和流量路由功能。

正如 @UtkuÖzdemir 在评论中提到的,市场上的大多数云提供商都提出了原生 Ingress 控制器支持,即 Ingress-gce in Google Cloud, making possible to create External HTTP(S) load balancer 通过特定的 Ingress 资源。

此外,您可能会发现很多第三方 Ingress 控制器 solutions,它们可能会根据客户需求扩展 L7 网络流量 功能。

我已经在类似的场景中检查了您当前的 Ingress 配置,并且我已经管理了一个采用通配符 * 匹配规则的正确子路径路由,位于特定后端服务的根应用程序路径之前:

- backend:
    serviceName: online-forms-lib-service
    servicePort: 80
    path: /formslib/*

此行为由 rewrite 注释控制。

  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /

截至 2019 年 9 月,GKE ingress 不支持 rewrite 规则。

https://github.com/kubernetes/ingress-gce/issues/109

也没有公布实施计划。

唯一的解决方案是 nginx 或其他支持重写注释的第 3 方入口控制器。