Istio Sidecar上游吊舱重新连接问题

时间:2019-03-19 12:16:52

标签: kubernetes grpc istio eks

我在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状态代码给客户。在我看来,这种行为不会触发重新连接。

我没有设置任何VirtualServiceDestinationRule,这只是一个启用了sidecar的简单istio群集。

我想念什么?在此先感谢您的帮助。

1 个答案:

答案 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无头服务使用状态集。