如何在 Kubernetes 中使用 nginx-ingress 正确重定向

How to redirect correctly usign nginx-ingress in Kubernetes

我是 kubernetes 和 nginx 的新手,无法理解如何为我的特定用例实施 Ingress (nginx-ingress)。

我想从我的集群中公开 pgadmin PostgreSQL 管理工具。

我的集群中有其他应用程序通过 nginx-ingress 公开,我希望每个应用程序都挂起自己的子目录,例如:

我在使用 pgadmin 时遇到问题(尽管该问题无疑同样适用于以相同方式运行的其他应用程序)

我已经设置了一个 Ingress 规则来相应地捕获和路由:

  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /

  rules:
  - http:
      paths:
        - path: /pgadmin4(/|$)(.*)

它执行路由并命中后端。

然而,当 pgadmin 然后进行重定向时,我从重定向中丢失了 pgadmin/ URl 即

而我想重定向到:

实现此目标我缺少哪些部分 - 感觉应该很简单?

谢谢

值得一提的是,就安全性而言,使用同一域名公开许多不同的服务可能不是最好的主意。许多网络安全机制依赖域名来确定什么是可信的,什么不是。因此,如果您的一个容器遭到破坏,共享同一域名的其他服务可能会受到影响。

无论如何,问题出在 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.