天蓝色的 AKS |应用网关 |入口 |后端前缀

Azure AKS | Application gateway | Ingress | Backend Prefix

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

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

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

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

这可以解释错误的网关。

Azure AppGW经常会return 502 Bad Gateway 涉及到Bad Certs,后端服务健康检查错误等原因

你应该看看这个:

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

@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),应该返回数据但失败。

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

curl -v http://orders.apps.com/api/orders/employees returns 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 returns 404。其他端点也是如此 curl -v http://orders.apps.com/api/department/codes returns 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

非常感谢您的建议。 谢谢

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

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

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

第一

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

我遇到了同样的问题。我的入口设置如下:

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”就足够了。

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

  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

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