首页 > 解决方案 > Istio sidecar 上游 pod 重新连接问题

问题描述

我在我们的 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 sidecar,重新连接会立即工作。当我查看 Sidecar 的日志时,abc-client我看到了很多关于客户端尝试执行的健康检查的以下消息:

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向客户端返回状态代码。对我来说,这种行为似乎不会触发重新连接。

我没有设置任何VirtualServices 或DestinationRules,它只是一个启用了 sidecars 的简单 istio 集群。

我错过了什么?在此先感谢您的帮助。

标签: kubernetesgrpcistioamazon-eks

解决方案


问题是连接到无头服务。我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 尚不适用于无头服务。

所以,如果你不需要你的服务是无头的,你可以clusterIP: None从 yaml 中删除,一切都应该按预期工作。

我仍然不知道如何使需要无头服务的状态集工作。


推荐阅读