在 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
希望对您有所帮助。
我正在设置一个 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
希望对您有所帮助。