Agones, créez un serveur de jeu multi-utilisateurs. Architecture et installation

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!


Logo Agones

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:


image


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 #    agones minikube start --kubernetes-version v1.12.10 --vm-driver hyperv #virtualbox minikube status #     kubectl create namespace agones-system #    agones kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.0.0/install/yaml/install.yaml 

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:


 # GameServer  kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.0.0/examples/simple-udp/gameserver.yaml kubectl get gameservers #  GameServer minikube ip #     kubectl describe gameserver #    GameServer kubectl get gs #  ,   GameServer 

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 ...

Source: https://habr.com/ru/post/fr469381/


All Articles