【问题标题】:Fixing kubernetes service redeploy errors with keep-alive enabled在启用 keep-alive 的情况下修复 kubernetes 服务重新部署错误
【发布时间】:2017-03-20 21:03:07
【问题描述】:
我们有一个在三台机器上运行的 kubernetes 服务。我们集群内部和外部的客户端都通过启用了 keep-alive 选项的 http 与该服务通信。在服务部署期间,退出的 pod 有一个就绪检查,当关闭开始时开始失败,并从服务端点列表中适当地删除,但是它们仍然接收流量并且一些请求失败,因为容器将突然退出。我们认为这是因为保持连接允许客户端重新使用在主机就绪时建立的这些连接。是否应该遵循一系列步骤来确保我们不会遇到这些问题?如果可能,我们希望允许保持连接。
【问题讨论】:
标签:
http
kubernetes
keep-alive
kubernetes-health-check
【解决方案1】:
如果代理/负载平衡发生在第 4 层而不是第 7 层,则会出现此问题。对于内部服务(Kubernetes 服务类型为 ClusterIP),由于 Kube-proxy 使用第 4 层代理进行代理,客户端将保持即使在 pod 不再准备好服务之后,连接也是如此。同样,对于 LoadBalancer 类型的服务,如果后端类型设置为 TCP(默认情况下使用 AWS ELB),也会发生同样的问题。请参阅this 问题了解更多详情。
目前解决这个问题的方法是:
- 如果您使用的是云 LoadBalancer,请继续将后端设置为 HTTP。例如,您可以在 kubernetes 服务中添加
service.beta.kubernetes.io/aws-load-balancer-backend-protocol 注解并将其设置为 HTTP,以便 ELB 使用 HTTP 代理而不是 TCP。
- 使用集群内的第 7 层代理/入口控制器来路由流量,而不是通过
kube-proxy 发送流量
【解决方案2】:
我们遇到了同样的问题,所以想知道您是否找到了解决此问题的方法。根据this link,应该可以通过在服务前面安装一个负载均衡器来做到这一点,该负载均衡器将直接向 Pod 发出请求并自行处理 Keep-Alive 连接。
我们将继续调查这个问题,看看我们是否可以找到一种方法来使用保持连接的零停机时间部署。