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

时间:2019-10-14 04:30:10

标签: undertow google-cloud-run setsockopt gvisor

最近,我的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()
  }

1 个答案:

答案 0 :(得分:1)

我的答案涵盖了“ 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链中的任何人/一无所有。

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

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

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

  

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

请不要调用API setSocketOption()并保持等价。没有方法可以禁用gVisor警告。