Рейтинг:0

Kubernetes управляет множеством отдельных UDP-серверов в GKE.

флаг au

Я пытаюсь настроить систему, которая может автоматически запускать и отключать серверы видеоигр в виде образов докеров. В таком случае, factoriotools/factorio-докер. Каждая игра представляет собой отдельное отдельное развертывание этого контейнера с одним модулем, и поэтому (в упрощенном случае) ей нужен собственный IP-адрес, который может прослушивать определенный порт UDP. Балансировщики нагрузки избыточны и не имеют значения, а Cloud NAT, по-видимому, не позволяет легко входящий трафик.

Я знаю несколько способов заставить это работать, оба с довольно серьезными компромиссами:

  • Я могу использовать службу NodePort и потерять контроль над тем, к какому порту должен подключаться клиент. Это проблема, потому что сервер регистрируется в списке серверов.
  • Я могу использовать сеть хоста. Если моя информация верна, для этого требуются привилегированные контейнеры, что определенно не очень хорошо.
  • Возможно, я мог бы использовать балансировщик нагрузки UDP, но даже если он существует и работает, это дорого.

Вероятно, есть способы обойти ограничения любого из подходов (во-вторых, оставить хосты недолговечными и поддерживать строгий брандмауэр, и это должно быть в основном нормально?), но я не могу не думать, что есть лучший вариант которые я не могу найти в официальных документах kubernetes. Есть ли у traefik какой-то трюк, о котором я не знаю? Есть ли способ получить вариант MetalLB, который может динамически распределять общедоступные IP-адреса по мере необходимости?

Как заставить каждый сервер-контейнер прослушивать разные общедоступные IP-адреса с определенным UDP-портом, не делая при этом безопасность невозможной?

Редактирует:

  • Порт можно настроить, если я знаю, на каком порту должен работать сервер до запуска модуля.
  • Если я не ошибаюсь в документах сервера, клиент должен иметь возможность подключаться к тому же порту, который прослушивает сервер. Разница, которую k8s рисует между портом прослушивания приложения и портом подключения клиента, в моем случае бесполезна.
  • Адресация этот вопрос , мне не нужен балансировщик нагрузки, потому что он буквально ничего для меня не делает. Изменение IP-адресов не имеет значения, система предназначена для этого. Если сервер отключится на 15 секунд, всем все равно придется переподключаться, и тогда они найдут новый IP-адрес. Сервер не может обрабатывать несколько модулей в одной игре, поэтому никогда не будет более одной реплики.
  • Я только что попробовал NodePort сервис с рандомизированным общедоступным портом (еще не видел, что я могу выбрать внешний порт), и я получил прямые подключения к работе, но не соединения с сервером.Процесс составления списка серверов сначала автоматически определяет, как подключиться к серверу, заставляя сервер отправлять исходящий UDP-трафик на заданную конечную точку. Таким образом, мне нужно не только контролировать, к какому порту подключается входящий трафик, мне также необходимо контролировать, как маршрутизируется исходящий трафик, включая любой NAT, который может использоваться.
Dawid Kruk avatar
флаг cn
Я считаю, что рекомендуемым способом сделать это будет создание «Развертывания» с «Сервисом» типа «LoadBalancer» для каждой игры. Это повлечет за собой расходы соответственно: https://cloud.google.com/vpc/network-pricing.Кроме того, я не уверен, что Traefik способен «маршрутизировать» UDP-пакеты: [источник] (https://doc.traefik.io/traefik/routing/routers/#configuring-udp-routers). В этой настройке у вас есть 2 порта, которые должны быть настроены («порт» (клиент подключается к нему) и «targetPort» (приложение прослушивает)). Можно ли изменить «порт» или он должен быть одинаковым в каждой игре?
xenrelay avatar
флаг au
Эти правки помогают?
Dawid Kruk avatar
флаг cn
да действительно помогают. Я не очень хорошо разбираюсь в Factorio, но полагаю, что вы можете установить «Развертывание» для каждой игры, резервная копия которой будет выполняться с помощью «Сервиса» типа «nodePort» [с определенным портом nodePort] (https:/ /stackoverflow.com/a/60116792/12257134). Принимая во внимание другие ваши замечания (исключая «Сервис» типа «LoadBalancer»), я не могу предложить другое решение, которое сработало бы в этом случае. Пожалуйста, скажите, подходит ли это вам или у вас есть другие проблемы.
xenrelay avatar
флаг au
Мне нужно проверить, работает ли NodePort так, как описано в этой ссылке, но если это так, это очень поможет. Однако ситуация с перенаправлением исходящего трафика на другой порт и ее влияние на список серверов, вероятно, заслуживает нового вопроса.
Рейтинг:1
флаг cn

Публикация этого вики-ответа сообщества, чтобы установить более базовый подход к этому вопросу, а не дать окончательное решение.

Не стесняйтесь редактировать и расширять.


Вы можете открыть свои приложения с помощью Услуги. Есть несколько вариантов, каждый из которых чем-то отличается от другого:

  • IP кластера: Предоставляет Службу на внутреннем IP-адресе кластера. Выбор этого значения делает службу доступной только внутри кластера. Это значение по умолчанию Тип Обслуживания.
  • NodePort: Предоставляет услугу на IP-адресе каждого узла на статическом порту ( NodePort). А IP кластера Служба, к которой NodePort Сервисные маршруты создаются автоматически. Вы сможете связаться с NodePort Сервис из-за пределов кластера, запросив <NodeIP>:<NodePort>.
  • LoadBalancer: предоставляет доступ к Службе извне с помощью балансировщика нагрузки облачного провайдера. NodePort и IP кластера Сервисы, к которым маршрутизирует внешний балансировщик нагрузки, создаются автоматически.
  • ВнешнееИмя: сопоставляет сервис с содержимым externalName поле (напр. foo.bar.example.com), возвращая CNAME запись с его значением. Никакого проксирования не настроено.

-- Kubernetes.io: Документы: Концепции: Сеть сервисов: Сервис: Типы услуг издательских услуг

Документация по предоставлению приложений на Гугл Кубернетес Движок можно найти здесь:


Сосредоточившись конкретно на некоторых пунктах, включенных в вопрос:


Я могу использовать службу NodePort и потерять контроль над тем, к какому порту должен подключаться клиент. Это проблема, потому что сервер регистрируется в списке серверов.

Вы можете указать NodePort порт в Оказание услуг YAML (как порт узла: 32137 или же порт узла: 30911).

Вы можете настроить свое приложение для прослушивания того же порта, что и узелПорт:

  • Приложение прослушивает порт 30000
  • Сервис использует узелПорт с порт:30000 (клиент/пользователь должен подключиться к этому порту) и targetPort:30000. В этом случае изменений порта не будет.

Дополнительное замечание!

По умолчанию узелПорт диапазон портов заблокирован опорная точка Брандмауэр. Вам нужно будет создать правило (или набор правил), которое позволит это сделать.


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

Я бы посоветовал не использовать привилегированные контейнеры, если за этим не стоит веская причина. Ссылаясь на официальную документацию:

Политика Privileged намеренно открыта и не ограничена. Этот тип политики обычно предназначен для рабочих нагрузок на уровне системы и инфраструктуры, управляемых привилегированными доверенными пользователями.

-- Kubernetes.io: Документы: Основные понятия: Безопасность: Стандарт безопасности модуля: Привилегированный


Порт можно настроить, если я знаю, на каком порту должен работать сервер до запуска модуля.

Поскольку у вас будет множество одиночных стручки (каждый с отдельным Развертывание) вы можете параметризовать каждый из них. Я имею в виду, что вы можете создать шаблон и изменять только части ваших манифестов (например, порты, переменные env и т. д.).

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

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

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