问题:Kubernetes(通过Google容器引擎)创建的Google Cloud网络LoadBalancer是否向未收听的主机发送流量? “此目标池没有运行状况检查,因此无论状态如何,都将向所有实例发送流量 . ”
我有一个针对特定pod的服务(NGINX反向代理)并使TCP:80,443可用 . 在我的示例中,只有1个NGINX pod在实例池中运行 . 服务类型是“LoadBalancer” . 使用Google容器引擎,这将创建一个新的LoadBalancer(LB),用于指定目标池和特定的VM实例 . 然后创建LB的短暂外部IP地址和允许传入流量的关联防火墙规则 .
我的问题是Kubernetes自动生成的防火墙规则描述是“KubernetesAutoGenerated_OnlyAllowTrafficForDestinationIP_1.1.1.1”(IP是LB外部IP) . 在测试中我注意到即使每个VM实例都有一个外部IP地址,我也无法在任何一个实例IP地址的端口80或443上联系它,只能联系LB IP . 这对于外部用户流量来说并不坏,但是当我尝试为我的LB创建运行状况检查时,我发现它在单独检查每个VM实例时始终看到服务不可用 .
我有适当的防火墙规则,以便任何IP地址可以联系我池中的任何实例上的TCP 443,80,所以这不是问题 .
有人可以向我解释这一点,因为它让我认为LB正在将HTTP请求传递给两个实例,尽管其中只有一个实例在其上运行NGINX pod .
1 回答
所有主机(当前正在运行功能性kube-proxy进程)都能够接收和处理外部化服务的传入请求 . 请求将落在群集中的任意节点VM上,匹配iptables规则并被转发(通过kube-proxy进程)到具有与服务匹配的标签选择器的pod .
因此,如果您的节点VM运行在损坏状态,那么运行状况检查程序可以阻止请求被丢弃的情况 . VM仍然具有与转发规则匹配的目标标签,但是无法处理传入的数据包 .
这是按预期工作的 . 每个服务都可以使用任何所需的端口,这意味着多个服务可以使用端口80和443.如果数据包到达端口80上的主机IP,主机无法知道哪个(可能很多)服务使用端口80应该转发数据包 . 服务的iptables规则处理发往虚拟内部集群服务IP和外部服务IP的数据包,但不处理主机IP .
如果要设置运行状况检查以验证节点是否正常工作,可以通过安装防火墙规则来检查在端口
10250
上运行的kubelet进程:(查看Container Engine HTTP Load Balancer文档以帮助查找
$TAG
应该使用的内容) .最好直接 Health 检查kube-proxy进程,但它只是binds to localhost,而kubelet进程binds to all interfaces所以它可以由 Health 检查程序访问,它应该作为一个很好的指示,该节点足够 Health ,可以提供请求你的服务 .