Kubernetes 准备就绪探测器和Apache公共Http客户端

Kubernetes 准备就绪探测器和Apache公共Http客户端,kubernetes,openshift,readinessprobe,Kubernetes,Openshift,Readinessprobe,我有一个简单的OpenShift设置,其中一个服务配置了2个后端吊舱。吊舱已配置就绪探测器。该服务通过节点端口公开。所有这些配置都很好,工作正常。一旦就绪探测失败,服务将pod标记为无法访问,任何新请求都不会路由到pod 情景1: 我执行CURL命令来访问服务。当curl命令执行时,我引入Pod-1的准备失败。我看到没有新的请求被发送到Pod-1。这很好 情景2: 我有一个Java客户端,并使用ApacheCommonsHTTP客户端库启动到Kubernetes服务的连接。连接已建立,并且工作正

我有一个简单的OpenShift设置,其中一个服务配置了2个后端吊舱。吊舱已配置就绪探测器。该服务通过节点端口公开。所有这些配置都很好,工作正常。一旦就绪探测失败,服务将pod标记为无法访问,任何新请求都不会路由到pod

情景1: 我执行CURL命令来访问服务。当curl命令执行时,我引入Pod-1的准备失败。我看到没有新的请求被发送到Pod-1。这很好

情景2: 我有一个Java客户端,并使用ApacheCommonsHTTP客户端库启动到Kubernetes服务的连接。连接已建立,并且工作正常。当我介绍Pod-1的准备失败时,问题就来了。我仍然看到客户端只向Pod-1发送请求,即使服务只有Pod-2的端点

我的直觉是,由于HttpClient在通过节点报告公开时使用持久性连接和服务,因此Http连接的目标地址是POD-1本身。因此,即使准备就绪探测器失败,它仍然会向Pod-1发送请求

有人能解释一下为什么会像上面所描述的那样工作吗?

kube proxy(或者更确切地说,它生成的iptables规则)在更改端点映射时故意不关闭现有的TCP连接(这是失败的就绪性探测将触发的)。多年来,这一点在许多票证上进行了大量讨论,但对于是否应该改变这种行为,通常几乎没有达成共识。目前,您最好的选择是使用入口控制器进行HTTP通信,因为这些控制器都会更新live并绕过kube代理。您还可以在响应中发回
保持活动
标题,并在N秒或请求后终止持久连接,尽管这只会缩小窗口以显示不好