独自创建一个多用户游戏服务器。 建筑与安装

孤单(来自其他希腊语agōn-“竞争”)使您可以使用带有自动缩放功能的Kubernetes部署游戏服务器集群。 这个开源项目创建于2018年,已经获得2500颗星,在Google I / O 2019上发布,而在哈布雷(Habré)上,还没有提到它。 本主题描述了对体系结构的简要介绍,以及在本地计算机上启动测试服务器的说明。 如果有兴趣,欢迎来到kat,开始吧!


过去的标志

项目说明


Agones是自定义资源( Kubernetes API扩展 )。


该项目实际上需要更多的注意力,因为它允许您通过Agones API通过配置yaml文件运行单个游戏服务器(GameServer)或服务器的整个“舰队”(Fleets)。 依次,每个服务器都会发出有关其生命周期(GameServer生命周期)的警报,描述当前状态(运行状况检查,连接信息)。 集群中的服务器具有自动扩展功能(Fleet Autoscaling),该功能与Kubernetes的基本功能集成在一起。 此外,在仪表板上还可以使用Prometheus,Grafana或Stackdriver输出统计信息,并通过OpenCensus导出指标,从而可以添加自己的导出器。 Stackdriver中的资讯主页范例:


图片


建筑,基本要素


Agones本身以Kubernetes为基础承担启动,自动扩展和托管游戏服务器的任务。 这使您可以专注于多人游戏服务器本身的开发,而不是开发其基础结构和进一步的支持。 您可以使用可以在linux上运行的任何游戏服务器,并且可以用任何编程语言编写。


Agones Kubernetes API分为三个主要软件包,每个软件包均包含资源:agones.dev(GameServer,GameServerSet,Fleet),allocation.agones.dev(GameServerAllocation),autoscaling.agones.dev(FleetAutoscaler)。 像其他Kubernetes资源一样,yaml文件用于运行它们。


每种资源的简要说明:


  • GameServer-创建一个特定的模板,该模板允许您使用常规Pod参数以及一些附加功能,例如游戏服务器的hostPort和containerPort。 Agones SDK提供了一个可选的sidecar容器,GameServer将与之持续通信
  • GameServerSet-多个GameServer的数据结构,非常类似于Depoyment和ReplicaSet之间的关系
  • Fleet-创建多个现成的GameServer,使用GameServerAllocation进行资源分配
  • GameServerAllocation-向Fleet请求GameServer的使用,并标记玩家可以使用它,因此不会自动删除GameServer
  • FleetAutoscaler-自动扩展或减少Fleet中的服务器数量

该图( 从此处开始 )显示了GameServer资源的生命周期:



紫色箭头表示Agones SDK,红色-用户API,蓝色-游戏服务器控制器,黄色-应用程序控制器。


安装方式


在本节及后续部分中,将使用在官方网站上有说明的团队,并添加一些内容。 我们建议使用Kubernetes版本1.12(由开发人员测试)。 为了在本地计算机上进行测试,您可以使用minikube ,这将需要kubectl和操作系统支持的管理程序( Hyper-VVirtualBox )。


要安装群集和Agone,必须运行以下命令:


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 

最后一条命令通过Kubernetes API下载用于创建自定义资源定义(CRD)的Agones配置文件。


启动GameServer


现在,您可以使用示例中的现成的测试服务器来启动集群中的UDP服务器,该服务器将仅响应发送给它的请求:


 # 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 

要确认服务器是否正常运行,可以使用NetCat,对于linux,该程序通常是系统随附的;对于Windows,则需要下载它,例如在此处 。 必须使用-u参数(UDP请求)启动NetCat,该参数指示minikube地址(最好从minikube ip命令复制地址)和活动的GameServer端口:


 echo "hello" | nc -u $(minikube ip) 7331 

如果在控制台中运行命令后,出现响应“ ACK:hello”,则表明服务器正在运行,则可以通过以下命令将其关闭,该命令将初始化:


 echo "EXIT" | nc -u $(minikube ip) 7331 

服务器状态由kubectl describe gameserver检查,应更改为Shutdown。


对GameServer进行更改


使用前面的示例,我们将更改服务器响应。 首先,复制项目存储库:


 git clone git@github.com:googleforgames/agones.git 

在文件agones / examples / simple-udp / main.go中,将第159行更改为


 respond(conn, sender, "ACKNOWLEDGED: "+txt+"\n") 

在项目根文件夹中,运行以下命令以创建docker映像并将其保存在minikube中。 对于Windows,您首先需要运行minikube docker-env | Invoke-Expression minikube docker-env | Invoke-Expression ,适用于Linux eval $(minikube docker-env) 。 这将允许您直接在minikube中创建docker映像。
创建一个docker镜像:


 docker build -t agones-go:modified -f .\examples\simple-udp\Dockerfile . 

该命令可能需要一些时间,因为整个项目存储库都将复制到映像。 可以通过在目录中仅保留sdks文件夹,main.go和Dockerfile来避免这种情况。


接下来,在示例\ simple-udp \ gameserver.yaml中,将第28行更改为image: agones-go:modified并创建一个新的GameServer:


 kubectl create -f .\examples\simple-udp\gameserver.yaml 

检查更改并关闭服务器:


 echo "hello" | nc -u 172.17.113.72 7331 echo "EXIT" | nc -u 172.17.113.72 7331 

如果在控制台中运行命令之后,出现响应“ ACKNOWLEDGED:hello”,则说明更改成功。


我们在本地启动服务器


您可以仅使用Agones SDK来迭代更改,以便在不使用Kubernetes的情况下进行方便的开发。 当游戏服务器运行时,SDK通过TCP与小型gRPC服务器进行通信,而Agones在同一名称空间下的容器中运行。 Kubernetes中的这种容器称为Sidecar。 因此,对于本地开发,必须启动SDK流程。 为此,您需要使用-local参数运行其源文件,该参数将打开“本地模式”模式。 此模式告诉进程处于被动模式,并且无法在任何地方连接,只需在控制台中显示日志即可在游戏服务器运行时查看SDK的功能。


您可以官方项目存储库的发行版中下载最新的agonessdk服务器。 默认情况下,启动SDK服务器后,将创建GameServer配置空白,用于GameServer()和WatchGameServer()SDK请求。 在启动时,您可以以yaml或json格式指定自己的配置文件,为此,您需要-file参数或其缩写-f以及-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"} 

待续...

Source: https://habr.com/ru/post/zh-CN469381/


All Articles