+86 189 8218 1436Mon. - Fri. 10:00-22:00

Kubernetes打造的开源专案Agones,专门用来架设游戏伺服器代管平台

Kubernetes打造的开源专案Agones,专门用来架设游戏伺服器代管平台
Posted in: GCP谷歌云服务器代维护, Google谷歌GCP云服务器代维护服务, Google谷歌GCP技术支持服务 Started by

Kubernetes打造的开源专案Agones,专门用来架设游戏伺服器代管平台

Agones 是什么?用Kubernetes 打造开源游戏伺服器代管平台(一)

在分散式系统的世界中,如何维运一款多人的线上游戏伺服器是相当艰难的。多家游戏厂商已经开发了多种私人解决方案,而窜起的开源软体Kubernetes是用来处理横跨云端、地端系统的最佳方法,所以Google释出了一款运用Kubernetes打造的开源专案Agones,专门用来架设游戏伺服器代管平台。

透过Agones,使用者可以搭建一个管理众多游戏伺服器的平台,目前此专案与游戏公司Ubisoft合作开发。

游戏伺服器的性质

第一人称射击游戏大型多人线上游戏多人线上战斗竞技场游戏都需要一个可靠的伺服器(一个完整的游戏模拟环境)来支撑所有的玩家体验。这些伺服器通常位于网路的某个地方,并让玩家与玩家之间能顺利地同步游戏模拟状态,并充当中间人以防止玩家有作弊的情形发生。

游戏伺服器属于stateful 的应用程式,储存整个模拟游戏在伺服器的记忆体中。除了游戏伺服器之外,一般的stateful 应用程式(例如资料库) 的state 一储存就是数月甚至数年,相对来说游戏伺服器的数分钟、数小时并没有储存那么久。

因为负载平衡器会增加延迟,而快节奏的游戏对于连线品质要求非常高,所以管理游戏系统时,必须让玩家直接连接至游戏伺服器,而不能仰赖负载平衡器。把所有的玩家都连接至同一台机器会比较容易,因为同一时间都连接着同一个伺服器的游戏模拟状态。

以下是典型的游戏伺服器架构图:
1-31

1.配对系统通常根据玩家的技巧和等级进行配对,并进入游戏2.配对完成后,配对系统会向管理系统请求一个可以运作游戏程序的空间3.管理系统会开一个新的游戏空间并让玩家连进去,而这个游戏空间将会运转在丛集里面的其中一台机器。4.管理系统会决定该process位于的IP以及port并将此资料回传给配对系统。5.接着,配对系统会把所接收到的IP和port回传给玩家6.玩家透过IP和port可以直接连接至游戏运转的process,并与其他玩家连线。

运用Kubernetes 以及开源软体打造Agones

Agones运用Kubernetes丛集可以建构客制Kubernetes Controller、以及对应于此客制化Controller的客制化资源:GameServer,用来取代上面提及的丛集管理和伺服器扩展。

2-22

有了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 Fleetsv0.2版本释出、支援Windows系统规划、伺服器数据统计与显示、自动扩展node等。

使用者可以抢先使用Agones v0.1的alpha版本,直接安装在任一Kubernetes丛集如GKE或是minikube