我正在建立一个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服务,而那些服务实际上在调用中需要完整的路由,因此,一般的重写规则会中断他们。
所以我的问题是:是否可以定义仅适用于特定路径的重写规则?
答案 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-ingress
和nginx.ingress.kubernetes.io/rewrite-target: /$1
注解说明您的其余前端。根据您的问题,我相信您不需要使用重写注释创建入口的详细说明。
EDIT1: 是的,可以使用同一主机创建多个入口。但是请注意确切的nginx入口。有关调查,请参考@LazerBass answer。
简而言之,基于nginx ingress comparation table,
nginxinc控制器不支持将Ingress规则与同一主机合并。您只能将其与Mergeable Ingresses
一起使用最简单的方法是使用常规kubernetes/ingress-nginx
希望有帮助。