修复启用 keep-alive 的 kubernetes 服务重新部署错误

Fixing kubernetes service redeploy errors with keep-alive enabled

我们在三台机器上有一个 kubernetes 服务 运行ning。我们集群内部和外部的客户端都通过启用了 keep-alive 选项的 http 与该服务通信。在服务部署期间,退出的 pods 有一个就绪检查,当关闭开始时开始失败,并适当地从服务端点列表中删除,但是它们仍然接收流量并且一些请求失败,因为容器会突然出口。我们认为这是因为 keep-alive 允许客户端重新使用主机就绪时建立的这些连接。是否应该遵循一系列步骤来确保我们不会 运行 陷入这些问题?如果可能的话,我们希望允许保持连接。

我们 运行 遇到了同样的问题,所以想知道您是否找到了解决此问题的方法。根据 this link 的说法,应该可以通过在服务前面设置一个负载均衡器来做到这一点,该负载均衡器将直接请求 pods 并自行处理 Keep-Alive 连接。

我们将继续调查此问题,看看是否可以找到一种通过保持活动连接进行零停机部署的方法。

如果 proxying/load 平衡发生在第 4 层而不是第 7 层,就会出现此问题。对于内部服务(类型为 ClusterIP 的 Kubernetes 服务),由于 Kube-proxy 使用第 4 层代理进行代理,即使 pod 不再准备好服务,客户端也会保持连接。同样,对于 LoadBalancer 类型的服务,如果后端类型设置为 TCP(AWS ELB 默认为 TCP),也会发生同样的问题。请参阅 this 问题了解更多详情。

目前这个问题的解决方案是:

  • 如果您使用的是云 LoadBalancer,请继续将后端设置为 HTTP。例如,您可以为 kubernetes 服务添加 service.beta.kubernetes.io/aws-load-balancer-backend-protocol 注释并将其设置为 HTTP,以便 ELB 使用 HTTP 代理而不是 TCP。
  • 在集群中使用第 7 层 proxy/ingress 控制器路由流量,而不是通过 kube-proxy
  • 发送流量