在 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
在@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 是网络前端。
我有多个 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
在@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 是网络前端。