我在我们的EKS集群上运行istio 1.0.6(没有mTLS),并且遇到了两个pod之间的连接问题,我似乎无法弄清楚。
我有一个gRPC客户端(abc-client
)和服务器(abc-server
)运行写入go。群集启用了自动边车注入,因此两者都运行。
如果我只启动这两项服务,一切正常,但每当服务器重新启动时,客户端都无法重新连接它。从重新启动开始,我不断在客户端上收到以下错误消息:
{"level":"error","error":"rpc error: code = Unavailable desc = upstream connect error or disconnect/reset before headers","time":"2019-03-19T12:07:52Z","message":"abc-server service unhealthy"}
没有istio边车,重新连接立即起作用。当我查看abc-client
的sidecar日志时,我看到很多以下消息用于客户端尝试执行的运行状况检查:
2019-03-19T12:09:41.527Z] "POST /grpc.health.v1.Health/CheckHTTP/2" 200 UF 5 0 1002 - "-" "grpc-go/1.15.0" "6a874d67-9c43-4b67-ad24-7337a26cac8d" "abc-server.abc-namespace:8086" "172.31.18.194:8086" outbound|8086||abc-server.abc-namespace.svc.cluster.local - 172.31.18.194:8086 172.31.22.131:44994
我从这些日志中得到的结论是代理在连接到不再存在的上游服务器时遇到问题,因此UF
标志(上游故障)但仍然向客户端返回200
状态代码。对我来说,似乎这种行为不会触发重新连接。
我没有设置任何VirtualService
s或DestinationRule
s,它只是一个简单的istio集群,启用了侧边车。
我错过了什么?在此先感谢您的帮助。
问题是连接到无头服务。我的service.yaml
看起来像这样:
apiVersion: v1
kind: Service
metadata:
name: grpc-test-server
spec:
type: ClusterIP
clusterIP: None
selector:
app: grpc-test-server
role: grpc-test-server
ports:
- name: grpc
port: 9999
targetPort: grpc
根据问题,#10659和#7495 istio无法使用无头服务。
所以,如果你不需要你的服务无头,你可以从yaml中删除clusterIP: None
,一切都应该按预期工作。
我仍然不知道如何使状态设置工作require无头服务。