Agones:一款基于Kubernetes的开源游戏服务器

Agones:一款基于Kubernetes的开源游戏服务器_第1张图片


在分布式系统领域,支持在线弹性扩展,实时多人专属游戏服务器意味着特殊的挑战。随着游戏专业人士创造的各种特殊方案,Kubernetes被整合成跨云和物理机,支持复杂工作流的开源分布式标准。今天,我们很高兴发布开源Agones[1](希腊语“contest”或者“gathering”的意思)项目,支持弹性扩展实时多人专属游戏平台。
按照目前跟游戏业界巨头Ubisoft的合作进展,Agones被定位为自驱动(batteries-included),开源,基于Kubernetes的专属弹性游戏平台项目,用户可以在其上按需灵活调整自己的游戏主机配置。

专属游戏服务器的特性

640?wxfrom=5&wx_lazy=1


游戏行业一般通过软件调度编排实现游戏服务弹性扩展,而系统级的弹性则很少被考虑,实际上这并不奇怪。许多流行在线多人游戏都需要专属服务器,例如competitive FPSs、MMOs和MOBAs,它们都需要给玩家共享同一个游戏世界的感受。这种专属服务器一般都部署在互联网上,来实时同步玩家之间的状态,同时也需要对每个玩家状态进行裁决,保证大家不会作弊。
专属游戏服务器是在内存中保留游戏信息的有状态应用。但是和其它有状态应用(如数据库)不同,他们生命周期很短,一般只需保留几分钟或者几个小时。专属游服也需要直连到运行服务进程的IP和端口,而不是通过负载均衡器,因此这类应用对网络延迟很敏感(复杂均衡器只会增加延迟)。另外所有连到同一台服务器玩家会共享内存状态,因此将他们连到同一台设备最简单。下图是一个典型架构,具体过程如下:

Agones:一款基于Kubernetes的开源游戏服务器_第2张图片


  1. 玩家们连接到某种匹配服务,匹配服务(一般通过玩家等级)将玩家匹配分组。

  2. 一旦玩家匹配成功,匹配服务通知游戏管理器在服务器集群中提供一个专属游戏进程。

  3. 游戏管理器在集群中某台机器上创建专属游戏服务。

  4. 游戏管理器给专属游戏服务分配IP地址和服务端口,并返回匹配器。

  5. 匹配器将返回的IP地址和端口回传给玩家

  6. 玩家们直连到专属服务进程开始游戏。

基于Kubernetes构建开源Agones

640


Agones用Kubernetes集群替代了图一架构图中的集群管理和弹性扩展功能,其中包括一个客制化Kubernetes控制器和客制化的游戏服务资源定义匹配器。如图二所示:

Agones:一款基于Kubernetes的开源游戏服务器_第3张图片


Agones通过调用标准Kubernetes功能和API提供的内置功能,可以在Kubernetes集群中提供创建、运行、管理和弹性扩展专属服务进程的能力。这种模式也允许匹配器直接通过Kubernetes API和Agones沟通生成专属游戏服务。
在Kubernetes之上构建Agones还有其它好处:可以很容易在任何地方,例如开发者设备,通过像minikutbe、in-studi集群,on-premises设备或者云环境等平台直接运行游戏负载。Kubernetes也可以简化操作。多人游戏除了专属服务器外,还有后勤服务、账户管理、装备、市场等其他进程支撑。用Kubernetes作为单一平台可以动态运行支撑进程,减少开发团队面对的游戏层面复杂逻辑关系。
最后一点,Agones后台并不只是孤立的游戏开发,其后台可以使用Kubernetes贡献者和大量成熟工具带来的生态系统。Ubisoft在Agones项目中资助了贡献者,将他们顶尖的知识带到了AAA级游戏玩家面前。我们的目的就是尽所能提供提供高质量无缝服务,让玩家只需专注于游戏中。Agones帮助我们在数据中心运行专属游戏服务的灵活性,而且给开发团队提供了更多资源可控性。这种合作为整合Google云平台专业性和我们队游戏行业的专业理解提供了可能性。
——Carl Dionne,开发总监,Online Technology Group,Ubisoft开始

640


因为Agones是基于Kubernetes扩展开发的,因此可以使用所有标准Kubernetes工具,包括kubectl和Kubernetes API。

创建游戏服务器

640


使用如下命令创建专属游戏服务:
Dockerfile
FROM debian:stretch
RUN useradd -m server
COPY ./bin/game-server /home/server/game-server
RUN chown -R server /home/server && \
   chmod o+x /home/server/game-server
USER server
ENTRYPOINT ["/home/server/game-server"]

通过变价Kubernetes Pod配置选线提价游戏服务资源:
gameserver.yaml
apiVersion: "stable.agon.io/v1alpha1"
kind: GameServer
metadata:
 name: my-game-server
spec:
 containerPort: 7654
 # Pod template
 template:
   spec:
     containers:
     - name: my-game-server-container
       image: gcr.io/agon-images/my-game-server:0.1

通过kubectl命令行或者Kubernetes API提交以上定义:
$ kubectl apply -f gamesever.yaml
gameserver "my-game-server" created

Agones会按照yaml文件中配置启动游戏服务器,分配一个公有端口,将IP和端口号发回玩家端进行直连。通过嵌入游戏服务器内的SDK代码监控游戏服务器生命周期和状态。可以通过kubectl和Kubernetes API向游戏服务器请求获得各种信息,包括状态、IP和端口等。
$ kubectl describe gameserver my-game-server
Name:         my-game-server
Namespace:    default
Labels:      
Annotations:  
API Version:  stable.agones.dev/v1alpha1
Kind:         GameServer
Metadata:
 Cluster Name:
 Creation Timestamp:  2018-02-09T05:02:18Z
 Finalizers:
   stable.agones.dev
 Generation:        0
 Initializers:      
 Resource Version:  13422
 Self Link:         /apis/stable.agones.dev/v1alpha1/namespaces/default/gameservers/my-game-server
 UID:               6760e87c-0d56-11e8-8f17-0800273d63f2
Spec:
 Port Policy:     dynamic
 Container:       my-game-server-container
 Container Port:  7654
 Health:
   Failure Threshold:      3
   Initial Delay Seconds:  5
   Period Seconds:         5
 Host Port:                7884
 Protocol:                 UDP
 Template:
   Metadata:
     Creation Timestamp:  
   Spec:
     Containers:
       Image:  gcr.io/agones-images/my-game-server:0.1
       Name:   my-game-server-container
       Resources:
Status:
 Address:    192.168.99.100
 Node Name:  agones
 Port:       7884
 State:      Ready
Events:
 Type    Reason    Age   From                   Message
 ----    ------    ----  ----                   -------
 Normal  PortAllocation  3s    gameserver-controller  Port allocated
 Normal  Creating        3s    gameserver-controller  Pod my-game-server-q98sz created
 Normal  Starting        3s    gameserver-controller  Synced
 Normal  Ready           1s    gameserver-controller  Address and Port populated

下一步

640


Agones还是很初级阶段,但是我们对它的未来很期待。我们在其上已经开始了不少功能,例如游戏服务器集群[2],包括支持Windows的0.2版本[3]路标支持,游戏服务器状态搜集和显示,节点自动扩展等。
如果想尝试Agones 0.1 alpha版本,可以直接在Kubernetes集群上安装,例如:GKE or minikube;我们也有一个很好的安装文档[4]可以参考。
相关链接:
  1. https://github.com/GoogleCloudPlatform/agones

  2. https://github.com/GoogleCloudPlatform/agones/issues/70

  3. https://github.com/GoogleCloudPlatform/agones/milestone/2

  4. https://github.com/GoogleCloudPlatform/agones/blob/master/docs/installing_agones.md


原文链接:https://cloudplatform.googleblog.com/2018/03/introducing-Agones-open-source-multiplayer-dedicated-game-server-hosting-built-on-Kubernetes.html
Kubernetes 实战培训

640?

本次培训内容包括:Docker容器的原理与基本操作;容器网络与存储解析;Kubernetes的架构与设计理念详解;Kubernetes的资源对象使用说明;Kubernetes 中的开放接口CRI、CNI、CSI解析;Kubernetes监控、网络、日志管理;容器应用的开发流程详解等,点击识别下方二维码加微信好友了解 具体培训内容

Agones:一款基于Kubernetes的开源游戏服务器_第4张图片


3月23日开始上课,还剩最后5个名额,点击阅读原文链接即可报名。

你可能感兴趣的:(Agones:一款基于Kubernetes的开源游戏服务器)