问题描述
在使用Azure Kubernetes Service时,希望在根路径上使用rewrite-target。他想要将API服务放在/api
路径下,其他请求则回退到前端服务。奇怪的是,这在本地使用minikube时可以正常工作,但是在部署到Azure Kubernetes Service后(他使用了官方的MS教程来添加Ingress Controller),无法使其正常工作。
以下是他的配置文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /api/(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 9002
- path: /(.*)
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 9001
在minikube上可以正常工作,但在AKS上,当他尝试打开公共可用的IP时,会导致超时错误。他尝试了以下几种方法:
1. 将前端路径改为(/|$)(.*)
,并将rewrite-target改为/$2
。但是kubectl不会部署这个配置,因为路径需要是绝对路径。
2. 将前端路径改为/
。现在,所有请求都返回前端的index.html,即使请求是/style.css
或favicon.ico
等(除非以/api
开头)。
3. 将前端路径改为/
并删除rewrite-target。这样前端可以正常工作,但是API服务无法按预期工作。API服务有一个调用/get-employee
的接口,他希望将其调用路径改为/api/get-employee
,但是除非API服务本身已经有/api/get-employee
路径,否则无法实现。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在Azure Kubernetes Service中,可以通过在rules
部分添加host
来解决这个问题。以下是一个示例:
spec:
ingressClassName: nginx
rules:
- host: {your_app}.northeurope.cloudapp.azure.com
http:
paths:
- path: /test(/|$)(.*)
pathType: Prefix
backend:
service:
name: mockserver-service
port:
number: 1234
在上面的示例中,我们在rules
部分添加了host
。这将确保请求的主机名与指定的主机名匹配时,才会应用该规则。这样可以解决在根路径上使用rewrite-target的问题。
方案2
如果方案1无法解决问题,你可以尝试使用其他Ingress Controller,如Traefik或Contour。这些Ingress Controller可能具有更灵活的配置选项,可以满足你的需求。
方案3
如果以上两种方案都无法解决问题,你可以考虑使用其他方法来处理根路径和回退服务的需求。例如,你可以使用Nginx或Envoy作为反向代理,在代理配置中实现根路径和回退服务的逻辑。
以上是几种可能的解决方案,你可以根据自己的需求选择适合的方法来解决问题。希望对你有帮助!