最近,我的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()
}
答案 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警告。