Как запретить Undertow запускать предупреждения от gVisor в Cloud Run
Недавно мое приложение 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, и кажется, что опция сокета для включения внеполосного встраивания (SO_OOBINLINE) отправляется Undertow. Я прямо сказал ему не делать этого в конфигурации (двумя способами), но это все еще происходит. Использование Undertow с Cloud Run кажется разумным вариантом использования, но без более глубокого понимания того, что такое внеполосное встраивание для Undertow и почему gVisor не поддерживает это, я заблокирован на том, какая программа является нецелесообразной. Это Undertow для того, чтобы делать что-то, чего не делают другие веб-серверы, или 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 ответ
Мой ответ касается сервисов "прослушивания" в контейнере в Cloud Run Managed. Мой ответ не включает Anthos или пользовательские приложения, в которых ваш контейнер подключается за пределами Cloud Run через TCP, gRPC или WebSockets. В вашем вопросе ваш пример - это HTTP-сервер, который является слушателем, а не клиентом.
Это не проблема gVisor. Первый шаг - понять, что делает SO_OOBINLINE.
Если этот параметр включен, данные вне канала включаются в поток получаемых данных. В противном случае вы должны использовать флаг MSG_OOB во время вызова recv() для получения данных вне диапазона.
Итак, кто будет отправлять вам внеполосные (msg) данные? Интерфейс Google Cloud Run Managed - это интерфейс Google (GFE). Это прокси-сервер Google и балансировщик нагрузки для Cloud Run Managed (и многих других сервисов Google). Интерфейс GFE - HTTP/HTTPS. Клиент / браузер не может генерировать данные вне канала. Клиент подключается к GFE. GFE подключается к вашей службе, работающей в Cloud Run.
Если gVisor будет поддерживать SO_OOBINLINE, кто сможет отправлять данные по внеполосному каналу? Никто / ничто в цепочке TCP/IP, которым вы можете управлять / управлять.
Существует проект внеполосного кодирования содержимого Интернета для HTTP. Я только слежу за этим документом. В будущем для HTTP может появиться поддержка, но не сегодня.
В вашем вопросе вы устанавливаете SO_OOBINLINE на false. Это случай по умолчанию (false), поэтому устанавливать для него значение false не требуется.
Примечание. Есть несколько веских причин использовать OOB, но они встречаются редко. OOB - это только один байт данных. В мире HTTP, если что-то пойдет не так, стандартным ожиданием является код состояния, указывающий на проблему или ситуацию повторной попытки.
Как запретить Undertow запускать предупреждения от gVisor в Cloud Run
Не вызывайте API setSocketOption()
и равноценный. Нет способа отключить предупреждения gVisor.