【问题标题】:K8S Ingress controller redirect to the wrong pathK8S Ingress 控制器重定向到错误的路径
【发布时间】:2021-05-24 20:33:58
【问题描述】:

我有一个 Nginx 入口控制器在一个 k8s 命名空间上运行, 在另一个 k8s 命名空间上,我定义了一个 pod、一个服务和一个入口资源。 这是入口资源定义:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: general-internal
  rules:
  - host: example.com
    http:
      paths:
      - path: "/my-app(/|$)(.*)"
        backend:
          serviceName: my-app-svc
          servicePort: 443

现在,当我访问此链接时:

http://example.com/my-app/some-path/

然后一切正常,因为“my-app-svc”知道路径“/some-path/”并返回 200 响应(转发到 http://my-app-svc/some-path,这很好,因为 my-app-svc 没有t 并且不应该知道或关心仅存在于 nginx 入口控制器的 /my-app 前缀,因此它会知道在内部将该请求转发到“my-app-svc”)。

但是当我访问这个链接时(注意最后没有“/”):

http://example.com/my-app/some-path

我从“my-app-svc”服务收到重定向响应,并且“Location”标头包含“/some-path/”,所以重定向到:

http://example.com/some-path/

这不会导致“my-app-svc”服务,因为它没有“/my-app”前缀。

如果 Location 标头是“/my-app/some-path/”而不是“/some-path/”,那么一切正常,因为重定向将是:

http://example.com/my-app/some-path/

这会给我 200 响应。

问题是,当入口控制器向客户端返回重定向响应时,我该怎么做才能在 Location 标头中添加“my-app”前缀?

谢谢

【问题讨论】:

  • 你好@Ofir,如果我能正确看到你的 404 错误看起来像入口行为。查看您的重写目标:/$2。这意味着您正在捕获第二组- path: "/my-app(/|$)(.*)"。您的第二组是(.*)。在您的示例中,您将仅捕获 some-path。该组将附加到http://example.com/。所以预期的结果应该是http://example.com/some-path/。如果您想将请求定向到http://example.com/my-app/some-path,请尝试将重写目标更改为/my-app/$2
  • 另外,选择path typePrefix。您将能够通过末尾带有/ 的地址访问您的应用程序,或者没有它。您还可以从- path: "/my-app(/|$)(.*)" 中删除"。欲了解更多信息,您可以阅读doc
  • @MikołajGłodziak 嗨,谢谢你的回答,我编辑了我的问题,这样会更清楚。请注意 http://example.com/my-app/some-path/ 在 k8s 内部转发到 http://my-app-svc/some-path/,这是故意的。我使用“/my-app”前缀以使 nginx 入口将请求路由到内部的“my-app-svc”,所以我不想更改“/$2”,我只想要 nginx 入口控制器更改“my-app-svc”返回给客户端的重定向响应,方法是在 Loaction 标头中添加“/my-app”前缀...
  • 我认为您将 URL 与站点名称混淆了:“http://example.com/my-app/some-path/ forward to http: // my-app-svc / some-path /”。根据您的配置,documentation http://example.com/my-app/some-path/ 应重写(转发)为 http://example.com/some-path/。你能附上一些截图吗?如果要在位置标头中添加my-app 前缀,则确实需要更改/$2。根据您的配置,它可以正常工作。

标签: kubernetes kubernetes-ingress


【解决方案1】:

感谢我的同事,我们找到了解决问题的方法:

解决方法是在ingess资源中添加这些注解:

nginx.ingress.kubernetes.io/proxy-redirect-from: /
nginx.ingress.kubernetes.io/proxy-redirect-to: /my-app/

意思:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/proxy-redirect-from: /
    nginx.ingress.kubernetes.io/proxy-redirect-to: /my-app/
spec:
  ingressClassName: general-internal
  rules:
  - host: example.com
    http:
      paths:
      - path: "/my-app(/|$)(.*)"
        backend:
          serviceName: my-app-svc
          servicePort: 443

似乎上面的注释检查了对客户端的重定向响应中的“Location”标头,并将第一个/替换为/my-app/,并且只有在此更改之后-重定向响应才会发送到客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多