【问题标题】:How can I server multiple paths on same service through one Ingress?如何通过一个 Ingress 在同一服务上提供多条路径?
【发布时间】:2019-10-09 23:24:18
【问题描述】:

我正在开发 GKE 集群。我有一个简单的服务器正在运行。服务器上有三个路由。

route 1 - / 
route 2 - /ping
route 3 - /health 

这些路径返回 200 响应,其中包含通用但不同的“ok”消息。

这就是我的入口 yaml 的样子 -

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  tls:
  - hosts:
    - www.simple.com
    secretName: simple-server-tls
  rules:
    - host: www.simple.com
      http:
        paths:
        - path: /ping
          backend:
            serviceName: simple-server
            servicePort: 8080

我将我的服务器公开为负载平衡器。我可以使用负载均衡器访问所有三个路由 https://<loadbalancer_ip>:8080/ https://<loadbalancer_ip>:8080/ping https://<loadbalancer_ip>:8080/health

但是,在尝试使用入口时,我在 https://www.simple.com/ping 上只收到 200 响应 其他两条路线,即https://www.simple.com/healthhttps://www.simple.com/ 返回default backend - 404 error

我可以确认服务器正在运行并且正在完美地处理请求,并且我已经给了 ingress 足够的时间(超过 30 分钟)来完成设置。 https://www.simple.com/healthz returns "OK".

我认为我在正确配置入口时犯了一个错误。感谢您提供任何帮助/建议。

我无法提供入口日志,因为我注意到 kubectl describe ingress/basic-ingress 返回错误 Error from server (NotFound): the server could not find the requested resource 但是,kubectl get ingress 返回 basic-ingress www.simple.com &lt;ingress_ip&gt; 80, 443 31m

【问题讨论】:

  • 您将所有 URL 重写为 /。删除 rewrite-target 注释,它应该可以工作。
  • 我确实尝试过。我的入口配置了path /health。如果我正在重写 URL,我应该会收到path / 的响应。但是在这种情况下,我在path /path /ping 上收到了 404。只有path /health 在工作。
  • 如果您为/health 配置了入口,则所有其他 url 都将被取消映射,因此预计会得到 404。路径是前缀,以该路径开头的任何内容都将被代理。使用/,您将发送所有内容,但将它们重写为/。尝试不使用重写注释。
  • 我刚才确实试过了。这个解决方案没有奏效。我在https://www.simple.com 上收到了 200 个,在https://www.simple.com/ping 上收到了 404 个
  • 我跟踪了我传出的 HTTP 请求,我可以确认我的请求是以GET https://www.simple.com/GET https://www.simple.com/ping 发出的

标签: kubernetes server routes google-kubernetes-engine kubernetes-ingress


【解决方案1】:

解决了这个问题。您需要在路径中添加通配符。我的路径中只有/,因此它拒绝(读取抛出 404 错误)我的所有其他 url。我按照@bserdar 的正确建议添加了/* 并删除了the rewrite-target annotation,它确实有效。链接到 github 上帮助很大的问题 - https://github.com/kubernetes/ingress-nginx/issues/1120

【讨论】:

  • 您的入口是 GKE 入口。它不是 nginx 入口。每个入口实现的规则都不同。由于它不是 nginx,rewrite-target 也应该是不必要的,因为它不适用于 GKE 入口。
猜你喜欢
  • 2018-03-04
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 2018-03-20
  • 2021-11-25
  • 2017-02-23
相关资源
最近更新 更多