问题: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。
答案 0 :(得分:4)
Kubernetes(通过Google容器引擎)创建的Google Cloud网络LoadBalancer是否向不听的主机发送流量?
所有主机(当前正在运行功能性kube-proxy进程)都能够接收和处理外部化服务的传入请求。请求将落在群集中的任意节点VM上,匹配iptables规则并被转发(通过kube-proxy进程)到具有与服务匹配的标签选择器的pod。
因此,如果您的节点VM处于损坏状态,那么运行状况检查程序可以阻止请求被丢弃的情况。 VM仍然具有与转发规则匹配的目标标签,但是不能处理传入的数据包。
在测试中,我注意到即使每个虚拟机实例都有外部IP地址,我也无法在任何一个实例IP地址的端口80或443上联系它,只能联系LB IP。
这是按预期工作的。每个服务都可以使用任何所需的端口,这意味着多个服务可以使用端口80和443.如果数据包到达端口80上的主机IP,主机无法知道哪个(可能很多)服务使用端口80应该转发数据包。服务的iptables规则处理发往虚拟内部集群服务IP和外部服务IP的数据包,但不处理主机IP。
这对外部用户流量并不坏,但当我尝试为我的LB创建运行状况检查时,我发现它在单独检查每个VM实例时始终看到服务不可用。
如果要设置运行状况检查以验证节点是否正常工作,可以通过安装防火墙规则来检查端口10250
上运行的kubelet进程:
$ gcloud compute firewall-rules create kubelet-healthchecks \
--source-ranges 130.211.0.0/22 \
--target-tags $TAG \
--allow tcp:10250
(请查看Container Engine HTTP Load Balancer文档,以帮助查找$TAG
}应该使用的内容。
最好直接健康检查kube-proxy进程,但它只有binds to localhost,而kubelet进程binds to all interfaces因此健康检查程序可以访问它,它应该是一个好的指示节点是否足够健康以便为您的服务提供请求。