我有一个在 k8s 上运行的 spring 微服务,有 2 个 API URL。
- 第一个是
/api/actuator
健康检查 - 在端口 9010 上运行 - 第二个是
/api
针对所有其他 API 调用 - 在端口 9000 上运行
我已经创建了ClusterIP
服务来在相应的端口上公开它们。
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
ports:
- name: main-port
port: 80
protocol: TCP
targetPort: 9000
- name: health-port
port: 9010
protocol: TCP
targetPort: 9010
selector:
app: myapp
现在我想在此服务之上创建一个遵循基于路径的路由的入口。
任何类似的请求/myapp/api/actuator/anything
都应重写为/api/actuator/anything
(与原始请求相同)。
例如/myapp/api/actuator/health
应该重写为/api/actuator/health`。
任何类似的请求/myapp/api/anything
都应重写为/api/anything
(与原始请求相同)。
例如/myapp/api/v1/getID/{id}
应该重写为/api/v1/getID/{id}
。
我在编写重写规则时遇到了困难。到目前为止,我只能想出以下规则:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: gitops-lkart-api
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /api/$1
spec:
rules:
- http:
paths:
- path: /myapp/api/actuator/(.*)
backend:
serviceName: myapp-svc
servicePort: 9010
- http:
paths:
- path: /myapp/api/(.*)
backend:
serviceName: myapp-svc
servicePort: 80
但这只适用于/api
路径,而不适用于执行器。
请建议应该写什么规则来实现这一点?
答案1
这应该有效:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: gitops-lkart-api-1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /api/actuator/$1
spec:
rules:
- http:
paths:
- path: /myapp/api/actuator/(.*)
backend:
serviceName: myapp-svc
servicePort: 9010
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: gitops-lkart-api-2
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /api/$1
spec:
- http:
paths:
- path: /myapp/api/(.*)
backend:
serviceName: myapp-svc
servicePort: 80
您可以创建 2 个独立的入口。
如果流量达到,/myapp/api/actuator/anything
它将被重写为/api/actuator/anything
。
在其他情况下,如果流量达到/myapp/api/anything
它将被重写为/api/anything
。