Рейтинг:0

Маршрутизация входящего и исходящего udp-трафика на один и тот же порт в kubernetes

флаг au

Это продолжение предыдущий вопрос я задал, но с другим вопросом/подходом. В случае, если это имеет значение, я использую GKE, но я надеюсь, что есть ответ, не зависящий от облака.

Я пытаюсь запустить контейнер факториоинструменты / факторио, но у приложения есть некоторые особые требования из-за использования функции списка общедоступных серверов для конкретного приложения, как это видно во многих видеоиграх, в которых используются серверы, размещенные пользователями.

До сих пор мне удавалось наладить работу с хост-сетями и прямыми соединениями для работы со службой NodePort.Однако функция листинга общедоступных серверов приложения остается проблемой для непривилегированных контейнеров.

Вот как Factorio выясняет, как управлять списком общедоступных серверов:

  • Контейнер прослушивает один сокет, скажем, UDP-порт 34197.
  • Служба NodePort публично направляет этот трафик на 20635.
  • Контейнер отправляет эхо-запрос через свой порт прослушивания (34197) на пинг-понг-сервер, а пинг-понг-сервер отвечает IP-адресом и портом, с которого он получил пинг-понг. Вне k8s это будет порт 34197.
  • Затем контейнер использует эту информацию для регистрации в списке серверов. IP-адрес, порт, имя сервера и некоторая другая информация.
  • В GKE пинг-понг направляется на произвольный неиспользуемый порт (скажем, 40792).
  • Контейнер считает, что он прослушивает порт, отличный от того, который я установил (20534), а затем регистрируется в списке общедоступных серверов, используя неправильный порт (40792, потому что так сказал сервер пинг-понга).
  • Любая попытка подключения из списка общедоступных серверов завершается неудачно; клиент считает, что сервер прослушивает порт, свидетелем которого является пинг-понг-сервер (40792), но контейнер все время взаимодействовал со своим прослушивающим портом (34197).

(Мне сказали, что этот процесс является разновидностью работы ICE/STUN)

Это означает, что если контейнер прослушивает 34197, но Kubernetes направляет его на 20635 извне, то и входящий, и исходящий трафик должны проходить через 20635 на общедоступной стороне, чтобы встроенная в приложение функция листинга серверов работала.

Если я обойду список общедоступных серверов и подключусь напрямую к общедоступному IP-адресу узла контейнера с портом 20635, он будет работать безупречно. Но это довольно серьезный компромисс для того, чем я занимаюсь.

Сеть хоста обходит всю эту проблему, позволяя контейнеру напрямую открывать любой порт, который он хочет, на хосте.Для хостов, которые уже общедоступны, это означает, что ничто на хосте (особенно не k8s) не может перенаправить трафик контейнера через дополнительные уровни и изменить номера портов. Таким образом, когда контейнер открывает порт 34197, он получает порт 34197. Когда он отправляет на порт 34197, этот трафик отправляется на порт 34197. Сервер пинг-понга видит порт, который он должен видеть. И поскольку это общедоступный порт UDP, не имеет значения, кто первым отправил трафик; трафик это трафик, порт это порт.

Однако, если я правильно понимаю документы, для запуска контейнера в сетевом стеке хоста требуется привилегированный контейнер, который фактически является корневым доступом на хосте, что очень плохо в производстве. Таким образом, для непривилегированных контейнеров должно быть решение, отличное от сети хоста. Я не могу найти это «другое решение». Я нигде не могу найти документацию о том, как это сделать, или даже доказательства того, что кто-то думает об этом. Как мне заставить это работать?

Anant Swaraj avatar
флаг cn
В общей сети не рекомендуется размещать входящий и исходящий трафик на одном и том же порту. Существует динамическое распределение портов на источнике при инициации соединения, которое используется для отслеживания соединения и его состояния. Как вы упомянули, «листинг общедоступных серверов остается проблемой для непривилегированных контейнеров» что это значит? Список общедоступных серверов означает список DNS? Работает ли он для привилегированного контейнера? Можно подробнее про настройку?
xenrelay avatar
флаг au
Вопрос отредактирован, надеюсь поможет. Более подробная информация, которую я не уверен, должна быть в вопросе: DNS не имеет отношения. Список общедоступных серверов, о котором я говорю, ближе к базе данных с пользовательским интерфейсом. Некоторые централизованные серверы принимают регистрации от реальных игровых серверов, и фактические игровые серверы должны поддерживать соединение открытым. Затем централизованный сервер облегчает соединения клиента с реальными игровыми серверами. Все это делается с помощью пользовательского кода, специфичного для Factorio. Важное примечание: Factorio не предназначен для контейнеризации.
James Rhoat avatar
флаг cn
Вы когда-нибудь получали хорошее решение для этого? В настоящее время я пытаюсь решить эту проблему для своей диаграммы руля.
xenrelay avatar
флаг au
Не совсем. Без части аутентификации сервера я был вынужден отложить всю эту настройку. Я также не помню большую часть экспериментов, которые я проводил. Я помню, что, насколько я мог судить, магия агонов делала свое дело.Жаль только, что я не могу позволить себе балансировщики нагрузки, которые он использует. Похоже, что в наши дни traefik поддерживает маршрутизацию udp, чего могло не быть 6 месяцев назад, так что я бы проверил это, если бы работал над этим сейчас.
Рейтинг:0
флаг us
  • Я бы посоветовал вам использовать GCP Игровой Сервер особенность. Это выделенный игровой сервер, который облегчит управление вашим глобальную инфраструктуру игровых серверов, чтобы вы могли сосредоточиться на создании игры быстрее, без увеличения сложности или ущерба для спектакль.

  • Он обеспечивает управление кластерами игровых серверов с помощью Kubernetes для оркестровка контейнеров и Агонес для парка игровых серверов оркестровка и управление жизненным циклом. Агонес является открытым исходным кодом проект хостинга и масштабирования выделенного игрового сервера, построенный поверх Kubernetes с гибкостью, необходимой для адаптации к потребностям ваша многопользовательская игра.

  • При создании игрового сервера с помощью Agones вы должны добавить некоторые правила брандмауэра для открытия портов UDP, необходимых для подключения к кластер.

  • Для создания игрового сервера с помощью Agones можно пройти Быстрый старт который поможет вам создать GameServer в Kubernetes, используя Пользовательский ресурс Agones.

  • Чтобы получить статус GameServer, используйте приведенную ниже команду. Это обеспечит вам с различными событиями жизненного цикла GameServer.

                посмотрите, как kubectl описывает игровой сервер
    
  • Чтобы настроить GameServer в GCP с помощью Agones, вы можете проверить официальный Google документ.

xenrelay avatar
флаг au
Интересный и рабочий. Не моя игра, не мой исходный код, но тот факт, что у них есть подход к интеграции на основе sidecar, — это хорошо. Было бы неплохо, если бы я мог сделать что-то более простое (сервисная сетка, сетевые ACL, ....), но если я не услышу никаких других идей, я попробую.
xenrelay avatar
флаг au
На самом деле я не использую это прямо сейчас, потому что были некоторые проблемы с подключением и работой в более широкой системе, но я также полностью пропускаю эту проблему на данный момент, так как есть другие проблемы, препятствующие работе списка общедоступных серверов. Я, наверное, когда-нибудь вернусь к этому.
xenrelay avatar
флаг au
Неприемлемо, потому что под прикрытием Agones использует 3 балансировщика нагрузки, что неприемлемо дорого для моих масштабов.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.