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 ресурса:  Фиолетовыми стрелками отмечена работа Agones SDK, красным — API пользователя, синим — контроллер игрового сервера, желтым — контроллер приложения. В данном и последующих разделах используются команды с инструкции на официальном сайте, с некоторыми дополнениями. Рекомендуется использовать Kubernetes версии 1.12 (протестировано разработчиками). Для теста на локальном компьютере можно использовать minikube, который потребует kubectl и гипервизор (Hyper-V или VirtualBox) поддерживаемый операционной системой. Для установки кластера и Agones необходимо запустить следующие команды: Последняя команда скачивает конфигурационный файл Agones создающий Custom Resource Definitions (CRD) через Kubernetes API. Теперь можно запустить в кластере UDP сервер используя готовый тестовый сервер из примеров, который будет просто отвечать на посланный к нему запрос: Для подтверждения того, что сервер работает можно использовать NetCat, для linux программа обычно идет в поставке с системой, для windows её нужно скачать, к примеру здесь. NetCat нужно запустить с параметром -u (UDP запрос), указывая адрес minikube (лучше скопировать адрес с команды minikube ip) и активный порт GameServer: Если после запуска команды в консоли появится ответ "ACK: hello", то сервер работает, его можно выключить следующей командой, которая инициализирует : Статус сервера проверяется командой kubectl describe gameserver, он должен поменяться на Shutdown. Используя предыдущий пример изменим ответ сервера. Для начала скопируем репозиторий проекта: В файле agones/examples/simple-udp/main.go поменяем строку 159 на Из корневой папки проекта запустим следующее, чтобы создать 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. Продолжение следует...