Kubernetes nginx路由流量到/api/*



我有一个kubernetes集群,配置了nginx来端口流量到我的angular应用程序。它工作得很好,但是当我访问myipaddress/api/v1时,我希望nginx将流量端口到我的express应用程序,该应用程序正在监听端口3000和angular应用程序,而不是将myipaddress/api/v1视为angular中的路由组件,因为它不存在。

这是我的kubernetes nginx入口

apiVersion: v1
kind: Service
metadata:
name: backend
spec:
type: ClusterIP
ports:
- port: 3000
targetPort: 3000
selector:
app: backend
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: backend-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /api/?(.*)
pathType: Prefix
backend:
service:
name: backend
port:
number: 3000

这是我对angular

的入口
---
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
app: webapp
--- 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp
port:
number: 80

我想达到的角度

myipaddres.com        -> serve angular application`
myipaddress.com/users -> serve angular router for /users

我想要表达的:

myipaddress.com/api/v1/users -> call the users v1 endpoint in express
myipaddress.com/api/v2/users -> call the users v2 endpoint in express

好吧,我自己设法找到了解决方案,张贴这个以防有人需要它。kubernetes的最新api(直到发布本文为止)支持正则表达式,但您应该通过annotation显式启用它。

---
# ingress traffic
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: backend-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true" # enabling regex annotation
spec:
rules:
- http:
paths:
- path: /api/*      # works fine with regex enabled
pathType: Prefix
backend:
service:
name: backend
port:
number: 3000

同样适用于需要反向代理的任何其他入口路径。

最新更新