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