Google容器引擎中的HTTPS负载均衡器

32

我正在尝试使用HTTPS L7负载均衡器为GKE设置HTTPS负载均衡器,但出现了某些问题。即使在HTTP负载均衡演练中的HTTP负载均衡器也是如此。转发规则的IP地址已创建,我能够ping和telnet到80端口。但是当通过curl请求时,它会给我一个错误。

<title>502 Server Error</title> </head> <body text=#000000 
bgcolor=#ffffff> <h1>Error: Server Error</h1> <h2>The server 
encountered a temporary error and could not complete your request. 
<p>Please try again in 30 seconds.</h2> <h2></h2> </body></html>

所有步骤都很顺利,我创建了一个没有${NODE_PORT}标签的防火墙,但它无法工作。

有人遇到过这个问题吗?

8个回答

29

我的应用程序也遇到了同样的问题,原因是我们没有一个返回“Success”的终端节点,而健康检查一直失败。

HTTP/HTTPS负载均衡器似乎只有在健康检查通过时才会将请求发送给群集节点,因此我的解决方案是创建一个总是返回200 OK的终端节点,并且一旦健康检查通过,负载均衡器就开始工作了。


我遇到了同样的问题。这是否意味着我需要在每个返回200的节点上创建一个空容器? - Paweł Szczur
我认为你可以在现有容器中添加一个路由,返回200,但如果你不想对现有的容器进行这些更改,那么是的。 - andresk
有人可以解释一下如何做到这一点吗? - Wasif Khalil
如果我已经有了这个端点,并且我的实例在负载平衡页面上显示为健康,您有什么建议? - Nigini
为什么要这样做?健康检查是有原因的,负载均衡器使用它们来确定您的后端是否可以接受流量。通过始终发送“虚假”的200,您正在愚弄负载均衡器,使其认为您的集群节点始终处于健康状态,即使它们可能不是。这归结为当它们处于不健康状态(资源不足、其他问题等)时,您的客户端会收到错误。理想情况下,健康检查URL是特定于应用程序的,并且应指示节点是否“健康”-这再次是您必须在应用程序上下文中确定的内容。 - talonx

11

我刚刚完成了这个示例,并且在打开 $NODE_PORT 防火墙之前看到了相同的 502 错误。

如果您在云控制台中查看

https://console.developers.google.com/project/<project>/loadbalancing/http/backendServices/details/web-map-backend-service

你应该看到后端显示健康的节点数为${num_nodes_in_cluster}中的0个。

对于你的防火墙定义,请确保将源过滤器设置为130.211.0.0/22,以允许来自负载均衡服务的流量并将允许的协议和端口设置为tcp:$NODE_PORT


2
嗯...显然谷歌在Kubernetes的HTTP代理文档中忘记了这个:https://cloud.google.com/container-engine/docs/tutorials/http-balancer - Petrov
真希望在花费了一小时试图弄清楚发生了什么之前就读过这个。 - psychok7

5
我使用GKE,刚刚按照示例(链接) 做得很好,但是当我路由到自己的服务时,它就不能正常工作了。(我的服务是rest api服务)
我发现我自己的服务和示例之间最大的区别在于:示例有一个根端点“/”,但我不支持它。
所以,我通过这种方式解决了这个问题:将一个根端点“/”添加到我的服务中,并返回成功(返回空的端点),然后重新创建入口,并等待几分钟,然后入口就可以工作了!
我认为这个问题应该是由“健康检查器” UNHEALTHY instances do not receive new connections 引起的。
以下是有关健康检查的链接:https://cloud.google.com/compute/docs/load-balancing/health-checks

做了同样的事情,效果很好---感谢提示。我知道安装nginx或任何其他web服务器可以解决问题-但这违反了本意,因为我有意避免使用任何web服务器以保持轻量级。 - rahul

2
在我的情况下,问题在几分钟内(大约5-10分钟)得到了解决。
如果使用Ingress,可能会出现与Ingress相关的事件的其他信息。要查看这些信息:
kubectl describe ingress example

1
我最近遇到了这个问题,不过它自己解决了。但是,偶尔几分钟的停机时间是不能接受的。 - speedplane
当您使用L7 LB时,会发生很多事情。如果您正在重新配置与L7 LB相关联的GKE入口,则速度特别慢。有时我不得不等待3到5分钟才能使一切恢复正常。如果一切看起来都正确,请先等待几分钟。试图修复实际上没有问题的东西会让人感到困惑,我认为这就是这个答案的重点。 - Phil

1
如果您在负载均衡器后面使用nginx,则默认服务器返回200或其他2 **非常重要。这意味着,例如,如果您有一个返回301的重写规则,则会失败。
解决方案是在主服务器上设置default_server:
server {
    # Rewrite calls to www
    listen 443;
    server_name example.com;

    return 301 https://www.example.com$request_uri;
}


server {
    listen                  443 default_server;
    server_name             www.example.com;
    ...

1

为了解决这个问题,我需要为 tcp:$NODEPORTIP 添加一个防火墙规则,源地址为 130.211.0.0/22(GCP上负载均衡器的范围)。


谢谢您!看起来如果您在Google Cloud中启用了防火墙,您必须将负载均衡器IP范围添加到防火墙中。 - Matt Browne

1
在我的情况下,负载均衡器返回了这个错误,因为我的实例和实例组上没有运行Web服务器来处理网络请求。
我在所有机器上安装了nginx,然后它开始工作了。
从现在开始,在创建虚拟机/实例时,我会在启动脚本中添加nginx。

0
我创建了一个端点,用于处理所有包含“GoogleHC”用户代理的请求。

因此,

server{
    server_name example.com www.example.com

    if ($http_user_agent ~* 'GoogleHC.*') {
        return 200 'isaac newton';
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接