如何通过三行配置解决在Kubernetes中的gRPC扩展问题( 二 )


除非不是DNS问题...
几乎每个地方都有DNS TTL缓存 。基础设施DNS具有其自己的缓存 。JAVA客户端遭受了它们默认的30秒TTL缓存 , 而Go客户端通常没有实现DNS缓存 。与此相反,Java客户端报告了数百或数千次此问题的发生 。当然,我们可以缩短TTL缓存的时间 , 但为什么要在滚动更新期间只影响gRPC呢?
幸运的是,有一个易于实现的解决方法 。或者更好地说 , 解决方案:让新Pod启动时设置30秒的延迟 。
.spec.minReadySeconds = 30

  • 1.
Kubernetes部署规范允许我们设置新Pod必须处于就绪状态的最短时间,然后才会开始终止旧Pod 。在此时间之后 , 连接被终止,gRPC客户端收到GOAWAY信号并开始重新发现 。TTL已经过期 , 因此客户端获取到了新的、最新的记录 。
结论从配置的角度来看,gRPC就像一把瑞士军刀,可能不会默认适合您的基础架构或应用程序 。查看文档 , 进行调整,进行实验,并充分利用您已经拥有的资源 。我相信可靠和弹性的通信应该是您的最终目标 。
我还建议查看以下内容:
  • Keepalives 。对于短暂的内部集群连接来说可能没有意义 , 但在某些其他情况下可能会有用 。
  • 重试 。有时 , 值得首先进行一些退避重试,而不是通过尝试创建新连接来过载基础设施 。
  • 代码映射 。将您的gRPC响应代码映射到众所周知的HTTP代码,以更好地了解发生了什么情况 。
  • 负载均衡 。平衡是关键 。不要忘记设置回退并进行彻底的测试 。
  • 服务器访问日志(gRPC code=OK)可能会因默认设置为信息级别而太冗长 。考虑将它们降低到调试级别并进行筛选 。




推荐阅读