Mit Agones (aus anderen griechischen Ländern - „Konkurrenz“) können Sie einen Spieleservercluster mithilfe von Kubernetes mit automatischer Skalierung bereitstellen. Dieses Open-Source- Projekt wurde 2018 erstellt, erhielt bereits 2500 Sterne, war auf Google I / O 2019 und wurde zu unserer großen Überraschung auf Habré noch nicht erwähnt. Das Thema beschreibt einen kurzen Einblick in die Architektur und Anweisungen zum Starten eines Testservers auf einem lokalen Computer. Bei Interesse willkommen bei kat, los!

Projektbeschreibung
Agones ist eine benutzerdefinierte Ressource ( Kubernetes API Extension ).
Das Projekt erfordert tatsächlich mehr Aufmerksamkeit, da Sie einen einzelnen Spieleserver (GameServer) oder eine ganze "Flotte" von Servern (Flotten) über Konfigurations-Yaml-Dateien über die Agones-API ausführen können. Jeder Server gibt wiederum Warnungen über seinen Lebenszyklus (GameServer-Lebenszyklen) aus und beschreibt den aktuellen Status (Integritätsprüfung, Verbindungsinformationen). Server im Cluster können automatisch skaliert werden (Fleet Autoscaling), was in die Grundfunktionen von Kubernetes integriert ist. Darüber hinaus wird im Dashboard eine Statistik mit Prometheus, Grafana oder Stackdriver ausgegeben. Die Metriken werden über OpenCensus exportiert, sodass Sie Ihren eigenen Exporter hinzufügen können. Dashboard-Beispiel in Stackdriver:

Architektur, Grundelemente
Agones selbst übernimmt die Aufgabe, Spieleserver auf Basis von Kubernetes zu starten, automatisch zu erweitern und zu hosten. Auf diese Weise können Sie sich auf die Entwicklung des Multiplayer-Spieleservers selbst konzentrieren, anstatt dessen Infrastruktur und weiteren Support zu entwickeln. Sie können jeden Spieleserver verwenden, der unter Linux ausgeführt werden kann, und er kann in jeder Programmiersprache geschrieben werden.
Die Agones Kubernetes-API ist in drei Hauptpakete (Pakete) unterteilt, die jeweils Ressourcen enthalten: agones.dev (GameServer, GameServerSet, Fleet), assign.agones.dev (GameServerAllocation), autoscaling.agones.dev (FleetAutoscaler). Wie bei anderen Kubernetes-Ressourcen werden Yaml-Dateien verwendet, um sie auszuführen.
Eine kurze Beschreibung jeder Ressource:
- GameServer - Erstellt eine bestimmte Vorlage, mit der Sie die üblichen Pod-Parameter mit einigen Ergänzungen wie hostPort und containerPort für den Spieleserver verwenden können. Das Agones SDK bietet einen optionalen Beiwagencontainer, mit dem der GameServer ständig kommuniziert
- GameServerSet - Datenstruktur für mehrere GameServer, die der Beziehung zwischen Depoyment und ReplicaSet sehr ähnlich ist
- Flotte - erstellt mehrere vorgefertigte GameServer und verwendet GameServerAllocation zum Verteilen von Ressourcen
- GameServerAllocation - Bittet den GameServer von Fleet um Verwendung und markiert, dass er für Spieler einsatzbereit ist, sodass GameServer nicht automatisch gelöscht wird
- FleetAutoscaler - erweitert oder reduziert automatisch die Anzahl der Server in Fleet
Das Diagramm ( von hier ) zeigt den Lebenszyklus der GameServer-Ressource:

Die violetten Pfeile zeigen das Agones SDK an, rot - die Benutzer-API, blau - den Game-Server-Controller, gelb - den Anwendungs-Controller.
Installation
In diesem und den folgenden Abschnitten werden Teams mit Anweisungen auf der offiziellen Website mit einigen Ergänzungen verwendet. Wir empfehlen die Verwendung von Kubernetes Version 1.12 (von Entwicklern getestet). Für den Test auf dem lokalen Computer können Sie minikube verwenden , für das kubectl und ein vom Betriebssystem unterstützter Hypervisor ( Hyper-V oder VirtualBox ) erforderlich sind.
Um den Cluster und Agones zu installieren, müssen Sie die folgenden Befehle ausführen:
minikube profile agones
Der letzte Befehl lädt die Agones-Konfigurationsdatei herunter, mit der benutzerdefinierte Ressourcendefinitionen (CRD) über die Kubernetes-API erstellt werden.
GameServer starten
Jetzt können Sie den UDP-Server im Cluster mithilfe des vorgefertigten Testservers aus den Beispielen starten, der einfach auf die an ihn gesendete Anfrage reagiert:
Um zu bestätigen, dass der Server funktioniert, können Sie NetCat verwenden. Für Linux wird das Programm normalerweise mit dem System geliefert. Für Windows müssen Sie es beispielsweise hier herunterladen. NetCat muss mit dem Parameter -u
(UDP-Anforderung) gestartet werden, wobei die Minikube-Adresse (es ist besser, die Adresse aus dem Befehl minikube ip
zu kopieren) und der aktive GameServer-Port angegeben werden:
echo "hello" | nc -u $(minikube ip) 7331
Wenn nach dem Ausführen des Befehls in der Konsole die Antwort "ACK: Hallo" angezeigt wird und der Server funktioniert, können Sie ihn mit dem folgenden Befehl deaktivieren, der initialisiert wird:
echo "EXIT" | nc -u $(minikube ip) 7331
Der Serverstatus wird vom kubectl describe gameserver
überprüft. Er sollte sich in Shutdown ändern.
Änderungen an GameServer vornehmen
Im vorherigen Beispiel ändern wir die Serverantwort. Kopieren Sie zunächst das Projekt-Repository:
git clone git@github.com:googleforgames/agones.git
Ändern Sie in der Datei agones / examples / simple-udp / main.go die Zeile 159 in
respond(conn, sender, "ACKNOWLEDGED: "+txt+"\n")
Führen Sie im Projektstammordner Folgendes aus, um ein Docker-Image zu erstellen und es in minikube zu speichern. Für Windows müssen Sie zuerst minikube docker-env | Invoke-Expression
minikube docker-env | Invoke-Expression
für Linux eval $(minikube docker-env)
. Auf diese Weise können Sie Docker-Bilder direkt in der Minikube erstellen.
Erstellen Sie ein Docker-Image:
docker build -t agones-go:modified -f .\examples\simple-udp\Dockerfile .
Dieser Befehl kann einige Zeit dauern, da das gesamte Projekt-Repository in das Image kopiert wird. Dies kann vermieden werden, indem nur der Ordner sdks, main.go und Dockerfile im Verzeichnis belassen werden.
Ändern Sie als Nächstes in den Beispielen \ simple-udp \ gameserver.yaml Zeile 28 in image: agones-go:modified
und erstellen Sie einen neuen GameServer:
kubectl create -f .\examples\simple-udp\gameserver.yaml
Überprüfen Sie die Änderungen und schalten Sie den Server aus:
echo "hello" | nc -u 172.17.113.72 7331 echo "EXIT" | nc -u 172.17.113.72 7331
Wenn nach dem Ausführen von Befehlen in der Konsole die Antwort "ACKNOWLEDGED: hello" angezeigt wird, waren die Änderungen erfolgreich.
Wir starten den Server lokal
Sie können Änderungen für eine bequeme Entwicklung ohne Kubernetes nur mit dem Agones SDK wiederholen. Während der Spieleserver ausgeführt wird, kommuniziert das SDK über TCP mit einem kleinen gRPC-Server, den Agones in einem Container unter demselben Namespace ausführt. Ein solcher Container in Kubernetes heißt Beiwagen. Für die lokale Entwicklung müssen Sie daher den SDK-Prozess starten. Dazu müssen Sie die Quelldatei mit dem Parameter -local
ausführen, wodurch der Modus "Lokaler Modus" aktiviert wird. In diesem Modus wird der Prozess angewiesen, sich im passiven Modus zu befinden und keine Verbindung herzustellen. Zeigen Sie einfach die Protokolle in der Konsole an, damit Sie sehen können, was das SDK tut, während der Spieleserver ausgeführt wird.
Sie können den neuesten agonessdk-Server in den Releases des offiziellen Projekt-Repositorys herunterladen. Standardmäßig wird nach dem Starten des SDK-Servers ein GameServer-Konfigurationsleerzeichen erstellt, das für SDK-Anforderungen von GameServer () und WatchGameServer () verwendet wird. Beim Start können Sie Ihre eigene Konfigurationsdatei im yaml- oder json-Format angeben. Dazu benötigen Sie den Parameter -file
oder dessen verkürzte Version -f
zusammen mit dem Parameter -file
.
.\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"}
Fortsetzung folgt...