Agones (d'un autre agon grec - «compétition») vous permet de déployer un cluster de serveurs de jeux à l'aide de Kubernetes avec Auto-Scaling. Ce projet open source a été créé en 2018, a déjà marqué 2500 étoiles, était sur Google I / O 2019, et sur Habré, à notre grande surprise, n'était pas encore mentionné. La rubrique décrit une brève excursion dans l'architecture et des instructions pour démarrer un serveur de test sur une machine locale. Si vous êtes intéressé, bienvenue à Kat, allez-y!

Description du projet
Agones est une ressource personnalisée ( extension API Kubernetes ).
Le projet nécessite en fait plus d'attention, car il vous permet d'exécuter un seul serveur de jeu (GameServer) ou toute une "flotte" de serveurs (Flottes) via des fichiers de configuration yaml, via l' API Agones . À son tour, chaque serveur donne des alertes sur son cycle de vie (cycles de vie GameServer), décrivant l'état actuel (vérification de l'état, informations de connexion). Les serveurs du cluster peuvent évoluer automatiquement (Fleet Autoscaling), qui sont intégrés aux capacités de base de Kubernetes. De plus, il y a une sortie de statistiques sur le tableau de bord utilisant Prometheus, Grafana ou Stackdriver, les métriques sont exportées via OpenCensus , ce qui vous permet d'ajouter votre propre exportateur. Exemple de tableau de bord dans Stackdriver:

Architecture, éléments de base
Agones se charge de lancer, d'étendre et d'héberger automatiquement des serveurs de jeux en utilisant Kubernetes comme base. Cela vous permet de vous concentrer sur le développement du serveur de jeu multijoueur lui-même, au lieu de développer son infrastructure et son support supplémentaire. Vous pouvez utiliser n'importe quel serveur de jeux qui peut être exécuté sur Linux et il peut être écrit dans n'importe quel langage de programmation.
L'API Agones Kubernetes est divisée en trois packages principaux, chacun contenant des ressources: agones.dev (GameServer, GameServerSet, Fleet), allocation.agones.dev (GameServerAllocation), autoscaling.agones.dev (FleetAutoscaler). Comme les autres ressources Kubernetes, les fichiers yaml sont utilisés pour les exécuter.
Une brève description de chaque ressource:
- GameServer - crée un certain modèle qui vous permet d'utiliser les paramètres de pod habituels, avec quelques ajouts, tels que hostPort et containerPort pour le serveur de jeu. Le SDK Agones fournit un conteneur de sidecar en option avec lequel le GameServer communiquera en permanence
- GameServerSet - structure de données pour plusieurs GameServer, très similaire à la relation entre Depoyment et ReplicaSet
- Flotte - crée plusieurs GameServer prêts à l'emploi, utilise GameServerAllocation pour distribuer les ressources
- GameServerAllocation - demande au GameServer de Fleet de l'utiliser et indique qu'il est prêt à être utilisé par les joueurs, donc GameServer ne sera pas automatiquement supprimé
- FleetAutoscaler - étend automatiquement ou, inversement, réduit le nombre de serveurs dans Fleet
Le diagramme (Ă partir d'ici ) montre le cycle de vie de la ressource GameServer:

Les flèches violettes indiquent le SDK Agones, rouge - l'API utilisateur, bleu - le contrôleur du serveur de jeu, jaune - le contrôleur d'application.
L'installation
Dans cette section et les suivantes, des équipes avec des instructions sur le site officiel sont utilisées, avec quelques ajouts. Nous vous recommandons d'utiliser Kubernetes version 1.12 (testé par les développeurs). Pour le test sur l'ordinateur local, vous pouvez utiliser un minikube , qui nécessitera kubectl et un hyperviseur ( Hyper-V ou VirtualBox ) pris en charge par le système d'exploitation.
Pour installer le cluster et Agones, vous devez exécuter les commandes suivantes:
minikube profile agones
La dernière commande télécharge le fichier de configuration Agones qui crée des définitions de ressources personnalisées (CRD) via l'API Kubernetes.
Lancement de GameServer
Vous pouvez maintenant démarrer le serveur UDP dans le cluster à l'aide du serveur de test prêt à l'emploi des exemples, qui répondra simplement à la demande qui lui est envoyée:
Pour confirmer que le serveur fonctionne, vous pouvez utiliser NetCat, pour Linux, le programme est généralement livré avec le système, pour Windows, vous devez le télécharger, par exemple ici . NetCat doit être démarré avec le paramètre -u
(demande UDP), en spécifiant l'adresse du mini-cube (il est préférable de copier l'adresse à partir de la commande minikube ip
du minikube ip
- minikube ip
) et le port GameServer actif:
echo "hello" | nc -u $(minikube ip) 7331
Si après avoir exécuté la commande dans la console la réponse "ACK: bonjour" apparaît, alors le serveur fonctionne, vous pouvez le désactiver par la commande suivante, qui s'initialise:
echo "EXIT" | nc -u $(minikube ip) 7331
L'état du serveur est vérifié par l'équipe kubectl describe gameserver
le kubectl describe gameserver
, il devrait passer Ă Shutdown.
Apporter des modifications Ă GameServer
En utilisant l'exemple précédent, nous allons changer la réponse du serveur. Tout d'abord, copiez le référentiel du projet:
git clone git@github.com:googleforgames/agones.git
Dans le fichier agones / examples / simple-udp / main.go, changez la ligne 159 en
respond(conn, sender, "ACKNOWLEDGED: "+txt+"\n")
À partir du dossier racine du projet, exécutez ce qui suit pour créer une image d'ancrage et l'enregistrer dans le mini-cube. Pour Windows, vous devez d'abord exécuter minikube docker-env | Invoke-Expression
minikube docker-env | Invoke-Expression
, pour linux eval $(minikube docker-env)
. Cela vous permettra de créer des images Docker directement dans le minikube.
Créez une image docker:
docker build -t agones-go:modified -f .\examples\simple-udp\Dockerfile .
Cette commande peut prendre un certain temps, car l'intégralité du référentiel de projet sera copié dans l'image. Cela peut être évité en ne laissant que le dossier sdks, main.go et Dockerfile dans le répertoire.
Ensuite, dans examples \ simple-udp \ gameserver.yaml, changez la ligne 28 en image: agones-go:modified
et créez un nouveau GameServer:
kubectl create -f .\examples\simple-udp\gameserver.yaml
Vérifiez les modifications et éteignez le serveur:
echo "hello" | nc -u 172.17.113.72 7331 echo "EXIT" | nc -u 172.17.113.72 7331
Si, après avoir exécuté des commandes dans la console, la réponse "ACKNOWLEDGED: hello" apparaît, les modifications ont réussi.
Nous démarrons le serveur localement
Vous pouvez itérer les modifications pour un développement pratique sans Kubernetes, en utilisant uniquement le SDK Agones. Pendant que le serveur de jeu est en cours d'exécution, le SDK communique via TCP avec un petit serveur gRPC qu'Agones exécute dans un conteneur sous le même espace de noms. Un tel conteneur dans Kubernetes est appelé sidecar. Par conséquent, pour le développement local, vous devez démarrer le processus SDK. Pour ce faire, vous devez exécuter son fichier source avec le paramètre -local
, qui active le mode «mode local». Ce mode indique au processus d'être en mode passif et de ne se connecter nulle part, affichez simplement les journaux dans la console afin que vous puissiez voir ce que fait le SDK pendant que le serveur de jeu est en cours d'exécution.
Vous pouvez télécharger le dernier serveur agonessdk dans les versions du référentiel de projet officiel. Par défaut, après le démarrage du serveur SDK, un espace vide de configuration GameServer est créé, qui est utilisé pour les requêtes SDK GameServer () et WatchGameServer (). Au démarrage, vous pouvez spécifier votre propre fichier de configuration au format yaml ou json, pour cela vous avez besoin du paramètre -file
ou de sa version raccourcie -f
avec le paramètre -local
.
.\sdk-server --local -f .\examples\simple-udp\gameserver.yaml sdk-server : {"ctlConf":{"Address":"localhost","IsLocal":true,"LocalFile":".\\examples\\simple-udp\\gameserver.yaml","Timeout":0,"Test":""},"grpcPor t":59357,"httpPort":59358,"message":"Starting sdk sidecar","severity":"info","source":"main","time":"2019-09-29T12:45:59.8379817+02:00","version":"1.0.0"} {"filePath":"C:\\agones-release-1.0.0\\examples\\simple-udp\\gameserver.yaml","message":"Reading GameServer configuration","severity":"info","time":"2019-09-29T12:45:59.8479789+02:00"} {"message":"Starting SDKServer grpc service...","severity":"info","source":"main","time":"2019-09-29T12:45:59.8529791+02:00"} {"message":"Starting SDKServer grpc-gateway...","severity":"info","source":"main","time":"2019-09-29T12:46:00.1555756+02:00"}
Ă€ suivre ...