在分布式系统的世界中,为在线多人游戏托管和扩展专用游戏服务器会遇到一些独特的挑战。虽然游戏开发行业创造了无数专有解决方案,但 Kubernetes 已成为事实上的开源与通用标准,能够跨多个云和裸机服务器构建复杂的工作负载和分布式系统。所以今天我们很高兴地宣布 Agones(在希腊语中表示“竞赛”或“聚会”)这样一个开源项目,它可以使用 Kubernetes 来托管和扩展专用游戏服务器。

Agones 项目正在是 Google 与互动游戏巨头 Ubisoft 合作开发,旨在设计一个开箱即用的、开源的、专用的游戏服务器托管和扩展项目,并且构建在 Kubernetes 之上,不仅可以提供您所需要的灵活性,还可以根据您的需求进行多人游戏的定制。


专用游戏服务器的本质
当前市面上大部分的游戏服务器的编排缩放通常由游戏开发商的专有软件完成,而市场上大多数的常见编排系统并不是针对游戏这类工作负载构建的。许多流行的快节奏在线多人游戏,例如竞技 FPS、MMO 和 MOBA,都需要一个专用的游戏服务器——一个完整的游戏世界模拟——供玩家进行连接并在其中游玩。这个专用的游戏服务器通常托管在云端,以实现玩家之间的游戏状态同步,同时该游戏服务器也承担着每个玩游戏的客户端仲裁者角色,这也有助于防止玩家的作弊和保证公平性。

专用游戏服务器通常是在内存中保留游戏玩家状态的有状态应用程序。 但与其他有状态应用程序(例如数据库)不同,通常它们的生命周期很短。专用游戏服务器不会运行数月或数年,而只是根据游戏类型不同运行几分钟或几小时。

专用游戏服务器一般是客户端直接连接到正在运行的专有游戏服务器IP与端口,而不会依赖于负载均衡器。这些快节奏的游戏对延迟非常敏感,负载均衡器只会增加更多延迟。此外,由于连接到单个游戏服务器的所有玩家同时共享内存中的所有游戏状态,因此将它们连接到同一台机器会更容易。

以下是典型的专用游戏服务器设置示例:

1. 玩家连接到游戏匹配服务,该服务将他们(通常按技能水平)分组以进行比赛。

2. 一旦玩家被匹配到一组游戏会话中,匹配匹配服务就会通知游戏服管理器分配一组机器, 并提供一个专用的游戏服务器进程承载游戏对话

3. 游戏服管理器创建一个专用游戏服务器 (IP+Port),该进程会在集群中的一台机器上运行。

4. 游戏服管理器确定运行专用游戏服务器的 IP 地址和端口,并将其传回给匹配器服务。

5. 服务将 IP 和端口传回给玩家的客户端。

6. 玩家直接连接到专用游戏服务器进程并进行多人游戏对战。

在 Kubernetes 和开源上构建 Agones
Agones 将我们上面讨论的游戏服集群管理和游戏服务器扩展解决方案替换为 Kubernetes集群,该集群包括一个自定义的 Kubernetes Controler (Agones Controller) 和匹配的 GameServer 自定义资源定义 (CRD)。

借助 Agones,Kubernetes 可以获得使用标准 Kubernetes 工具和 API 在 Kubernetes 集群中创建、运行、管理和扩展专用游戏服务器进程的原生能力。该模型还允许任何游戏玩家匹配工具通过 Kubernetes API 直接与 Agones 进行交互,以提供专用的游戏服务器。

构建在 Kubernetes 之上的 Agones 也提供了许多其他的优势:它允许您在任何的环境运行您的游戏工作负载,这是最有意义的。例如,通过 minikube 等平台在游戏开发者的机器上、或是用于小组开发的工作室集群、私有化部署的机器以及混合云或全云环境(包括 Google Kubernetes Engine)。

Kubernetes 还能够简化操作。多人游戏绝不仅仅是专用的游戏服务器——总会有相关的支持服务、账户管理、道理管理、交易市场等。将 Kubernetes 作为一个单一平台,可以同时运行您的支持服务和专用游戏服务器,可以大幅减少所需的操作知识和支持开发团队的复杂性。

最后,Agones 背后的人并不仅仅是一组孤立构建游戏服务器平台的人。Agones 和使用它的开发人员利用了数百名 Kubernetes 贡献者的工作并围绕 Kubernetes 平台构建了多样化的工具生态系统。

作为 Agones 项目的创始贡献者,Ubisoft 带来了他们在为全球玩家运行顶级 AAA 多人游戏方面的深厚知识和专业知识。

“我们的目标是不断寻找新方法,为我们的玩家提供最高质量、最无缝的服务,以便他们能够专注于自己的游戏。Agones 为我们提供了在最佳数据中心中运行专用游戏服务器的灵活性,并让游戏开发和运维的团队更好地控制他们所需的资源,从而提供更好的帮助。这种合作使得 Google Cloud 在大规模部署 Kubernetes 方面的专业知识与我们对游戏开发流水线和技术的深入了解相结合成为可能。”

—— Carl Dionne 育碧在线技术事业部开发总监

开始使用 Agones
由于 Agones 是使用 Kubernetes 的原生扩展构建的,因此您可以使用所有标准的 Kubernetes 工具与之交互,包括 kubectl 和 Kubernetes API。

创建游戏服务器
编写要部署在 Kubernetes 上的专用游戏服务器类似于开发更传统的 Kubernetes 工作负载。例如,专用游戏服务器可以简单地构建到容器镜像中,如下所示:
Dockerfile

01FROM debian:stretch

02RUN useradd -m server

03COPY ./bin/game-server /home/server/game-server

04RUN chown -R server /home/server &&

05    chmod o+x /home/server/game-server

06USER server

07ENTRYPOINT ["/home/server/game-server"]


通过将 Agones 安装到 Kubernetes,您可以将 GameServer 资源添加到 Kubernetes,以及 Kubernetes Pod 的所有配置选项。

gameserver.yaml


01apiVersion: "stable.agon.io/v1alpha1"

02kind: GameServer

03metadata:

04  name: my-game-server

05spec:

06  containerPort: 7654

07  # Pod template

08  template:

09    spec:

10      containers:

11      - name: my-game-server-container

12        image: gcr.io/agon-images/my-game-server:0.1

然后您可以通过 kubectl 命令或通过 Kubernetes API 应用它:

01$ kubectl apply -f gamesever.yaml

02gameserver "my-game-server" created

Agones 管理启动 yaml 中定义的游戏服务器进程,为其分配一个公共端口,并检索 IP 和端口以便玩家可以连接到它。它还可以通过集成到游戏服务器进程代码中的 SDK 来跟踪配置 GameServer 的生命周期与健康状况。 

您可以通过 kubectl 或 Kubernetes API 查询 Kubernetes 以获取有关 GameServer 的详细信息,包括其状态 State,以及玩家游戏客户端可以连接到的 IP 和端口:

01$ kubectl describe gameserver my-game-server

02Name:         my-game-server

03Namespace:    default

04Labels:       

05Annotations:  

06API Version:  stable.agones.dev/v1alpha1

07Kind:         GameServer

08Metadata:

09  Cluster Name:

10  Creation Timestamp:  2018-02-09T05:02:18Z

11  Finalizers:

12    stable.agones.dev

13  Generation:        0

14  Initializers:      

15  Resource Version:  13422

16  Self Link:         /apis/stable.agones.dev/v1alpha1/namespaces/default/gameservers/my-game-server

17  UID:               6760e87c-0d56-11e8-8f17-0800273d63f2

18Spec:

19  Port Policy:     dynamic

20  Container:       my-game-server-container

21  Container Port:  7654

22  Health:

23    Failure Threshold:      3

24    Initial Delay Seconds:  5

25    Period Seconds:         5

26  Host Port:                7884

27  Protocol:                 UDP

28  Template:

29    Metadata:

30      Creation Timestamp:  

31    Spec:

32      Containers:

33        Image:  gcr.io/agones-images/my-game-server:0.1

34        Name:   my-game-server-container

35        Resources:

36Status:

37  Address:    192.168.99.100

38  Node Name:  agones

39  Port:       7884

40  State:      Ready

41Events:

42  Type    Reason    Age   From                   Message

43  ----    ------    ----  ----                   -------

44  Normal  PortAllocation  3s    gameserver-controller  Port allocated

45  Normal  Creating        3s    gameserver-controller  Pod my-game-server-q98sz created

46  Normal  Starting        3s    gameserver-controller  Synced

47  Normal  Ready           1s    gameserver-controller  Address and Port populated

相关推荐