gRPC 客户端在 Kubernetes 中重新连接

gRPC client reconnect inside Kubernetes

如果我们在 Kubernetes pods 中定义我们的微服务,如果服务 pod 正在重启,我们是否需要检测 gRPC 客户端重新连接?

当 pod 重新启动时,主机名不会更改,但我们不能保证 IP 地址保持不变。那么 gRPC 客户端是否仍然能够检测到要重新连接的新服务器?

您需要客户端负载平衡,如所述here. You can watch the endpoints of a service with Kubernetes api. I have created a package for Go programming language and it is on github。抱歉,我还没有写文档。基本概念是一开始就获取服务端点,而不是观察服务端点的变化。

当 TCP 连接断开时(因为旧的 pod 停止),gRPC 的通道将尝试使用指数退避重新连接。每次重新连接尝试都意味着解析 DNS 地址,尽管由于旧 DNS 条目的 TTL(生存时间),它可能不会立即检测到新地址。此外,我相信某些实现会在检测到故障时而不是在尝试之前解析地址。

此过程自然发生,您的应用程序无需执行任何操作,但在重新建立连接之前可能会遇到 RPC 失败。在 RPC 上启用 "wait for ready" 将减少 RPC 在此过渡期间失败的可能性,尽管这样的 RPC 通常意味着您不关心响应延迟。

如果 DNS 地址没有(最终)重新解析,那将是一个错误,您应该提交一个问题。