在 Nginx ingress 中重写 Kubernetes 服务

Rewriting Kubernetes services in an Nginx ingress

我有多个 API 都在“/api”上侦听,还有一个 Web 前端在“/”上侦听。

有没有一种方法可以编写入口定义,将路径重写为如下所示?

/api/      -> /api/ on service1
/api2/api/ -> /api/ on service2
/api3/api/ -> /api/ on service3
/          -> /     on service4

我知道我可以更改 API 以收听其他内容,但我不想那样做。我知道我也可以将所有内容重写为 /api/ 并让 service3 充当默认值,但将来可能还有其他服务需要路由到其他地方。

我听说您可以使用多个入口,但我不确定这将如何影响性能以及这样做是否是最佳做法。

另外,有什么方法可以调试哪个路由到哪个服务?

谢谢, 詹姆斯

如果您使用的是 Nginx,您应该能够像这样为路径匹配配置 Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: test.com
    http:
      paths:
      - path: (/api/.*)
        backend:
          serviceName: service1
          servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress-2
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  - host: test.com
    http:
      paths:
      - path: /api2/.*
        backend:
          serviceName: service2
          servicePort: 80
      - path: /api3/.*
        backend:
          serviceName: service3
          servicePort: 80
      - path: /.*
        backend:
          serviceName: service4
          servicePort: 80

More info

在@Rahman 的帮助下 - 查看其他答案。我已经设法让它与单个入口一起工作。

由于字符数限制,我不得不post将此作为附加答案。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - secretName: tls-secret
  rules:
  - host: localhost
    http:
      paths:
      - path: /(api/.*)
        backend:
          serviceName: service1
          servicePort: 80
      - path: /api2/(api.*)
        backend:
          serviceName: service2
          servicePort: 80
      - path: /api3/(api.*)
        backend:
          serviceName: service3
          servicePort: 80
      - path: /(.*)
        backend:
          serviceName: service4
          servicePort: 80

仅供将来遇到此问题的其他人参考,服务 1 是主 API,服务 2 和 3 是另一个子域下的其他 API,服务 4 是网络前端。