GCP HTTP / S负载平衡器中的会话持久性不能按预期方式工作

我已经和其他负载平衡器一起工作了很多年,所以我期望GCP负载平衡器在使用会话持久性设置时以与其他人相同的方式工作。

不幸的是, 为GCP LB中的后端启用会话持久性似乎并不是将某个客户端的所有请求发送到单个后端服务器(既不使用Cookie或IP会话持久性选项)

这是一个已知的错误/行为或我自己可以解决的事情吗?


我做了这个快速testing:

  • 我创build了一个新的HTTP LB,并为其分配了一个新的外部IP。
  • 我已经将后端服务指向具有2个实例的实例组。
  • 由于我的后端服务器运行的是Apache和mod_php,我创build了一个简单的PHP脚本(称为get_up.php)来显示服务器的IP地址(请参阅下面的代码)
  • 最后,我在一个循环中运行了一个快速的curl脚本,指向$ LBIP / get_ip.php来看看会发生什么。

如果我这样做,比方说,在Rackspace中,我总是获得与结果相同的IP,但在GCP中,我发现我可以随机访问我的两个后端服务器中的任何一个。

这是我的PHPtesting脚本:

<?php $realIP = file_get_contents("http://ipecho.net/plain"); echo "My Ip is " . $realIP; echo "\n"; ?> 

这是我的testing运行:

 ➜ ~ while true; do curl -b cookie.txt -c cookie.txt $IP/get_ip.php; sleep 1 ; done My Ip is 35.193.16.20 My Ip is 35.193.16.20 My Ip is 35.193.16.20 My Ip is 35.193.16.20 My Ip is 104.197.18.77 My Ip is 104.197.18.77 My Ip is 104.197.18.77 My Ip is 35.193.16.20 My Ip is 104.197.18.77 My Ip is 35.193.16.20 My Ip is 35.193.16.20 My Ip is 104.197.138.72 

  • Edit – Curl命令根据BillThor注释发送cookie。 相同的结果。

放弃..它看起来像会话持久性和会话亲和力不是一回事。 虽然会话持久性确保每个来自某个客户端的后续请求每次都会发送到相同的后端,但会话亲缘关系只是告诉您它将“主要”发生,但不保证它。

如果您使用cookie进行持久化,则需要提供一个供卷发使用的cookie jar。 否则,每个请求看起来像来自新用户。 试试像这样的命令:

 while true; do -b cookie.txt -c cookie.txt curl $IP/get_ip.php; sleep 1 ; done