【问题标题】:Azure AKS | Application gateway | Ingress | Backend PrefixAzure AKS |应用网关 |入口 |后端前缀
【发布时间】:2026-02-05 12:15:01
【问题描述】:

我对路径解析端点的方式有点困惑,它是否在任何日志中显示它创建的最终端点。我现在被困住了。下面是我想调用的端点:-

https://hostname/api/orders/employees。并通过 Ingress 应用程序网关调用此端点,这是我配置的方式,但它总是返回 502 bad gateway 错误。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ordersapi
  namespace: orders
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/appgw-ssl-certificate: "wildcard.apps.com"
    appgw.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  rules:
  - host: orders.apps.com
    http:
      paths:
      - path: /api/orders/employees
        backend:
          serviceName: orderservice
          servicePort: 80

【问题讨论】:

  • 后端服务上的路径是什么,是“/api/orders/employees”吗?
  • 是的 - api/orders/employees。

标签: kubernetes-ingress gateway nginx-ingress azure-aks


【解决方案1】:

我遇到了同样的问题。我的入口设置是这样的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - host: <myhostname>
    http:
      paths:
      - path: /api*
        backend:
          serviceName: backend-app
          servicePort: 80
      - path: /
        backend:
          serviceName: frontend-app
          servicePort: 80

如果我定义了 /api/todolist 之类的路径,则端点工作正常。另一方面,如果我使用 /api*,我的请求将被重定向到前端应用程序。

问题是我的后端存在端点 /api/todolist 并且返回的状态是 200,对于 /api 端点我没有设置任何东西所以我得到了 404 状态。

在我的情况下,我需要在 /api edpoint 下添加 healthcheck,这会返回正确的 http 状态 :) 对我来说返回字符串“Healthy”就足够了。

【讨论】:

    【解决方案2】:

    您似乎已启用 SSL 重定向,但您的服务在非 ssl 端口上提供服务。

    这可以解释坏网关。

    通常情况下,Azure AppGW 会在涉及错误 Certs、后端服务健康检查错误等原因时返回 502 Bad Gateway

    你应该看看这个:

    https://support.microsoft.com/en-ca/help/4504111/azure-application-gateway-with-bad-gateway-502-errors

    还有这个

    https://docs.microsoft.com/en-us/azure/application-gateway/application-gateway-troubleshooting-502

    【讨论】:

      【解决方案3】:

      @djsly @Jean-Philippe Bond - 感谢您的回复并指出帮助我进一步调查的 URL。将后端应用程序部署在端口 80 上是有原因的,因为 SSL 在应用程序网关处终止,并且侦听器将请求重定向到在端口 80 上运行的后端应用程序,这工作正常。

      经过进一步调查,我在入口文件 (appgw.ingress.kubernetes.io/backend-path-prefix: "/api/orders/employees") 中添加了后端路径前缀,这解决了一个端点的问题,但不是所有端点.

      为了详细描述问题,应用程序包含一些下面提到的restful服务,它们的端点例如-

      http://hostname/api/orders/employees http://hostname/api/Lookup/officeHierarchy http://hostname/api/Department/codes http://hostname/api/position/members

      现在,如果您看到,这些不同的端点以前缀“/api/”开头,然后是控制器名称和操作。

      这里预期结果是 如果调用这些端点中的任何一个(通过 HTTP Get),则应该返回数据,但它会失败。

      目前已完成调查 我添加了前缀并对其进行了一些更改。因此,如果我像下面这样配置我的入口,它只为一个特定的端点成功返回结果 - >

      curl -v http://orders.apps.com/api/orders/employees 返回 200 但其他人失败。

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: ordersapi
        namespace: orders
        annotations:
          kubernetes.io/ingress.class: azure/application-gateway
          appgw.ingress.kubernetes.io/backend-path-prefix: "/api/orders/employees"
          appgw.ingress.kubernetes.io/appgw-ssl-certificate: "wildcard.apps.com"
          appgw.ingress.kubernetes.io/ssl-redirect: "true"
      spec:
        rules:
        - host: orders.apps.com
          http:
            paths:
            - path: /api/orders/employees
              backend:
                serviceName: orderservice
                servicePort: 80
      

      因此,为了使所有端点都能正常工作,我在上述入口文件中进行了以下更改,但调用 curl -v http://orders.apps.com/api/orders/employees 返回 404。其他端点也是如此 curl -v http://orders.apps.com/api/department/codes 返回 404。

      根据我的理解,通过执行以下更改 - “路径 - /api/*”应该被覆盖到路径 - /api/orders/employees 被调用,但它没有。

      
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: ordersapi
        namespace: orders
        annotations:
          kubernetes.io/ingress.class: azure/application-gateway
          appgw.ingress.kubernetes.io/backend-path-prefix: "/api/"
          appgw.ingress.kubernetes.io/appgw-ssl-certificate: "wildcard.apps.com"
          appgw.ingress.kubernetes.io/ssl-redirect: "true"
      spec:
        rules:
        - host: orders.apps.com
          http:
            paths:
            - path: /api*
              backend:
                serviceName: orderservice
                servicePort: 80
      

      感谢您的建议。 谢谢

      【讨论】:

      • 您是否尝试删除backend-path-prefix 并将路径设置为/。请告诉你这样做后你得到了什么?
      • 抱歉回复晚了,它会抛出 404 错误。它是否会在代码中的某处生成 URL。
      • 在没有后端路径前缀的情况下定义多个路径......例如。 - http:路径:路径:/api/order/employees 后端:serviceName:orderservice servicePort:80 路径:/api/position/members 后端:serviceName:positionservice servicePort:80
      【解决方案4】:

      定义多个路径没有后端路径前缀工作,例如 网址: 路径: 路径:/api/order/employees 后端: 服务名称:orderservice 服务端口:80 路径:/api/position/members 后端: 服务名称:位置服务 服务端口:80

      这似乎是一种复杂的方法,但到目前为止,我发现这是唯一可行的方法。

      【讨论】:

        【解决方案5】:

        最后,这个问题有两种解决方案:-

        第一

        apiVersion: extensions/v1beta1
        kind: Ingress
        metadata:
          name: ordersapi
          namespace: orders
          annotations:
            kubernetes.io/ingress.class: azure/application-gateway
            appgw.ingress.kubernetes.io/appgw-ssl-certificate: "wildcard.apps.com"
            appgw.ingress.kubernetes.io/ssl-redirect: "true"
        spec:
          rules:
          - host: orders.apps.com
            http:
              paths:
              - path: /api/orders/employees
                backend:
                  serviceName: orderservice
                  servicePort: 80
              - path: /api/product/products
                backend:
                  serviceName: orderservice
                  servicePort: 80h
        

        第二

        apiVersion: extensions/v1beta1
        kind: Ingress
        metadata:
          name: ordersapi
          namespace: orders
          annotations:
            kubernetes.io/ingress.class: azure/application-gateway
            appgw.ingress.kubernetes.io/backend-path-prefix: "/api/"
            appgw.ingress.kubernetes.io/appgw-ssl-certificate: "wildcard.apps.com"
            appgw.ingress.kubernetes.io/ssl-redirect: "true"
        spec:
          rules:
          - host: orders.apps.com
            http:
              paths:
              - path: /api/*
                backend:
                  serviceName: orderservice
                  servicePort: 80
        

        【讨论】:

          【解决方案6】:

          对我来说,解决方案是在路径中添加“*”,例如

            rules:
              - http:
                  paths:
                    - pathType: Prefix
                      path: /api/*
                      backend:
                        service:
                          name: api
                          port:"
                            number: 80
                    - pathType: Prefix
                      path: /graphql*
                      backend:
                        service:
                          name: api
                          port:
                            number: 80
          

          没有任何额外的注释。无论出于何种原因,如果最后没有“*”,它就无法工作。

          【讨论】: