K8S入口控制器重定向到错误的路径



我有一个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/

那么一切都是好的,因为";我的应用svc";知道路径"/一些路径/";并返回200响应(转发到http://my-app-svc/some-path,这很好,因为我的应用svc不知道也不应该知道或关心仅存在于nginx入口控制器的/my-app前缀,所以它将知道在内部将该请求转发到"我的应用svc"(。

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

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

我从";我的应用svc";服务;"位置";标题包含"/某个路径/";,因此重定向为:

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

这不会导致";我的应用svc";服务,因为它没有"/我的应用程序"前缀

如果Location报头是"/我的应用程序/某个路径/";而不是"/一些路径/";然后一切都很好,因为重定向将是:

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

这会给我200的回复。

问题是,我如何才能做到入口控制器将添加一个";我的应用程序"当它向客户端返回重定向响应时,Location标头的前缀?

感谢

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

解决方案是将这些注释添加到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

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

对于任何登陆这里并发现上述解决方案不起作用的人(比如我自己(,您可能正在使用基于nginx的ingresshttps://www.nginx.com/blog/guide-to-choosing-ingress-controller-part-4-nginx-ingress-controller-options/需要对入口资源进行不同的注释:

nginx.org/rewrites: "serviceName=service1 rewrite=rewrite1[;serviceName=service2 rewrite=rewrite2;...]"

对我有效。

来自的完整声明https://github.com/nginxinc/kubernetes-ingress/tree/v2.3.0/examples/rewrites复制到此处:

apiVersion: networking.k8s.io/v1 
kind: Ingress
metadata:
name: cafe-ingress
annotations:
nginx.org/rewrites: "serviceName=tea-svc rewrite=/;serviceName=coffee-svc rewrite=/beans/"
spec:
rules:
- host: cafe.example.com
http:
paths:
- path: /tea/
pathType: Prefix
backend:
service:
name: tea-svc
port:
number: 80
- path: /coffee/
pathType: Prefix
backend:
service:
name: coffee-svc
port:
number: 80

相关内容

  • 没有找到相关文章

最新更新