如何在Cloud Run中停止来自gVisor的Undertow触发警告

问题描述 投票:0回答:1

最近我的Undertow应用程序正在触发Cloud Run报告以下内容:

Container Sandbox Limitation: Unsupported syscall setsockopt(0x13,0x1,0xa,0x3e05747fe5a0,0x4,0xfc1abc10). Please, refer to https://gvisor.dev/c/linux/amd64/setsockopt for more information.

我已经完成了一次跟踪,似乎启用了带外内联的套接字选项(SO_OOBINLINE)正在由Undertow发送。我已经明确告诉它不要在配置中执行此操作(两种方式),但是它仍在发生。将Undertow与Cloud Run一起使用似乎是一个合理的用例,但没有更多地了解Undertow的带外内联是什么以及gVisor为什么不支持此功能,因此我无法确定哪个程序是不合理的。是Undertow要做其他Web服务器没有做的事情,还是gVisor太不成熟,无法处理此特定的套接字功能?也许gVisor将来会支持它,我只需要等待?

  def main(args: Array[String]): Unit = {
    val server = Undertow.builder
      .addHttpListener("8080", "0.0.0.0")
      .setHandler(defaultHandler)
      .setSocketOption[java.lang.Boolean](XnioOptions.TCP_OOB_INLINE, false)
      .setWorkerOption[java.lang.Boolean](XnioOptions.TCP_OOB_INLINE, false)
      .build
    server.start()
  }
undertow google-cloud-run setsockopt gvisor
1个回答
0
投票

我的答案涵盖了Cloud Run Managed中容器内“监听”的服务。我的答案不包括您的容器通过TCP,gRPC或WebSockets在Cloud Run外部连接的Anthos或自定义应用程序。在您的问题中,您的示例是一个HTTP服务器,它是一个侦听器,而不是客户端。

这不是gVisor问题。第一步是了解SO_OOBINLINE的功能。

如果启用此选项,则带外数据将包含在接收数据流中。否则,必须在recv()调用期间使用标志MSG_OOB来获取带外数据。

现在,谁将向您发送带外(msg)数据? Google Cloud Run Managed的前端是Google Frontend(GFE)。这是Google针对Cloud Run Managed(以及许多其他Google服务)的代理和负载平衡器。 GFE的接口是HTTP / HTTPS。客户端/浏览器无法生成带外数据。客户端连接到GFE。 GFE连接到您在Cloud Run中运行的服务。

如果gVisor支持SO_OOBINLINE,谁可以发送带外数据? TCP / IP链中没有人/您无法控制/管理。

存在Internet草案Out-Of-Band' Content Coding for HTTP。我只是一直关注这份文件。将来可能会在HTTP中支持此功能,但今天可能不会。

在您的问题中,您将SO_OOBINLINE设置为false。这是默认情况(false),因此不需要将其设置为false。

注:使用OOB的理由很多,但很少。 OOB只是数据的一个字节。在HTTP世界中,如果出现问题,则标准期望是用于指示问题或重试情况的状态码。

如何在Cloud Run中停止来自gVisor的Undertow触发警告

不要调用API setSocketOption()和等价的。没有方法可以禁用gVisor警告。

© www.soinside.com 2019 - 2024. All rights reserved.