孤单(来自其他希腊语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-V或VirtualBox )。
要安装群集和Agone,必须运行以下命令:
minikube profile agones
最后一条命令通过Kubernetes API下载用于创建自定义资源定义(CRD)的Agones配置文件。
启动GameServer
现在,您可以使用示例中的现成的测试服务器来启动集群中的UDP服务器,该服务器将仅响应发送给它的请求:
要确认服务器是否正常运行,可以使用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"}
待续...