O Agones (de outro grupo grego - "competição") permite implantar um cluster de servidores de jogos usando o Kubernetes com Auto-Scaling. Este projeto de código aberto foi criado em 2018, já teve 2.500 estrelas, estava no Google I / O 2019 e em Habré, para nossa grande surpresa, ainda não foi mencionado. O tópico descreve uma breve excursão pela arquitetura e instruções para iniciar um servidor de teste em uma máquina local. Se estiver interessado, bem-vindo ao kat, vá!

Descrição do Projeto
Agones é um recurso personalizado ( extensão de API do Kubernetes ).
O projeto realmente requer mais atenção, pois permite executar um único servidor de jogo (GameServer) ou toda uma "frota" de servidores (Frotas) por meio de arquivos yaml de configuração, por meio da API do Agones . Por sua vez, cada servidor emite alertas sobre seu ciclo de vida (ciclos de vida do GameServer), descrevendo o status atual (verificação de integridade, informações de conexão). Os servidores no cluster têm a capacidade de escalar automaticamente (Fleet Autoscaling), integrado aos recursos básicos do Kubernetes. Além disso, há uma saída de estatísticas no painel usando Prometheus, Grafana ou Stackdriver; as métricas são exportadas via OpenCensus , o que permite adicionar seu próprio exportador. Exemplo de painel no Stackdriver:

Arquitetura, elementos básicos
O próprio Agones assume a tarefa de iniciar, expandir e hospedar automaticamente servidores de jogos usando o Kubernetes como base. Isso permite que você se concentre no desenvolvimento do próprio servidor de jogos para vários jogadores, em vez de desenvolver sua infraestrutura e suporte adicional. Você pode usar qualquer servidor de jogo que possa ser executado no Linux, e ele pode ser escrito em qualquer linguagem de programação.
A API do Agones Kubernetes é dividida em três pacotes principais (pacotes), cada um dos quais contém recursos: agones.dev (GameServer, GameServerSet, Fleet) ,ocation.agones.dev (GameServerAllocation), autoscaling.agones.dev (FleetAutoscaler). Como outros recursos do Kubernetes, os arquivos yaml são usados para executá-los.
Uma breve descrição de cada recurso:
- GameServer - cria um determinado modelo que permite usar os parâmetros habituais do Pod, com algumas adições, como hostPort e containerPort para o servidor do jogo. O Agones SDK fornece um contêiner lateral opcional com o qual o GameServer se comunica constantemente
- GameServerSet - estrutura de dados para vários GameServer, muito semelhante à relação entre Depoyment e ReplicaSet
- Frota - cria vários GameServer prontos, usa GameServerAllocation para distribuir recursos
- GameServerAllocation - solicita ao GameServer da Fleet o uso e marca que está pronto para uso pelos jogadores, para que o GameServer não seja excluído automaticamente
- FleetAutoscaler - expande automaticamente ou, inversamente, reduz o número de servidores no Fleet
O diagrama ( daqui ) mostra o ciclo de vida do recurso GameServer:

As setas roxas indicam o Agones SDK, vermelho - a API do usuário, azul - o controlador do servidor do jogo, amarelo - o controlador do aplicativo.
Instalação
Nesta seção e nas seções subseqüentes, equipes com instruções no site oficial são usadas, com algumas adições. Recomendamos o uso do Kubernetes versão 1.12 (testado pelos desenvolvedores). Para o teste no computador local, você pode usar o minikube , que exigirá o kubectl e um hipervisor ( Hyper-V ou VirtualBox ) suportados pelo sistema operacional.
Para instalar o cluster e o Agones, você deve executar os seguintes comandos:
minikube profile agones
O último comando baixa o arquivo de configuração do Agones, criando definições de recursos personalizados (CRD) por meio da API do Kubernetes.
Iniciando o GameServer
Agora você pode iniciar o servidor UDP no cluster usando o servidor de teste pronto a partir dos exemplos, que responderão simplesmente à solicitação enviada a ele:
Para confirmar que o servidor está funcionando, você pode usar o NetCat, para linux o programa geralmente vem com o sistema, para janelas é necessário fazer o download, por exemplo aqui . O NetCat deve ser iniciado com o parâmetro -u
(solicitação UDP), especificando o endereço do minikube (é melhor copiar o endereço do comando minikube ip
) e a porta ativa do GameServer:
echo "hello" | nc -u $(minikube ip) 7331
Se após a execução do comando no console a resposta "ACK: hello" aparecer, o servidor estiver funcionando, você poderá desativá-lo pelo seguinte comando, que inicializa:
echo "EXIT" | nc -u $(minikube ip) 7331
O status do servidor é verificado pela equipe do kubectl describe gameserver
; ele deve mudar para Shutdown.
Fazendo alterações no GameServer
Usando o exemplo anterior, alteraremos a resposta do servidor. Primeiro, copie o repositório do projeto:
git clone git@github.com:googleforgames/agones.git
No arquivo agones / examples / simple-udp / main.go, altere a linha 159 para
respond(conn, sender, "ACKNOWLEDGED: "+txt+"\n")
Na pasta raiz do projeto, execute o seguinte para criar uma imagem do docker e salvá-la no minikube. Para o Windows, você precisa primeiro executar o minikube docker-env | Invoke-Expression
minikube docker-env | Invoke-Expression
, para linux eval $(minikube docker-env)
. Isso permitirá que você crie imagens de janela de encaixe diretamente no minikube.
Crie uma imagem da janela de encaixe:
docker build -t agones-go:modified -f .\examples\simple-udp\Dockerfile .
Este comando pode levar algum tempo, pois todo o repositório do projeto será copiado para a imagem. Isso pode ser evitado deixando apenas a pasta sdks, main.go e Dockerfile no diretório
Em seguida, nos exemplos \ simple-udp \ gameserver.yaml, altere a linha 28 para image: agones-go:modified
e crie um novo GameServer:
kubectl create -f .\examples\simple-udp\gameserver.yaml
Verifique as alterações e desligue o servidor:
echo "hello" | nc -u 172.17.113.72 7331 echo "EXIT" | nc -u 172.17.113.72 7331
Se após a execução de comandos no console, a resposta "RECONHECIDO: olá" for exibida, as alterações foram bem-sucedidas.
Iniciamos o servidor localmente
Você pode iterar as alterações para um desenvolvimento conveniente sem o Kubernetes, usando apenas o SDK do Agones. Enquanto o servidor do jogo está em execução, o SDK se comunica via TCP com um pequeno servidor gRPC que o Agones executa em um contêiner no mesmo espaço para nome. Esse contêiner no Kubernetes é chamado de sidecar. Portanto, para o desenvolvimento local, você deve iniciar o processo SDK. Para fazer isso, você precisa executar o arquivo de origem com o parâmetro -local
, que ativa o modo 'modo local'. Esse modo indica que o processo está no modo passivo e não se conecta a lugar nenhum, basta exibir os logs no console para que você possa ver o que o SDK faz enquanto o servidor do jogo está em execução.
Você pode fazer o download do servidor agonessdk mais recente nos releases do repositório oficial do projeto. Por padrão, após iniciar o servidor SDK, é criado um espaço em branco de configuração do GameServer, usado para solicitações do SDK GameServer () e WatchGameServer (). Na inicialização, você pode especificar seu próprio arquivo de configuração no formato yaml ou json. Para isso, é necessário o parâmetro -file
ou sua versão abreviada -f
junto com o 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"}
Para continuar ...