使用带路径重定向的 nginx kubernetes 路由 LoadBalancer 时,为什么我无法正确访问我的服务?

When using a nginx kubernetes routing LoadBalancer with path redirects, why can I not access my service correctly?

我正在使用 AKS 和 Helm v2.2 来尝试部署一个图表,该图表利用 nginx LoadBalancer Pod 来控制通过单个 IP 地址进入我的服务的所有入口。这在很大程度上处于实验阶段,但我已经证明,当我为我的 .net 核心 webapi 服务使用以下 Helm 入口配置时:

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  hosts:
    - host:
      paths:
        - /

然后我确实可以访问我暴露的 api 并在

看到大摇大摆的 ui
http://[My External IP]/index.html 

然后我想做的是将多个服务放在同一个 LoadBalancer 后面(如您所愿),所以我的期望是我可以将上述服务配置更改为如下所示:

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  hosts:
    - host:
      paths:
        - /serviceA

这应该意味着我可以通过现在更新的 url:

访问相同的服务
http://[My External IP]/serviceA/index.html

这是我应该期待的工作吗?我是否需要使用任何类型的重写系统,因为我从这个 url 中得到错误,说它找不到某些缺失的资源。任何使用重写注释的尝试也没有帮助我。有人可以帮我指出我可能做错了什么吗?使用新的 url 路径,我最终遇到以下类型的错误,这些错误似乎是 index.html 页面试图加载的文件,表明它工作了一半但需要重写或其他东西?

Failed to load resource: the server responded with a status of 404 ()

由于 Helm 图表模板引擎,创建了以下入口 yaml 文件:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: myrelease-release-manager
  labels:
    app.kubernetes.io/name: release-manager
    helm.sh/chart: release-manager-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /serviceA
    nginx.ingress.kubernetes.io/ssl-redirect: "false"

spec:
  rules:
    - host:
      http:
        paths:
          - path: /serviceA
            backend:
              serviceName: myrelease-release-manager
              servicePort: 80

由于这个入口文件,当我使用路径 /serviceA/index.html.

访问我的外部 IP 地址时,我想访问此服务

关闭,您需要将重写目标更新为/$2

nginx.ingress.kubernetes.io/rewrite-target: /

重写

/serviceB/foo -> /foo

/serviceA/foo -> /foo

但是每个人都将被定向到该路径的服务

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: myrelease-release-manager
  labels:
    app.kubernetes.io/name: release-manager
    helm.sh/chart: release-manager-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
 spec:
   rules:
   - http:
       paths:
       - backend:
           serviceName: serviceB
           servicePort: 80
         path: /serviceB(/|$)(.*)
       - backend:
           serviceName: serviceA
           servicePort: 80
         path: /serviceA(/|$)(.*)