kubernetes GKE:GET请求的非常大的URI不能命中nginx-ingress(没有日志)

hgc7kmma  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(1)|浏览(115)

对于报告,我的应用程序通过URI传输数据,在某些情况下,它会使URI非常长(GET请求)(例如:~15.000个字符编码)。
在这种情况下,我使用差异代理测试如下:

  • (1)在GKE中使用nginx-ingress:客户端没有收到来自web服务器的响应,在nginx-ingress中也没有找到日志(添加了注解:nginx.ingress.kubernetes.io/large-client-header-buffers: "4 16k"nginx.ingress.kubernetes.io/client-body-buffer-size: "5m"
  • (2)在VM上运行nginx:OK(在配置中添加:large_client_header_buffers 4 16k;

因为在nginx-ingress服务中没有日志信息,我认为连接可能在到达nginx-ingress之前被Google防火墙或其他东西丢弃。
在这种情况下,我如何进行调试以找到问题?GKE中是否有关于URL长度的文档?

dvtswwa3

dvtswwa31#

您正在使用15000个字符,由于此GET请求无法命中日志,因此字符数非常大。根据Google Cloud官方文档,
URL有**实际长度限制,通常在2k到8 k之间。**某些浏览器和代理服务器强制执行。如果您的API使用URL超过长度限制的GET请求,则此类请求可能会被浏览器拒绝。为了绕过限制,客户端代码应该使用一个POST请求,其Content-Type为application/x-www-form-urlencoded沿着HTTP头X-HTTP-Method-Override:GET。这种方法也适用于DELETE请求。

  • 因此,通过使用POST请求而不是GET,通常POST将获得更高的值。它允许您将数据发送到请求体而不是URI。有关详细信息,请参阅doc
  • 或者尝试在Ingress控制器yaml中添加下面的片段,并检查这是解决方案之一:
nginx.ingress.kubernetes.io/server-snippet: |
  http2_max_header_size 256k;
  http2_max_field_size 256k;

字符串

  • 当前存在用于增加此长度的现有feature request;这种情况将在不久的将来改变。您可以对问题进行“星星化”以获得进一步的更新和/或在评论中提供您的用例。

相关问题