天蓝色的 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://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
没有任何额外的注释。无论出于何种原因,如果末尾没有“*”,它就无法工作。
我对路径解析端点的方式有点困惑,它是否在任何日志中显示它创建的最终端点。我现在坚持这个。下面是我想调用的端点:-
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://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
没有任何额外的注释。无论出于何种原因,如果末尾没有“*”,它就无法工作。