Пришло время повеселиться. Конечно, скажите своим коллегам или своей семье, что вы проводите исследования, экспериментируя с некоторыми новыми технологиями — потому что это то, что мы будем делать, но просто не позволяйте им видеть, как вы играете в Minecraft!
Вот сценарий: вы организуете класс Minecraft на целый день для местных студентов STEM. Вам необходимо запустить свои собственные серверы Minecraft, чтобы обеспечить многопользовательскую среду для детей, ограниченную только вашими учениками. Одному серверу не будет достаточно, поэтому вы запустите два сервера одновременно, ожидая, что ваш балансировщик нагрузки обрабатывает отправку студентов на сервер A или сервер B, в зависимости от нагрузки.
В этой статье мы собираемся исследовать пересылку портов и балансировку нагрузки с КОНГ ГАРА . Мы собираемся сделать это, раскрутив несколько серверов Minecraft, а затем поместив Kong Gateway перед этими восходящими услугами для обработки перенаправления портов и балансировки нагрузки.
Прежде чем мы погрузимся, давайте кратко рассмотрим несколько важных технологических концепций.
Ключевые понятия
Перенаправление порта
Переадресация порта получает сетевые запросы на определенный порт машины и пересылает эти запросы в другой порт. Маршрутизатор, брандмауэр или API Gateway Обычно справляется с этой задачей. Например, у вас может быть прослушивание веб -сервера на порте 3000 и сервер базы данных, прослушивающий порт 5000. Ваш шлюз API будет прослушать запросы из -за пределов вашей сети. Запросы, адресованные порту 80, будут пересылать шлюз на ваш веб -сервер на порту 3000. Между тем, запросы, адресованные порту 5432, будут перенаправлены на ваш сервер базы данных на порту 5000.
Балансировки нагрузки
Балансировка нагрузки — это задача распределения нескольких запросов на сервер сбалансированным образом по многочисленным копиям этого сервера. Обычный кусок аппаратного обеспечения или программного обеспечения называется балансировщиком нагрузки, как правило, обрабатывает это. Внешний мир не знает, что существует несколько копий работы сервера. Они считают, что делают запросы на один сервер. Балансировщик нагрузки, однако, распределяет загрузку запроса, чтобы предотвратить перегрузку какого -либо одного сервера. В случае реплики, которая полностью выходит из строя, балансировщик нагрузки гарантирует, что запросы переходят только на здоровые узлы.
КОНГ ГАРА
Kong Gateway — это тонкий слой API Gateway, который находится перед службами вверх по течению, способным выполнять эти задачи пересылки портов и балансировку нагрузки. Независимо от того, являются ли эти восходящие сервисы веб-серверы или базами данных или даже игровые серверы Minecraft, Kong является приветствием передней дверей для всех запросов. В дополнение к управлению движением, Kong Gateway может управлять Аутентификация , Запрос преобразования, аналитику и ведение журнала.
Поддержка потока TCP
Одним из аспектов нашего проекта Minecraft, который отличает его от развертывания типичного веб -сервера или базы данных, является то, что Minecraft требует установленного соединения между клиентом Minecraft (геймер) и сервером. Вместо того, чтобы ожидать HTTP -запросов без состояния, нам нужно обрабатывать соединения TCP с потоковыми данными. К счастью, Kong Gateway полностью поддерживает потоковую передачу TCP Анкет
Наш проектный подход
Мы собираемся пройти через этот проект пошаговым:
- Разверните один локальный сервер Minecraft без какого -либо пересылки портов.
- Расскажите сервер Minecraft на порте без декорации, настраивая Kong Gateway на запросы первого порта на этот сервер.
- Расскажите два сервера Minecraft на разных портах, настраивая Kong Gateway для загрузки баланса и запросов на подключение к порту.
Как вы можете видеть, мы начнем просто, и мы постепенно опираемся на сложность.
Что вам понадобится для начала
Вы не на самом деле Нужно много знакомства с Minecraft, чтобы пройти через этот мини-проект. Поскольку в контейнерах Docker можно проще всего раскрыть серверы Minecraft, базовое знакомство с Docker может быть полезным.
Вам нужно будет Установите Docker Engine на вашей местной машине. Наконец, если вы хотите проверить, что результаты нашего проекта успешны, вам нужно Установите клиент Minecraft Game и войти в систему как оплачиваемый владелец игры. Бесплатная пробная версия Minecraft не позволяет подключаться к многопользовательским серверам, что мы и будем работать для нашего проекта.
Вы готовы сделать это? Вот так!
На этом первом шаге мы хотим развернуть один сервер Minecraft на нашей локальной машине. Мы будем использовать порт по умолчанию для сервера, а затем подключим наш игровой клиент к серверу. Проще говоря, развернуть сервер Minecraft в качестве контейнера Docker, с изображением Docker найдено Здесь Анкет
В окне терминала мы запустим эту команду, чтобы вытащить изображение сервера и развернуть его в контейнере:
~$ docker run -p 25000:25565 -e EULA=true itzg/minecraft-server Unable to find image 'itzg/minecraft-server:latest' locally latest: Pulling from itzg/minecraft-server ... Status: Downloaded newer image for itzg/minecraft-server:latest ... [init] Checking for JSON files. [init] Setting initial memory to 1G and max to 1G [init] Starting the Minecraft server... ... [Server thread/INFO]: Preparing start region for dimension minecraft:overworld [Worker-Main-5/INFO]: Preparing spawn area: 1% ... ...
Когда наш контейнер запускается, он загружает изображение Docker для сервера Minecraft. Как только изображение загружается, он запускает сервер, и мы видим сообщения журнала запуска сервера. Вот объяснение флагов и опций, которые мы предоставили Docker Run в нашей команде:
-
-p
Определяет порт на хосте (ваш локальный компьютер), что Docker должен привязать к порту на контейнере. В этом случае порт 25000 нашей локальной машины будет указывать на порт контейнера 25565. По умолчанию серверы Minecraft работают на порту 25565. Как правило, вы всегда будете связываться с портом контейнера 25565, независимо от порта на хосте, который вы решите использовать. -
-e
Предоставляет переменную среды, которую должен использовать контейнер Docker при запуске сервера в контейнере. Приложение Minecraft Server требует, чтобы вы приняли Eula после запуска. Предоставление этой переменной среды — это способ сделать это. - Наконец, мы указываем имя изображения Docker (на dockerhub ), которое содержит сервер Minecraft.
С запуском нашего сервера, давайте посмотрим, сможем ли мы подключиться к серверу по адресу Localhost: 25000. Откройте клиент Minecraft Launcher и нажмите «Play».
Фактическая игра Minecraft должна запустить. Для вариантов игры нажмите «Многопользовательский».
Следующий , нажмите «Прямое соединение».
Для адреса сервера введите Localhost: 25000. Наш локальный порт 25000, конечно же, связан с контейнером, работающим на нашем сервере Minecraft. Наконец, мы нажимаем на «Сервер присоединения».
И … мы в!
Если вы оглянетесь на терминал с Docker Run
Команда, вы помните, что он продолжает выводить сообщения журнала с сервера Minecraft. Это может выглядеть примерно так:
... [User Authenticator #1/INFO]: UUID of player familycodingfun is 8b4fb92b-24c6-423a-bf32-fea282fc8a25 [Server thread/INFO]: familycodingfun[/172.17.0.1:53248] logged in with entity id 282 at (243.5, 65.0, -138.5) [Server thread/INFO]: familycodingfun joined the game
Сервер отмечает, что новый игрок (мое имя пользователя FamilyCodingFun
) присоединился к игре. Наша установка Single Game Server завершена. Теперь давайте добавим Kong Gateway и пересылку порта в микс. На данный момент мы выйдем из игры, а затем уберем наш контейнер Docker с сервером.
Затем мы поместим Kong Gateway перед нашим сервером Minecraft и воспользуемся перенаправлением портов. Если вы запускали частную сеть, вы могли бы запретить запросы из -за пределов сети для достижения вашего порта сервера Minecraft. В то же время вы можете разоблачить один порт, на котором слушает Конг. Конг, как шлюз API, прослушивает запросы на этом порту, а затем пересылал эти запросы на ваш сервер Minecraft. Это гарантирует, что любые запросы, которые хотят перейти на сервер Minecraft, должны сначала пройти через Конг.
Хотя мы будем работать в Localhost, мы настроем этот вид пересылки портов через Конг. Как и на нашем предыдущем шаге, мы хотим, чтобы наш сервер Minecraft работал на порту 25000. Тем временем Конг будет послушать в порту 20000. Kong возьмет запросы на подключение TCP на порту 20000 и перенаправляет их на сервер Minecraft на порту 25000.
Установить и настроить Kong
Первый шаг — Установить Kong Gateway Анкет Шаги установки варьируйтесь в зависимости от вашей уникальной настройки. После установки Kong нам нужно настроить начальный файл конфигурации. В вашем /etc/kong
Папка, вы увидите файл шаблона с именем kong.conf.default
. Мы скопируем этот файл и переименованы как kong.conf
, который является файлом, на который Kong будет искать для своей конфигурации стартапа:
~$ cd /etc/kong /etc/kong$ sudo cp kong.conf.default kong.conf /etc/kong$ tree . ├── kong.conf ├── kong.conf.default └── kong.logrotate 0 directories, 3 files
В kong.conf
, нам нужно сделать следующие три изменения:
# PATH: /etc/kong/kong.conf # # Around line 368. Uncomment and set for TCP listening on port 20000 # stream_listen = 127.0.0.1:20000 # # Around line 922. Uncomment and set database to off # database = off # # Around line 1106. Uncomment and set to a file we're about to create. # Use the absolute path to a project folder # declarative_config = /PATH/TO/MY/project/minecraft-kong.yml
Конфигурация Stream_listen сообщает Kong прослушивать потоковое трафик TCP. Мы говорим Kong послушать в порту 20000 для этого. Для потребностей этого мини -проекта мы можем настроить Kong, используя его DB без декларативной конфигурации стиль. Kong не нужно будет использовать базу данных), и все наши конфигурации для пересылки портов и балансировки нагрузки будут сохранены в одном файле YAML. Это declarative_config
Путь файла, который мы установили выше.
Напишите декларативный файл конфигурации
Прежде чем мы запустим Конг, нам нужно написать это Minecraft-Kong.yml
Файл с нашей конфигурацией пересылки порта. В папке проекта (которая соответствует указанному выше пути), откройте новый файл с именем Minecraft-Kong.yml
:
# PATH: ~/project/minecraft-kong.yml _format_version: "2.1" services: - name: Minecraft-Server-A url: tcp://localhost:25000 routes: - name: Server-A-TCP-Routes protocols: ["tcp", "tls"] destinations: - ip: 127.0.0.1 port: 20000
В этом файле мы объявляем новый Обслуживание сущности назван Minecraft-Server-A. Сервер использует протокол TCP, прослушивая порт 25000 Localhost, поэтому мы собираем эти значения вместе в качестве URL -адреса службы. Далее мы определяем Маршрут Для Сервиса, которая связывает наш сервис с помощью URL -пути или входящего места для подключения, которое будет прослушать Конг. Мы предоставляем имя для нашего маршрута, сказав Kong прослушать запросы, используя TCP/TLS в пункте назначения, который мы указали в нашем файле Kong.conf: IP 127.0.0.1 и Port 20000.
Запустите Minecraft Server и Kong
Мы написали всю нашу конфигурацию для этого шага. Давайте запустим наш сервер Minecraft в Docker. Помните, что мы хотим, чтобы наш хост (наша локальная машина) готовился на порту 25000, привязывая этот порт к стандартному порту сервера Minecraft 25565 в контейнере:
~/project$ docker run -p 25000:25565 -e EULA=true itzg/minecraft-server
Эта команда может занять немного времени, чтобы запустить, когда сервер запускается. Теперь, в отдельном окне терминала, мы запустим Kong:
~/project$ sudo kong start
Благодаря запуску нашего сервера мы возвращаемся к нашему игровому клиенту и, как и выше, выбираем «Multiplayer» и стараемся установить «прямое соединение» с игровым сервером. Мы знаем, что мы могли бы подключиться непосредственно к Localhost: 25000, так как это фактический порт хоста, связанный с портом контейнера; Скорее, мы хотим протестировать пересылку порта Конга. Мы хотим подключиться к предполагаемому игровому серверу на Localhost: 20000, притворяясь, что мы случайный пользователь, который не знает, что порт 20000 указывает на шлюз для пересылки порта.
Нажмите «Сервер присоединения». Как и шаг 1, ваша связь должна быть успешной, и вы вошли в мир Minecraft. Наш запрос на соединение TCP в Localhost: 20000 год отправился в Kong Gateway, который затем отправил этот запрос на порт 25000, наш фактический сервер Minecraft. У нас есть порты, работающие и запущены!
Мы развернем два сервера Minecraft для последнего шага в нашем мини-проекте, прослушивая порты 25000 и 26000. Ранее, когда у нас был только один сервер Minecraft, Kong, естественно, пересылал запросы TCP на порте 20000 в этот порт единственного сервера Minecraft. Теперь, с двумя портами Minecraft Server на выбор, нам нужно использовать переадресацию портов и балансировку нагрузки. Kong Gateway примет запросы на соединение TCP, которые поступают в порт 20000 и равномерно распределять соединения между сервером Minecraft A и Minecraft Server B.
Запустить серверы Minecraft
Если вы еще этого не сделали, завершите один сервер Minecraft, который работал на предыдущем шаге. Мы снова начнем все с чистого состояния, раскрутив каждый сервер в своем собственном окне терминала. В вашем первом окне терминала запустите контейнер Docker для сервера A, привязав порт 25000 хоста с портом контейнера 25565:
~/project$ docker run -p 25000:25565 -e EULA=true itzg/minecraft-server
Затем, в отдельном окне терминала, мы запустим сервер B, на этот раз свяжу порт 26000 хоста с портом контейнера 25565:
~/project$ docker run -p 26000:25565 -e EULA=true itzg/minecraft-server
Теперь у нас есть серверы A и B, доступные в портах 25000 и 26000 соответственно.
Редактировать файл декларативной конфигурации
Далее мы хотим отредактировать наш файл декларативной конфигурации (minecraft-kong.yml), настройку Kong для балансировки нагрузки. Отредактируйте свой файл, чтобы отразить следующее:
# PATH: ~/project/minecraft-kong.yml _format_version: "2.1" upstreams: - name: Minecraft-Servers targets: - target: localhost:25000 weight: 100 - target: localhost:26000 weight: 100 services: - name: Load-Balancing-Service host: Minecraft-Servers protocol: tcp routes: - name: Load-Balancing-Route protocols: ["tcp", "tls"] destinations: - ip: 127.0.0.1 port: 20000
Давайте пройдемся через то, что мы сделали здесь. Сначала мы добавили Вверх по течению объект (произвольно названный Minecraft-Servers), который функционирует как виртуальный хост для балансировки нагрузки на несколько служб. Это именно та функциональность, которая нам нужна. Мы добавили два Целевые объекты к нашему восходящему сервису. Каждая цель имеет адрес с хостом и портом; В нашем случае наши две цели указывают на Localhost: 25000 (сервер Minecraft A) и Localhost: 26000 (сервер Minecraft B). Затем мы устанавливаем вес для каждой цели, которую использует балансировщик нагрузки для распределения нагрузки. Несмотря на то, что мы явно устанавливаем веса равномерно на 100, по умолчанию для этой дополнительной конфигурации составляет 100.
Далее мы объявили наш сервисный объект, который в данном случае является нашей службой балансировщика нагрузки. Запросы, которые удовлетворяют маршруты, которые мы установили, будут направлены на хост Minecraft-Servers, наш балансирующий нагрузку вверх по течению объект. Подобно нашему предыдущему шагу, мы настроили маршрут, сообщив Kong Gateway для прослушивания запросов TCP/TLS, предназначенных для 127.0.0.1:20000.
Перезапустить Конг
Поскольку наша конфигурация Kong изменилась, нам нужно перезапустить Kong для вступления в силу:
~/project$ sudo kong restart
На данный момент все работает и работает. У нас есть два сервера Minecraft (сервер A и сервер B), работающие в контейнерах Docker в двух отдельных окнах терминала. Мы настроили Kong для прослушивания TCP на порту 20000, пересылав эти запросы нашему балансировщику нагрузки, распределяя подключения на наших двух серверах.
Откройте клиент Minecraft Game снова. Подобно предыдущим шагам, мы попытаемся подключиться к многопользовательскому серверу по адресу localhost: 20000 напрямую. Когда вы подключаетесь, следите за двумя окнами терминала сервера. Поскольку вы неоднократно подключаетесь к игре, отключите, а затем воссоединяетесь, вы порой увидите сообщение журнала подключения для сервера A, а затем в другое время сообщение для сервера B.
И так же, как это, мы настроили наш балансировщик нагрузки для распространения запросов на соединение на наших двух серверах Minecraft!
Чтобы записать, мы медленно прогрессировали в сложности для нашего мини-проекта:
- Мы начали с простого раскручивания одного сервера Minecraft в контейнере Docker, используя порт 25000 для принятия подключений к игровым клиентам.
- Затем мы настроили Gateway Kong, чтобы сесть перед нашим единственным сервером для выполнения пересылки портов. Конг прослушал в порту 20000 для подключений к игровым клиентам, пересылав эти запросы в порт на нашем хосте, где был доступен сервер Minecraft.
- Наконец, мы настроили два сервера Minecraft для работы одновременно. Затем мы настроили Kong Gateway, чтобы действовать как балансировщик нагрузки. Kong выслушал в Port 20000 для подключений к игровым клиентам, на этот раз направляя их через сервис балансировки нагрузки для распространения соединений на наших двух серверах.
Отсюда у вас есть много возможностей для добавления сложности. Вы можете добавить больше игровых серверов. Например, если некоторые серверы работают на машинах, которые могут обрабатывать более тяжелую нагрузку подключений, чем другие, то вы можете настроить балансировщик нагрузки для распределения нагрузки неравномерно. Вы можете настроить правила проверки здоровья для балансировщика нагрузки Kong, чтобы убедиться, что запросы перенаправляются только на те серверы, которые в настоящее время здоровы. Вы даже можете выбрать из нескольких алгоритмов балансировки нагрузки, помимо стратегии «круглый робин» по умолчанию.
Итак, мы немного повеселились и научились использовать некоторые важные инструменты и концепции на этом пути. Мы обнаружили, что балансировка нагрузки и пересылка порта с Kong Gateway проста и легко настроить. Тем не менее, даже с такой легкостью эти функции чрезвычайно мощные. Теперь, когда у вас есть ручка, пришло время приступить к работе и столкнуться с Эндер Дракон Анкет
Оригинал: «https://dev.to/mbogan/load-balancing-minecraft-servers-with-kong-gateway-59ml»