如何在 Kubernetes 中使用 nginx-ingress 正确重定向
How to redirect correctly usign nginx-ingress in Kubernetes
我是 kubernetes 和 nginx 的新手,无法理解如何为我的特定用例实施 Ingress (nginx-ingress)。
我想从我的集群中公开 pgadmin PostgreSQL 管理工具。
我的集群中有其他应用程序通过 nginx-ingress 公开,我希望每个应用程序都挂起自己的子目录,例如:
- myserver.com/purchasing/index.html
- 我的服务器.com/sales/index.html
我在使用 pgadmin 时遇到问题(尽管该问题无疑同样适用于以相同方式运行的其他应用程序)
我已经设置了一个 Ingress 规则来相应地捕获和路由:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
rules:
- http:
paths:
- path: /pgadmin4(/|$)(.*)
它执行路由并命中后端。
然而,当 pgadmin 然后进行重定向时,我从重定向中丢失了 pgadmin/ URl 即
- 我向我的服务器发送了一个 GET。com/pgadmin
- 我收到 302 重定向到我的服务器。com/login
而我想重定向到:
- myserver.com/pgadmin/登录
实现此目标我缺少哪些部分 - 感觉应该很简单?
谢谢
值得一提的是,就安全性而言,使用同一域名公开许多不同的服务可能不是最好的主意。许多网络安全机制依赖域名来确定什么是可信的,什么不是。因此,如果您的一个容器遭到破坏,共享同一域名的其他服务可能会受到影响。
无论如何,问题出在 pgadmin 上。它不知道它是从 myserver.com/pgadmin/
提供服务的(这也是让多个服务使用同一个域名不是最好主意的另一个原因),所以它发送了错误的重定向。
幸运的是,pgadmin documentation 提供了一个解决方案:
If you wish to host pgAdmin under a subdirectory rather than on the root of the server, you must specify the location and set the X-Script-Name header which tells the pgAdmin container how to rewrite paths:
server {
listen 80;
server_name _;
location /pgadmin4/ {
proxy_set_header X-Script-Name /pgadmin4;
proxy_set_header Host $host;
proxy_pass http://localhost:5050/;
proxy_redirect off;
}
}
所以看起来您只需要确保对 pgadmin 的调用是通过 X-Script-Name /pgadmin4
header 发送的,这是 nginx ingress controller knows how to do.
我是 kubernetes 和 nginx 的新手,无法理解如何为我的特定用例实施 Ingress (nginx-ingress)。
我想从我的集群中公开 pgadmin PostgreSQL 管理工具。
我的集群中有其他应用程序通过 nginx-ingress 公开,我希望每个应用程序都挂起自己的子目录,例如:
- myserver.com/purchasing/index.html
- 我的服务器.com/sales/index.html
我在使用 pgadmin 时遇到问题(尽管该问题无疑同样适用于以相同方式运行的其他应用程序)
我已经设置了一个 Ingress 规则来相应地捕获和路由:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
rules:
- http:
paths:
- path: /pgadmin4(/|$)(.*)
它执行路由并命中后端。
然而,当 pgadmin 然后进行重定向时,我从重定向中丢失了 pgadmin/ URl 即
- 我向我的服务器发送了一个 GET。com/pgadmin
- 我收到 302 重定向到我的服务器。com/login
而我想重定向到:
- myserver.com/pgadmin/登录
实现此目标我缺少哪些部分 - 感觉应该很简单?
谢谢
值得一提的是,就安全性而言,使用同一域名公开许多不同的服务可能不是最好的主意。许多网络安全机制依赖域名来确定什么是可信的,什么不是。因此,如果您的一个容器遭到破坏,共享同一域名的其他服务可能会受到影响。
无论如何,问题出在 pgadmin 上。它不知道它是从 myserver.com/pgadmin/
提供服务的(这也是让多个服务使用同一个域名不是最好主意的另一个原因),所以它发送了错误的重定向。
幸运的是,pgadmin documentation 提供了一个解决方案:
If you wish to host pgAdmin under a subdirectory rather than on the root of the server, you must specify the location and set the X-Script-Name header which tells the pgAdmin container how to rewrite paths:
server { listen 80; server_name _; location /pgadmin4/ { proxy_set_header X-Script-Name /pgadmin4; proxy_set_header Host $host; proxy_pass http://localhost:5050/; proxy_redirect off; } }
所以看起来您只需要确保对 pgadmin 的调用是通过 X-Script-Name /pgadmin4
header 发送的,这是 nginx ingress controller knows how to do.