Kubernetes打造的开源专案Agones,专门用来架设游戏伺服器代管平台
Agones 是什么?用Kubernetes 打造开源游戏伺服器代管平台(一)
在分散式系统的世界中,如何维运一款多人的线上游戏伺服器是相当艰难的。多家游戏厂商已经开发了多种私人解决方案,而窜起的开源软体Kubernetes是用来处理横跨云端、地端系统的最佳方法,所以Google释出了一款运用Kubernetes打造的开源专案Agones,专门用来架设游戏伺服器代管平台。
透过Agones,使用者可以搭建一个管理众多游戏伺服器的平台,目前此专案与游戏公司Ubisoft合作开发。
游戏伺服器的性质
第一人称射击游戏、大型多人线上游戏、多人线上战斗竞技场游戏都需要一个可靠的伺服器(一个完整的游戏模拟环境)来支撑所有的玩家体验。这些伺服器通常位于网路的某个地方,并让玩家与玩家之间能顺利地同步游戏模拟状态,并充当中间人以防止玩家有作弊的情形发生。
游戏伺服器属于stateful 的应用程式,储存整个模拟游戏在伺服器的记忆体中。除了游戏伺服器之外,一般的stateful 应用程式(例如资料库) 的state 一储存就是数月甚至数年,相对来说游戏伺服器的数分钟、数小时并没有储存那么久。
因为负载平衡器会增加延迟,而快节奏的游戏对于连线品质要求非常高,所以管理游戏系统时,必须让玩家直接连接至游戏伺服器,而不能仰赖负载平衡器。把所有的玩家都连接至同一台机器会比较容易,因为同一时间都连接着同一个伺服器的游戏模拟状态。
1.配对系统通常根据玩家的技巧和等级进行配对,并进入游戏2.配对完成后,配对系统会向管理系统请求一个可以运作游戏程序的空间3.管理系统会开一个新的游戏空间并让玩家连进去,而这个游戏空间将会运转在丛集里面的其中一台机器。4.管理系统会决定该process位于的IP以及port并将此资料回传给配对系统。5.接着,配对系统会把所接收到的IP和port回传给玩家6.玩家透过IP和port可以直接连接至游戏运转的process,并与其他玩家连线。
运用Kubernetes 以及开源软体打造Agones
Agones运用Kubernetes丛集可以建构客制Kubernetes Controller、以及对应于此客制化Controller的客制化资源:GameServer,用来取代上面提及的丛集管理和伺服器扩展。
有了Agnoes,就可以使用Kubernetes 工具及API,在Kubernetes 丛集上建置、执行、管理并扩展游戏伺服器。此架构能够让配对系统透过Kubernetes API,取得配对到的游戏伺服器。
使用Kubernetes来开发Agones有许多优势,Agones可以让使用者在任何情境轻松地部署游戏。例如:利用minikube直接在开发者的机器上搭起丛集、多人开发、自建机房、混合云以及纯云端( Google Kubernetes Engine .)
另外,Kubernetes 可以简化维运流程。毕竟多人游戏不可能只有游戏伺服器,还包括客服、帐户管理、 商城等。以Kubernetes 作为平台,让开发团队不需要同时理解游戏以及客服系统,因为可以同时运行多套系统。
Agones 并不是只透过一群人独立开发,Agones 的团队是藉由Kubernetes 社群的数百位开发者打造出来的Kubernetes 生态系来进行开发。
开始使用Agones。
打造Agones、多个AAA多人游戏并拥有游戏产业最多经验之一的公司,Ubisoft:
“我们的目标是为玩家持续打造一个高品质、完美无缺的游戏体验。 Agones 提供一个更有弹性、更好控制的游戏伺服器让我们的使用者可以部署。这次的合作结合了Google Cloud 对于部署Kubernetes 的专业知识以及我们对于游戏开发的经验与理解。”
— Carl Dionne, Development Director, Online Technology Group, Ubisoft.
开始使用Agones
可以使用Kubernetes原生的指令kubectl 以及API,因为Agones完完全全是用Kubernetes打造的。
创建一个游戏伺服器
在Kubernetes 上部署一个游戏伺服器跟一般应用程式部署相同。举例来说,游戏伺服器就建置在一个映像档中:
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"]
藉由安装Agones,使用者可以在Kubernetes 中新增一个“GameServer” resource,包含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 与port 给process,好让使用者能透过这些资讯连线至伺服器。Agones 甚至透过整合在伺服器的SDK,可以追踪到GameServer 的生命周期。
使用者依然可以透过kubectl 以及Kubernetes API 来取得GameServer 的详细资讯,包括State、玩家连线的IP 位址以及Port。
$ 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
Agones 的下一步
Agones还在早起开发阶段,但是我们相当看好它。已经着手在进行新功能game server Fleets、v0.2版本释出、支援Windows系统规划、伺服器数据统计与显示、自动扩展node等。
使用者可以抢先使用Agones v0.1的alpha版本,直接安装在任一Kubernetes丛集如GKE或是minikube。