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

Per-path rewrite in an Kubernetes NGINX reverse proxy ingress controller

我正在设置一个 Kubernetes 集群,其中包含三个应用程序,每个 运行 在各自的 pod 和服务中。这些应用程序的 Web 前端应该可以在端口 80、9000 和 15672 上访问。它们自己的 pods 和服务中还有许多后端 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: / 这样的重写注释来解决,问题是,这也适用于 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-ingress 带有 nginx.ingress.kubernetes.io/rewrite-target: / 注释用于其余前端。根据您的问题,我相信您不需要使用重写注释创建入口的详细说明。

编辑1: 是的,可以使用同一主机创建多个入口。但请注意具体是哪个nginx ingress。参考@LazerBass 的调查。

简而言之,基于nginx ingress comparation table

nginxinc controller does not support merging Ingress rules with the same host. You can use it only with Mergeable Ingresses

最简单的方法是使用正则 kubernetes/ingress-nginx

希望对您有所帮助。