- Agones, создаем многопользовательский игровой сервер. Архитектура и установка
- Описание проекта
- Архитектура, основные элементы
- Установка
- Запуск GameServer
- Вносим изменения в GameServer
- Запускаем сервер локально
- Сервер на базе игрового компьютера
- Что нужно
- Общие требования
- Выбор комплектующих
- Процессор
- Материнская плата
- Корпус
- Система охлаждения
- Память
- Видеокарта
- Блок питания
- SSD диски
- HDD диски
- Быстро создаем и запускаем игровой сервер для любой игры
Agones, создаем многопользовательский игровой сервер. Архитектура и установка
Agones (от др.-греч. agōn — «соревнование») позволяет развернуть кластер игрового сервера используя Kubernetes с возможностью Auto-Scaling. Этот open-source проект был создан в 2018 году, уже набрал 2500 звезд, был на Google I/O 2019, и на Хабре, к великому удивлению, еще не был упомянут. В топике описан краткий экскурс в архитектуру и инструкция по запуску тестового сервера на локальной машине. Если интересно, добро пожаловать под кат, вперед!
Описание проекта
Agones представляет собой Custom Resource (расширение Kubernetes API).
Проект в действительности требует большего внимания, так как позволяет запускать единичный игровой сервер (GameServer) или же целый «флот» серверов (Fleets) посредством конфигурационных yaml файлов, через Agones API. В свою очередь, каждый сервер дает оповещения о его жизненном цикле (GameServer lifecycles), описывая текущий статус (health checking, connection information). Сервера в кластере имеют возможность автоматического масштабирования (Fleet Autoscaling), которые интегрированы с базовыми возможностями Kubernetes. В дополнение, есть вывод статистики на панели (dashboard) с помощью Prometheus, Grafana или Stackdriver, экспортируются метрики посредством OpenCensus, что позволяет добавить собственный экспортер. Пример dashboard’a в Stackdriver:
Архитектура, основные элементы
Сам по себе Agones берет на себя задачу запуска, автоматического расширения и хостинга игровых серверов используя в основе Kubernetes. Это позволяет сосредоточиться на разработке самого сервера многопользовательской игры, вместо разработки ее инфраструктуры и дальнейшей поддержки. Можно использовать любой игровой сервер, который может быть запущен на linux, причем он может быть написан на любом языке программирования.
Agones Kubernetes API делится на три основных пакета (packages), в каждом из которых находятся ресурсы: agones.dev (GameServer, GameServerSet, Fleet), allocation.agones.dev (GameServerAllocation), autoscaling.agones.dev (FleetAutoscaler). Как и в других ресурсах Kubernetes для их запуска используется yaml файлы.
Краткое описание каждого ресурса:
- GameServer — создает некий шаблон, который позволяет использовать обычные Pod параметры, с некоторыми дополнениями, такие как hostPort и containerPort для игрового сервера. Agones SDK предоставляет дополнительный контейнер «помощник» (sidecar), с которым GameServer в процессе будет постоянно общаться
- GameServerSet — структура данных для нескольких GameServer, очень схоже с отношением между Depoyment и ReplicaSet
- Fleet — создает несколько готовых GameServer, используется GameServerAllocation для распределения ресурсов
- GameServerAllocation — запрашивает GameServer из Fleet для использования и помечает, что он готов для использования игроками, благодаря этому GameServer не будет автоматически удален
- FleetAutoscaler — автоматически расширяет или, наоборот, уменьшает количество серверов во Fleet
Диаграмма (отсюда) показывает жизненный цикл GameServer ресурса:
Фиолетовыми стрелками отмечена работа Agones SDK, красным — API пользователя, синим — контроллер игрового сервера, желтым — контроллер приложения.
Установка
В данном и последующих разделах используются команды с инструкции на официальном сайте, с некоторыми дополнениями. Рекомендуется использовать Kubernetes версии 1.12 (протестировано разработчиками). Для теста на локальном компьютере можно использовать minikube, который потребует kubectl и гипервизор (Hyper-V или VirtualBox) поддерживаемый операционной системой.
Для установки кластера и Agones необходимо запустить следующие команды:
Последняя команда скачивает конфигурационный файл Agones создающий Custom Resource Definitions (CRD) через Kubernetes API.
Запуск GameServer
Теперь можно запустить в кластере UDP сервер используя готовый тестовый сервер из примеров, который будет просто отвечать на посланный к нему запрос:
Для подтверждения того, что сервер работает можно использовать NetCat, для linux программа обычно идет в поставке с системой, для windows её нужно скачать, к примеру здесь. NetCat нужно запустить с параметром -u (UDP запрос), указывая адрес minikube (лучше скопировать адрес с команды minikube ip ) и активный порт GameServer:
Если после запуска команды в консоли появится ответ «ACK: hello», то сервер работает, его можно выключить следующей командой, которая инициализирует :
Статус сервера проверяется командой kubectl describe gameserver , он должен поменяться на Shutdown.
Вносим изменения в GameServer
Используя предыдущий пример изменим ответ сервера. Для начала скопируем репозиторий проекта:
Из корневой папки проекта запустим следующее, чтобы создать docker image и сохранить его в minikube. Для windows предварительно нужно запустить minikube docker-env | Invoke-Expression , для linux eval $(minikube docker-env) . Это позволит создавать docker images напрямую в minikube.
Создадим docker image:
Эта команда может занять некоторое время, так как весь репозиторий проекта будет копироваться в image. Этого можно избежать, если в директории оставить только папку sdks, файл main.go и Dockerfile.
Далее в examples\simple-udp\gameserver.yaml изменим строку 28 на image: agones-go:modified и создадим новый GameServer:
Проверим изменения и выключим сервер:
Если после запуска команд в консоли появится ответ «ACKNOWLEDGED: hello», то внесенные изменения прошли успешно.
Запускаем сервер локально
Итерировать изменения для удобной разработки можно и без Kubernetes, используя только Agones SDK. Во время работы игрового сервера SDK общается через TCP с маленьким gRPC сервером, который Agones запускает в контейнере под тем же namespace. Такой контейнер в Kubernetes называется sidecar. Поэтому, для локальной разработки необходимо запустить процесс SDK. Для этого потребуется запустить его исходный файл с параметром -local , который включает режим ‘local mode’. Этот режим говорит процессу быть в пассивном режиме и никуда не подсоединяться, только лишь выводить логи в консоль, чтобы можно было видеть, что делает SDK во время работы игрового сервера.
Скачать последний agonessdk-server можно в релизах официального репозитория проекта. По умолчанию, после запуска SDK сервера создается болванка конфигурации GameServer, которая используется для GameServer() и WatchGameServer() SDK запросов. При запуске можно указать и собственный конфигурационный файл в формате yaml или json, для этого потребуется параметр -file или его сокращенная версия -f вместе с параметром -local .
Источник
Сервер на базе игрового компьютера
Столкнулись на работе с ситуацией, когда серверных мощностей перестало хватать. Разработчики пожаловались на очень долгую компиляцию проекта. Сервер HP Proliant DL360 Gen9 с двумя процессорами Intel(R) Xeon(R) CPU E5-2660 v4 @ 2.00GHz с 56 логическими ядрами и дисками 15000 оборотов справлялся с задачей за два часа, это очень долго. Анализ проблемы выявил недостаточную частоту процессора сервера.
Было принято решение использовать для решения задачи игровой процессор. Не часто на работе приходится собирать и использовать такие вещи!
Что нужно
- Игровой процессор с хорошей частотой, большое количество ядер не нужно. Возможность разгона.
- Хорошее охлаждение, лучше жидкостное, опять же для обеспечения стабильной работы процессора при разгоне.
- Материнская плата для поддержки выбранного процессора, с возможностью установки SATA дисков и слотами M.2. Должна быть поддержка RAID.
- SSD диски на M.2 в зеркале RAID для работы.
- SATA-III диски в зеркале RAID для хранения данных.
- Видеокарта любая.
- Память, быстрая, 32 Гб суммарно.
- Блок питания без особых требований.
- Корпус, чтобы всё впихнуть.
Общие требования
Мы пока не решили, где именно будет стоять данный сервер, в серверной или под столом у разработчиков. Поэтому, он должен быть достаточно тихим. Он должен решать поставленные задачи — быть производительным. Вот и все требования, в остальном фантазия ограничена только бюджетом. Бюджет, кстати, 220000 руб. Не будем скрывать реальную стоимость железа. Конечно, оно потом подешевеет, но нам нужно уже «вчера».
Выбор комплектующих
Процессор
Выбрали процессор: AMD Ryzen Threadripper 2950X Colfax — третий по стоимости и производительности в линейке Threadripper. 16 ядер и максимальный разгон до 4,4 ГГц.
Ядра/ Потоки | Базовая частота, ГГц | Макс. частота, ГГц | L3-кеш, Мбайт | Поддержка памяти | Линии PCIe | TDP, Вт | Цена | |
Threadripper 2950X | 16/32 | 3,5 | 4,4 | 32 | 4 × DDR4-2933 | 60 | 180 | $899 |
Материнская плата
Выбрали материнскую плату Gigabyte X399 Aorus Xtreme. Она была специально подготовлена к выходу новых процессоров AMD Threadripper.
Корпус
Корпус выбрали Deepcool Matrexx 70.
Новая концепция, специально спроектированная для получения удовольствия от самостоятельной сборки.
Наше цель не в получении удовольствия от самостоятельной сборки. Нам нужно, чтобы всё влезло, даже жидкостное охлаждение.
Система охлаждения
Охлаждать будем с помощью ID-Cooling ZoomFlow 240. Хорошее охлаждение и тишина.
Память
Берём два комплекта CRUCIAL Ballistix Elite BLE2K8G4D36BEEAK DDR4 — 2 x 8 Гб. Итого 32 Гб. Оперативная память Ballistix Elite предназначена для комплектации мощного игрового компьютера или универсального системного блока. Рассчитана на высокую производительность и стабильную работу.Оснащена радиаторами охлаждения.
Видеокарта
Видеокарту берем не игровую, попроще. MSI GeForce GT 1030 2GHD4 LP OC с радиатором пассивного охлаждения от компании MSI.
Блок питания
Блок питания Straight Power 11 750W со съёмным комплектом кабелей. Блоки питания бренда Be Quiet акцентированы на низкий уровень шума.
SSD диски
Современный SSD накопитель для компьютера 970 EVO Plus обеспечивает скорость последовательного чтения/записи до 3500/3300 MБ/с. Греется, но в серверной есть кондиционер. Берём две штуки для организации RAID1 массива.
HDD диски
Для хранения берём медленные, но надёжные диски. Western Digital SATA-III 8TB, две штуки для организации RAID1 массива.
Источник
Быстро создаем и запускаем игровой сервер для любой игры
Доброго времени суток, уважаемые читатели! Скорее всего вы задавались вопросом: как создать свой сервер для какой-либо игры?. В этой статье хочу привести вам пример создания игрового сервера на базе Яндекс.Облака по средствам сервиса Compute Cloud. Имея свой выделенный сервер(VDS/VPS) мы точно будем знать какие процессы на нем происходят. В отличии от имеющихся на рынке хостинг-провайдеров, предлагающих свои услуги по размещению и быстрому развертыванию сервера. Недобросовестные хостеры могут поставить на свою машину до 50 серверов , ради своей выгоды и в ущерб не знающему пользователю. Данная модель очень прибыльна, но для клиента имеет очень много негативных последствий.
Имея свою вирутальную машину мы сможем полностью управлять всеми процессами на ней. Сможем обеспечить комфортную работу нашего сервера. Сервера Яндекс.Облака достаточно гибкие, имеют отличную пропускную способность и геолокацию. Конечно же, выделенный IP адрес. Так же на своей машинке мы можем запустить несколько серверов. Столько, сколько совесть нам позволит.
Ну что? Приступим к развертыванию сервера на облаке от Яндекса? К ак запустить и подготовить сервер к работе я рассказал в предыдущей статье . А сейчас продолжим, имея : чистый, готовый сервер. Программы для работы: PuTTy, WinSCP .
Приступим. Подключаемся через SSH-ключ используя WinSCP.
Далее для пущей безопасности и более удобного администрирования( если планируем создавать более 1 сервера ) можем создать различных пользователей нашего виртуального сервера. Мы же будем запускать из под текущего пользователя — admin. Теперь нам потребуются файлы сервера. Для примера, все игры на движке Source от VALVE имеют удобную утилиту SteamCMD. Которая позволяет установить любой сервер на движке Source. Так же Valve имеет богатое комьюнити и множество инструкций по установке и настройке серверов и не только — Valve Developer Community.
Грубо говоря, имея SteamCMD и AppID сервера (Берется из Dedicated Servers List ) мы можем легко установить самую актуальную версию сервера. Список большой и разнообразный. Приступим? Покажу на примере сервера CS:GO.
Для начала создаем папку для нашего SteamCMD на сервере и переходим в нее.
После этого скачиваем SteamCMD.
После установки всех компонентов SteamCMD получаем такое окно:
Далее нам предстоит залогиниться перед выполнением всех следующих команд. Для установки некоторых серверов требуется наличие игры на аккаунте. Поэтому есть 2 варианта развития событий:
1. Используем login anonymous (Не все сервера можно загрузить)
2. Используем login логин пароль (После этого запросит код Steam-guard) (Используется для загрузки всех имеющихся на аккаунте игр-серверов)
После авторизации нам остается выбрать папку для загрузки сервера. Для загрузки сервера в корневой каталог SteamCMD с последующим созданием папки csgo используем:
Далее приступим к загрузке самого сервера в папку. Для этого используем:
app_update 740 validate ( В нашем случае: 740 — AppID CS:GO, Validate это проверка на целостность в конце закачки. )
Отправляем команду. Ждем окончания закачки сервера. После окончания скачивания пишем quit . И запускаем наш пробный сервер.
./srcds_run -game csgo -console -usercon +game_type 0 +game_mode 0 +mapgroup mg_active +map de_dust2
IP сервера такой же как и IPv4 нашей машины. Порт по умолчанию 27015. Дальше нужна только ваша фантазия 🙂
Сегодня мы рассмотрели один из 1000 вариантов применения Облачных технологий от Яндекс.Облака. На самом деле это очень большой и грамотный инструмент для ваших задумок. Это лишь один из примеров использования. Сюда же можно поставить и сайт и ботов. Всем большое спасибо за прочтение! И на конец, вопрос? Пользуетесь ли вы облачными технологиями?
Источник