从外部服务重定向回来后,在 AKS nginx ingress 中抛出 502 Bad Gateway 错误
502 Bad Gateway error thrown in AKS nginx ingress after redirect back from external service
我们有一个运行中的 Azure Kubernetes 服务集群和 dotnet 6.0 web 应用程序。 pods 在端口 80 上 运行 但 public url 在 https 证书后面 运行,它由具有证书秘密的 nginx 入口控制器处理。所有这些都运行良好。
我们正在添加一些新功能(从外部服务集成)。使用此新功能登录我们的应用程序时,会短暂重定向到外部服务页面。用户请求完成后,外部服务使用预配置的重定向 url 重定向回我们的站点,向其发布一些数据(自定义 header 和查询字符串)。此时,我们的站点出现 502 bad gateway 错误。
当我查看 nginx 入口控制器 pod 上的日志时,我可以看到一些额外的错误:
[错误] 664#664:*17279861 上游在读取来自上游的响应 header 时过早关闭连接,客户端:10.240.0.5,服务器:www-dev.application.com,请求:“GET /details/c2beac1c-b220-45fa-8fd5-08da12dced76/Success?id=ID-MJCX43A4FJ032551T752200W&token=EC-0G826951TM357702S&SenderID=4FHGRLJDXPXUU HTTP/2.0”,上游:“http://10.244.1.66:80/details/c2beac1c-b220-45fa-8fd5-08da12dced76/Success?id=ID -MJCX43A4FJ032551T752200W&token=EC-0G826951TM357702S&SenderID=4FHGRLJDXPXUU", host: "www-dev.application.com", referrer: "https://www.external.service.com/"
10.244.1.66 是应用程序之一的内部 IP pods。
起初我以为这是一个与注释相关的错误:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
因为引荐来源网址是发出请求的 https:// 站点。但是,添加该注释会使该站点无法使用(可能是因为 dotnet 应用程序 pods 正在侦听端口 80)。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: application-web
namespace: application
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
tls:
- hosts:
- www-dev.application.com
secretName: application-ingress-tls
rules:
- host: www-dev.application.com
http:
paths:
- path: /(.*)
pathType: Prefix
backend:
service:
name: applicationwebsvc
port:
number: 80
这是应用程序入口 yaml。
无论如何,有谁知道这里可能有什么问题吗?谢谢
Ingress class 从 annotation 移动到 ingressClassName 字段,而且您之前不需要指定 https。你能试试这个吗:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: application-web
namespace: application
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- www-dev.application.com
secretName: application-ingress-tls
rules:
- host: www-dev.application.com
http:
paths:
- path: /(.*)
pathType: Prefix
backend:
service:
name: applicationwebsvc
port:
number: 80
请同时检查入口 documentation。
这是一个资源限制问题。有一个特定的请求导致内存使用量激增。这会导致容器被 OOMKilled。这就是导致 502 Bad gateway 错误消息的原因(因为当它被杀死时,容器不再在那里为请求提供服务)。
我们有一个运行中的 Azure Kubernetes 服务集群和 dotnet 6.0 web 应用程序。 pods 在端口 80 上 运行 但 public url 在 https 证书后面 运行,它由具有证书秘密的 nginx 入口控制器处理。所有这些都运行良好。
我们正在添加一些新功能(从外部服务集成)。使用此新功能登录我们的应用程序时,会短暂重定向到外部服务页面。用户请求完成后,外部服务使用预配置的重定向 url 重定向回我们的站点,向其发布一些数据(自定义 header 和查询字符串)。此时,我们的站点出现 502 bad gateway 错误。
当我查看 nginx 入口控制器 pod 上的日志时,我可以看到一些额外的错误:
[错误] 664#664:*17279861 上游在读取来自上游的响应 header 时过早关闭连接,客户端:10.240.0.5,服务器:www-dev.application.com,请求:“GET /details/c2beac1c-b220-45fa-8fd5-08da12dced76/Success?id=ID-MJCX43A4FJ032551T752200W&token=EC-0G826951TM357702S&SenderID=4FHGRLJDXPXUU HTTP/2.0”,上游:“http://10.244.1.66:80/details/c2beac1c-b220-45fa-8fd5-08da12dced76/Success?id=ID -MJCX43A4FJ032551T752200W&token=EC-0G826951TM357702S&SenderID=4FHGRLJDXPXUU", host: "www-dev.application.com", referrer: "https://www.external.service.com/"
10.244.1.66 是应用程序之一的内部 IP pods。
起初我以为这是一个与注释相关的错误:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
因为引荐来源网址是发出请求的 https:// 站点。但是,添加该注释会使该站点无法使用(可能是因为 dotnet 应用程序 pods 正在侦听端口 80)。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: application-web
namespace: application
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
tls:
- hosts:
- www-dev.application.com
secretName: application-ingress-tls
rules:
- host: www-dev.application.com
http:
paths:
- path: /(.*)
pathType: Prefix
backend:
service:
name: applicationwebsvc
port:
number: 80
这是应用程序入口 yaml。
无论如何,有谁知道这里可能有什么问题吗?谢谢
Ingress class 从 annotation 移动到 ingressClassName 字段,而且您之前不需要指定 https。你能试试这个吗:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: application-web
namespace: application
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- www-dev.application.com
secretName: application-ingress-tls
rules:
- host: www-dev.application.com
http:
paths:
- path: /(.*)
pathType: Prefix
backend:
service:
name: applicationwebsvc
port:
number: 80
请同时检查入口 documentation。
这是一个资源限制问题。有一个特定的请求导致内存使用量激增。这会导致容器被 OOMKilled。这就是导致 502 Bad gateway 错误消息的原因(因为当它被杀死时,容器不再在那里为请求提供服务)。