Agones (de otro griego agōn - "competencia") le permite implementar un clúster de servidores de juegos usando Kubernetes con Auto-Scaling. Este proyecto de código abierto fue creado en 2018, ya obtuvo 2500 estrellas, estaba en Google I / O 2019 y, para la gran sorpresa, no fue mencionado en Habré. El tema describe una breve excursión a la arquitectura e instrucciones para iniciar un servidor de prueba en una máquina local. Si está interesado, bienvenido a Kat, vaya!

Descripción del proyecto
Agones es un recurso personalizado ( Kubernetes API Extension ).
El proyecto en realidad requiere más atención, ya que le permite ejecutar un único servidor de juegos (GameServer) o una "flota" completa de servidores (Flotas) a través de archivos de configuración yaml, a través de la API de Agones . A su vez, cada servidor emite alertas sobre su ciclo de vida (ciclos de vida de GameServer), describiendo el estado actual (comprobación de estado, información de conexión). Los servidores en el clúster tienen la capacidad de escalar automáticamente (Fleet Autoscaling), que están integrados con las capacidades básicas de Kubernetes. Además, hay una salida de estadísticas en el tablero usando Prometheus, Grafana o Stackdriver, las métricas se exportan a través de OpenCensus , lo que le permite agregar su propio exportador. Ejemplo de panel en Stackdriver:

Arquitectura, elementos básicos.
Agones asume la tarea de lanzar, expandir automáticamente y alojar servidores de juegos utilizando Kubernetes como base. Esto te permite concentrarte en el desarrollo del servidor de juego multijugador, en lugar de desarrollar su infraestructura y soporte adicional. Puede usar cualquier servidor de juegos que se pueda ejecutar en Linux, y se puede escribir en cualquier lenguaje de programación.
La API de Agones Kubernetes se divide en tres paquetes principales, cada uno de los cuales contiene recursos: agones.dev (GameServer, GameServerSet, Fleet), asignacion.agones.dev (GameServerAllocation), autoscaling.agones.dev (FleetAutoscaler). Al igual que otros recursos de Kubernetes, los archivos yaml se utilizan para ejecutarlos.
Una breve descripción de cada recurso:
- GameServer: crea una determinada plantilla que le permite utilizar los parámetros habituales de Pod, con algunas adiciones, como hostPort y containerPort para el servidor de juegos. El SDK de Agones proporciona un contenedor de sidecar opcional con el que GameServer se comunicará constantemente
- GameServerSet: estructura de datos para varios GameServer, muy similar a la relación entre Depoyment y ReplicaSet
- Flota: crea varios GameServer listos para usar, utiliza GameServerAllocation para distribuir recursos
- GameServerAllocation: solicita el GameServer de Fleet para su uso y marca que está listo para ser utilizado por los jugadores, por lo que GameServer no se eliminará automáticamente
- FleetAutoscaler: se expande automáticamente o, por el contrario, reduce el número de servidores en Fleet
El diagrama ( desde aquí ) muestra el ciclo de vida del recurso GameServer:

Las flechas moradas indican el SDK de Agones, rojo: la API del usuario, azul: el controlador del servidor del juego, amarillo: el controlador de la aplicación.
Instalación
En esta y las secciones posteriores, se utilizan equipos con instrucciones en el sitio web oficial, con algunas adiciones. Recomendamos usar Kubernetes versión 1.12 (probado por los desarrolladores). Para la prueba en la computadora local, puede usar minikube , que requerirá kubectl y un hipervisor ( Hyper-V o VirtualBox ) compatible con el sistema operativo.
Para instalar el clúster y Agones, debe ejecutar los siguientes comandos:
minikube profile agones
El último comando descarga el archivo de configuración de Agones que crea definiciones de recursos personalizados (CRD) a través de la API de Kubernetes.
Lanzamiento de GameServer
Ahora puede iniciar el servidor UDP en el clúster utilizando el servidor de prueba listo de los ejemplos, que simplemente responderá a la solicitud que se le envíe:
Para confirmar que el servidor está funcionando, puede usar NetCat, para Linux el programa generalmente viene con el sistema, para Windows necesita descargarlo, por ejemplo aquí . NetCat debe iniciarse con el parámetro -u
(solicitud UDP), especificando la dirección del minikube (es mejor copiar la dirección del comando minikube ip
) y el puerto activo de GameServer:
echo "hello" | nc -u $(minikube ip) 7331
Si después de ejecutar el comando en la consola aparece la respuesta "ACK: hola", entonces el servidor está funcionando, puede apagarlo con el siguiente comando, que se inicializa:
echo "EXIT" | nc -u $(minikube ip) 7331
El estado del servidor es verificado por el equipo de kubectl describe gameserver
, debe cambiar a Apagar.
Realizar cambios en GameServer
Usando el ejemplo anterior, cambiaremos la respuesta del servidor. Primero, copie el repositorio del proyecto:
git clone git@github.com:googleforgames/agones.git
En el archivo agones / examples / simple-udp / main.go, cambie la línea 159 a
respond(conn, sender, "ACKNOWLEDGED: "+txt+"\n")
Desde la carpeta raíz del proyecto, ejecute lo siguiente para crear una imagen acoplable y guardarla en minikube. Para Windows, primero debe ejecutar minikube docker-env | Invoke-Expression
minikube docker-env | Invoke-Expression
, para linux eval $(minikube docker-env)
. Esto le permitirá crear imágenes acoplables directamente en minikube.
Crea una imagen acoplable:
docker build -t agones-go:modified -f .\examples\simple-udp\Dockerfile .
Este comando puede tomar algo de tiempo, ya que todo el repositorio del proyecto se copiará a la imagen. Esto se puede evitar dejando solo la carpeta sdks, main.go y Dockerfile en el directorio.
A continuación, en los ejemplos \ simple-udp \ gameserver.yaml, cambie la línea 28 a image: agones-go:modified
y cree un nuevo GameServer:
kubectl create -f .\examples\simple-udp\gameserver.yaml
Verifique los cambios y apague el servidor:
echo "hello" | nc -u 172.17.113.72 7331 echo "EXIT" | nc -u 172.17.113.72 7331
Si después de ejecutar comandos en la consola aparece la respuesta "RECONOCIDO: hola", los cambios fueron exitosos.
Iniciamos el servidor localmente
Puede repetir los cambios para un desarrollo conveniente sin Kubernetes, utilizando solo el SDK de Agones. Mientras se ejecuta el servidor de juegos, el SDK se comunica a través de TCP con un pequeño servidor gRPC que Agones ejecuta en un contenedor bajo el mismo espacio de nombres. Tal contenedor en Kubernetes se llama sidecar. Por lo tanto, para el desarrollo local, debe iniciar el proceso SDK. Para hacer esto, debe ejecutar su archivo fuente con el parámetro -local
, que activa el modo 'modo local'. Este modo le dice al proceso que esté en modo pasivo y que no se conecte a ningún lado, solo muestre los registros en la consola para que pueda ver lo que hace el SDK mientras se ejecuta el servidor del juego.
Puede descargar el último servidor agonessdk en las versiones del repositorio oficial del proyecto. De manera predeterminada, después de iniciar el servidor SDK, se crea un espacio en blanco de configuración de GameServer, que se utiliza para las solicitudes de SDK de GameServer () y WatchGameServer (). En el inicio, puede especificar su propio archivo de configuración en formato yaml o json, para esto necesita el parámetro -file
o su versión abreviada -f
junto con el parámetro -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"}
Continuará ...