在Azure Kubernetes Service中如何在根路径上使用rewrite-target

75次阅读
没有评论

问题描述

在使用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.cssfavicon.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作为反向代理,在代理配置中实现根路径和回退服务的逻辑。

以上是几种可能的解决方案,你可以根据自己的需求选择适合的方法来解决问题。希望对你有帮助!

正文完