在Kubernetes NGINX反向代理入口控制器中按路径重写

时间:2020-03-23 15:03:17

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

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

1 个答案:

答案 0 :(得分:1)

我建议根据您的不同注释将您的入口分为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注解说明您的其余前端。根据您的问题,我相信您不需要使用重写注释创建入口的详细说明。

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

简而言之,基于nginx ingress comparation table

nginxinc控制器不支持将Ingress规则与同一主机合并。您只能将其与Mergeable Ingresses

一起使用

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

希望有帮助。