nginx - 在Kubernetes NGINX反向代理入口 Controller 中按路径重写

标签 nginx kubernetes reverse-proxy

我正在建立一个Kubernetes集群,其中包含三个应用程序,每个应用程序都在各自的pod和服务中运行。这些应用程序的Web前端应该在端口80、9000和15672上是可访问的。在它们自己的pod和服务中还运行着许多Backend-API,它们在各自的端口上也应该可以访问。通过具有以下入口定义的NGINX反向代理访问集群:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  namespace: my-namespace
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  tls:
  - hosts:
    - myapp.com
    secretName: my-certificat
  rules:
  - host: myapp.com
    http:
      paths:
      - backend:
          serviceName: my-service-1
          servicePort: 8092
        path: /api/someroute/(.*)
      - backend:
          serviceName: my-service-2
          servicePort: 30003
        path: /api/someotherroute/(.*)
      - backend:
          serviceName: my-other-frontend
          servicePort: 9000
        path: /other/(.*)
      - backend:
          serviceName: my-yetanother-frontend
          servicePort: 15672
        path: /yetanother/(.*)
      - backend:
          serviceName: my-main-frontend
          servicePort: 80
        path: /(.*)

这适用于api服务,但不适用于前端。如果我在浏览器中输入URI像myapp.com/other/一样,它将调用my-other-frontend:9000/other/而不是my-other-frontend:9000/。当然,这可以通过像nginx.ingress.kubernetes.io/rewrite-target: /$1这样的重写注释来解决,问题是,这也将适用于api服务,而那些服务实际上在调用中需要完整的路由,因此一般的重写规则会破坏它们。

所以我的问题是:是否可以定义仅适用于特定路径的重写规则?

最佳答案

我建议根据您的不同注释将您的入口分成2个。

1)第一个api服务,称为my-api-ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-api-ingress
  namespace: my-namespace
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  tls:
  - hosts:
    - myapp.com
    secretName: my-certificat
  rules:
  - host: myapp.com
    http:
      paths:
      - backend:
          serviceName: my-service-1
          servicePort: 8092
        path: /api/someroute/(.*)
      - backend:
          serviceName: my-service-2
          servicePort: 30003
        path: /api/someotherroute/(.*)

2)第二个,让剩下的前端说my-front-ingressnginx.ingress.kubernetes.io/rewrite-target: /$1批注。根据您的问题,我相信您不需要使用重写批注创建入口的详细说明。

编辑1:
是的,可以使用同一主机创建多个入口。但是请注意确切的nginx入口。有关他的调查,请参阅@LazerBass answer

简而言之,基于nginx ingress comparation table

nginxinc Controller 不支持将Ingress规则与同一主机合并。您只能将其与Mergeable Ingresses一起使用

最简单的方法是使用常规kubernetes/ingress-nginx
enter image description here

希望能有所帮助。

关于nginx - 在Kubernetes NGINX反向代理入口 Controller 中按路径重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60816130/

相关文章:

kubernetes - kube-proxy 的可扩展性

tomcat - 如何将域名映射到 Tomcat 应用程序?

php - Nginx 与 PhpMyAdmin(通过 ssl 保护)

angular - 如何配置 nginx 来运行 angular4 应用程序

kubernetes - Kong 背后的 Keycloak 和奇怪的重定向

nginx - 将 nginx 反向代理设置为从另一个 docker 容器提供服务

docker - Nginx与Docker的反向代理SSL终止-重定向过多

kubernetes - 如何在Kubernetes入口TLS配置中添加中间SSL证书?

kubernetes - 在具有特定标签的节点上获取 pod

java - 为什么 Jetty 要求使用 ProxyTo,而我已经提供了 ProxyTo