Как запретить 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.

Другие вопросы по тегам