如何阻止Undertow在Cloud Run中触发gVisor警告

3

最近我的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.

我已经对它进行了strace,看起来Undertow正在发送启用带外内联(SO_OOBINLINE)的套接字选项。 我已经在配置中明确告诉它不要这样做(两种方法),但仍然发生了。 在Cloud Run中使用Undertow似乎是一个合理的用例,但如果没有更多关于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?我在使用“2.0.28.Final”时在Cloud Run中也看到了同样的错误。然而,我没有在“Undertow.java”中找到任何设置TCP_OOB_INLINE的地方。 - user482594
1个回答

2
我的回答涵盖了在Cloud Run Managed中容器内的“监听”服务。我的回答不包括Anthos或自定义应用程序,其中您的容器通过TCP、gRPC或WebSockets连接到Cloud Run之外。在您的问题中,您的示例是一个HTTP服务器,它是一个监听器而不是客户端。
这不是gVisor的问题。第一步是了解SO_OOBINLINE的作用。
如果启用此选项,则带外数据将包含在接收数据流中。否则,在recv()调用期间必须使用标志MSG_OOB来获取带外数据。
现在,谁会向您发送带外(msg)数据?Google Cloud Run Managed的前端是Google Frontend(GFE)。这是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世界中,如果出现问题,标准期望是状态代码以指示问题或重试情况。

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

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


我认为你最后一行说得很对。我认为Undertow无论默认值如何都将其设置为false,这是一个不必要的setsockopt调用。 - mgenereu
@mgenereu 子类化并自己处理 setSocketOption,使其成为无操作。 - John Hanley
代码中有几个地方都用到了它,加上线程事件的顺序以及HTTP 100 Continue代码的组合,让我决定直接开一个工单。我会看看在StackDriver获取日志之前是否有过滤syslog的选项。 - mgenereu

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