我在EKS集群上运行istio 1.0.6(无mTLS),并且遇到了两个Pod之间的连接问题,我似乎无法弄清。
我有一个运行在go中的gRPC客户端(abc-client
)和服务器(abc-server
)。集群启用了自动边车注入功能,因此都可以运行。
如果我仅启动这两个服务,那么一切工作都很好,但是只要服务器重新启动,客户端就无法重新连接到它。从重启开始,我在客户端上不断收到以下错误消息:
{"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 sidecar,重新连接立即起作用。
当我查看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
或DestinationRule
,这只是一个启用了sidecar的简单istio群集。
我想念什么?在此先感谢您的帮助。
答案 0 :(得分:2)
问题在于连接无头服务。我的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无头服务使用状态集。