Google compute engine Google容器引擎Kubernetes服务负载均衡器是否向无响应的主机发送流量?

Google compute engine Google容器引擎Kubernetes服务负载均衡器是否向无响应的主机发送流量?,google-compute-engine,google-cloud-platform,kubernetes,google-kubernetes-engine,Google Compute Engine,Google Cloud Platform,Kubernetes,Google Kubernetes Engine,问:Kubernetes(通过Google容器引擎)创建的Google云网络负载均衡器是否向未侦听的主机发送流量?此目标池没有运行状况检查,因此无论其状态如何,流量都将发送到所有实例 我有一个服务(NGINX反向代理),它针对特定的pod,并使TCP:80443可用。在我的示例中,只有1个NGINX pod在实例池中运行。服务类型为“负载平衡器”。使用Google容器引擎,这将创建一个新的LoadBalancer(LB),用于指定目标池、特定VM实例。然后创建LB的临时外部IP地址和允许传入流量

问:Kubernetes(通过Google容器引擎)创建的Google云网络负载均衡器是否向未侦听的主机发送流量?此目标池没有运行状况检查,因此无论其状态如何,流量都将发送到所有实例

我有一个服务(NGINX反向代理),它针对特定的pod,并使TCP:80443可用。在我的示例中,只有1个NGINX pod在实例池中运行。服务类型为“负载平衡器”。使用Google容器引擎,这将创建一个新的LoadBalancer(LB),用于指定目标池、特定VM实例。然后创建LB的临时外部IP地址和允许传入流量的相关防火墙规则

我的问题是Kubernetes自动生成的防火墙规则描述是“KubernetesAutoGenerated_only低流量ForDestinationIP_1.1.1.1”(IP是LB外部IP)。在测试中,我注意到,即使每个VM实例都有一个外部IP地址,我也无法在实例IP地址的端口80或443上与它联系,只有LB IP。这对于外部用户流量来说并不坏,但是当我尝试为我的LB创建健康检查时,我发现当它单独检查每个VM实例时,它总是认为服务不可用

我有适当的防火墙规则,所以任何IP地址都可以在我的池中的任何实例上联系TCP 443、80,所以这不是问题所在

有人能给我解释一下吗?因为这让我觉得LB正在向这两个实例传递HTTP请求,尽管其中只有一个实例上运行了NGINX pod

Kubernetes(通过Google容器引擎)创建的Google云网络负载均衡器是否向未侦听的主机发送流量

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

因此,healthchecker可以防止请求被丢弃的情况是,如果您有一个节点VM在断开状态下运行。VM仍将具有与转发规则匹配的目标标记,但无法处理传入的数据包

在测试中,我注意到,即使每个VM实例都有一个外部IP地址,我也无法在实例IP地址的端口80或443上与它联系,只有LB IP

这是工作的预期。每个服务都可以使用所需的任何端口,这意味着多个服务可以使用端口80和443。如果数据包到达端口80上的主机IP,则主机无法知道该数据包应该转发到使用端口80的哪个(可能有许多)服务。服务的iptables规则处理发往虚拟内部集群服务IP和外部服务IP但不发往主机IP的数据包

这对于外部用户流量来说并不坏,但是当我尝试为我的LB创建健康检查时,我发现当它单独检查每个VM实例时,它总是认为服务不可用

如果要设置healthcheck以验证节点是否正常工作,可以通过安装防火墙规则对端口
10250
上运行的kubelet进程进行healthcheck:

$ gcloud compute firewall-rules create kubelet-healthchecks \
  --source-ranges 130.211.0.0/22 \
  --target-tags $TAG \
  --allow tcp:10250
(请查看文档,以帮助找到您应该使用的
$TAG

最好是直接对kube代理进程进行健康检查,但只检查它,而对kubelet进程进行健康检查,这样健康检查程序就可以访问它,并且它应该作为一个很好的指示器,表明节点足够健康,可以为您的服务请求提供服务

Kubernetes(通过Google容器引擎)创建的Google云网络负载均衡器是否向未侦听的主机发送流量

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

因此,healthchecker可以防止请求被丢弃的情况是,如果您有一个节点VM在断开状态下运行。VM仍将具有与转发规则匹配的目标标记,但无法处理传入的数据包

在测试中,我注意到,即使每个VM实例都有一个外部IP地址,我也无法在实例IP地址的端口80或443上与它联系,只有LB IP

这是工作的预期。每个服务都可以使用所需的任何端口,这意味着多个服务可以使用端口80和443。如果数据包到达端口80上的主机IP,则主机无法知道该数据包应该转发到使用端口80的哪个(可能有许多)服务。服务的iptables规则处理发往虚拟内部集群服务IP和外部服务IP但不发往主机IP的数据包

这对于外部用户流量来说并不坏,但是当我尝试为我的LB创建健康检查时,我发现当它单独检查每个VM实例时,它总是认为服务不可用

如果要设置healthcheck以验证节点是否正常工作,可以通过安装防火墙规则对端口
10250
上运行的kubelet进程进行healthcheck:

$ gcloud compute firewall-rules create kubelet-healthchecks \
  --source-ranges 130.211.0.0/22 \
  --target-tags $TAG \
  --allow tcp:10250
(请查看文档,以帮助找到您应该使用的
$TAG

最好是直接对kube代理进程进行健康检查,但只检查它,而对kubelet进程进行健康检查,这样健康检查人员就可以访问它,并且它应该