【发布时间】:2020-03-04 08:44:56
【问题描述】:
我有一个入口为 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。
如何让入口只从后端返回 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
【问题讨论】:
-
当您收到 502 http 错误响应时,您是否检查过堆栈驱动程序日志中的 502?根据堆栈驱动程序,这个 502 的原因是什么?此外,您提到您间歇性地收到 502,我很想知道当它不是 502 时您会收到什么其他响应代码。
-
stackdriver 日志没有与这些请求对应的条目。当我没有得到 502 时,我会得到预期的 404(或 422)。我添加了一个我看到的行为示例。
标签: kubernetes google-cloud-platform google-kubernetes-engine kubernetes-ingress http-response-codes