首页 文章

Google Container Engine Kubernetes Service LoadBalancer是否向无响应的主机发送流量?

提问于
浏览
1

问题: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 回答

  • 4

    Kubernetes(通过Google容器引擎)创建的Google Cloud 网络LoadBalancer是否向未收听的主机发送流量?

    所有主机(当前正在运行功能性kube-proxy进程)都能够接收和处理外部化服务的传入请求 . 请求将落在群集中的任意节点VM上,匹配iptables规则并被转发(通过kube-proxy进程)到具有与服务匹配的标签选择器的pod .

    因此,如果您的节点VM运行在损坏状态,那么运行状况检查程序可以阻止请求被丢弃的情况 . 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 应该使用的内容) .

    最好直接 Health 检查kube-proxy进程,但它只是binds to localhost,而kubelet进程binds to all interfaces所以它可以由 Health 检查程序访问,它应该作为一个很好的指示,该节点足够 Health ,可以提供请求你的服务 .

相关问题