gpt4 book ai didi

kubernetes - 后端返回404/422时,GKE基本元素间歇性返回502

转载 作者:行者123 更新时间:2023-12-02 12:14:26 32 4
gpt4 key购买 nike

我有一个入口,为在GKE上运行的两个微服务提供路由,并且当微服务返回404/422时,该入口间歇返回502。

这是我的入口定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: basic-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: develop-static-ip
ingress.gcp.kubernetes.io/pre-shared-cert: dev-ssl-cert
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: srv
servicePort: 80
- path: /c/*
backend:
serviceName: collection
servicePort: 80
- path: /w/*
backend:
serviceName: collection
servicePort: 80

我运行的测试到达了 srv后端,我希望得到404或422响应。当我直接(绕过入口)访问 srv后端时,我已经验证了服务正确响应404/422。

当我通过入口发出相同的请求时,入口将间歇性地使用502而不是来自后端的404/422进行响应。

我怎样才能让Ingress仅仅从后端返回404/422响应?

这是一些示例代码来演示我所看到的行为(预期状态为404):

>>> for i in range(10):
resp = requests.get('https://<server>/a/v0.11/accounts/junk', cookies=<token>)
print(resp.status_code)

502
502
404
502
502
404
404
502
404
404

这是从pod内的python提示符发出的相同请求,即绕过入口:

>>> for i in range(10):
... resp = requests.get('http://0.0.0.0/a/v0.11/accounts/junk', cookies=<token>)
... print(resp.status_code)
...
404
404
404
404
404
404
404
404
404
404

以下是kubectl命令的输出,以证明负载均衡器已正确设置(我从未从微服务获得2xx / 3xx响应的502):

$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
srv-799976fbcb-4dxs7 2/2 Running 0 19m 10.24.3.8 gke-develop-default-pool-ea507abc-43h7 <none> <none>
srv-799976fbcb-5lh9m 2/2 Running 0 19m 10.24.1.7 gke-develop-default-pool-ea507abc-q0j3 <none> <none>
srv-799976fbcb-5zvmv 2/2 Running 0 19m 10.24.2.9 gke-develop-default-pool-ea507abc-jjzg <none> <none>
collection-5d9f8586d8-4zngz 2/2 Running 0 19m 10.24.1.6 gke-develop-default-pool-ea507abc-q0j3 <none> <none>
collection-5d9f8586d8-cxvgb 2/2 Running 0 19m 10.24.2.7 gke-develop-default-pool-ea507abc-jjzg <none> <none>
collection-5d9f8586d8-tzwjc 2/2 Running 0 19m 10.24.2.8 gke-develop-default-pool-ea507abc-jjzg <none> <none>
parser-7df86f57bb-9qzpn 1/1 Running 0 19m 10.24.0.8 gke-develop-parser-pool-5931b06f-6mcq <none> <none>
parser-7df86f57bb-g6d4q 1/1 Running 0 19m 10.24.5.5 gke-develop-parser-pool-5931b06f-9xd5 <none> <none>
parser-7df86f57bb-jchjv 1/1 Running 0 19m 10.24.0.9 gke-develop-parser-pool-5931b06f-6mcq <none> <none>

$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
srv NodePort 10.0.2.110 <none> 80:30141/TCP 129d
collection NodePort 10.0.4.237 <none> 80:30270/TCP 129d
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 130d

$ kubectl get endpoints
NAME ENDPOINTS AGE
srv 10.24.1.7:80,10.24.2.9:80,10.24.3.8:80 129d
collection 10.24.1.6:80,10.24.2.7:80,10.24.2.8:80 129d
kubernetes 35.237.239.186:443 130d

最佳答案

tl; dr:如果来自后端的404/422没有响应主体,则GCP LoadBalancer / GKE入口将为502。

查看LoadBalancer日志,我会看到以下错误:

502: backend_connection_closed_before_data_sent_to_client
404: backend_connection_closed_after_partial_response_sent

由于一切都配置正确(即使LoadBalancer都说后端是正常的)-后端按预期运行,并且运行状况检查未失败-我尝试了几件事,并注意到我的404所有响应都为空体。

太好了,我在404和422响应中添加了一个主体,瞧,再也看不到502了!

关于kubernetes - 后端返回404/422时,GKE基本元素间歇性返回502,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58754331/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com