使用 Azure Kubernetes 服务 (AKS) 实现同步多人游戏

您可以选择使用托管 Azure Kubernetes 服务 (AKS),在 Azure 上使用 Kubernetes 协调程序管理容器化专用游戏服务器。

本文将描述 GitHub 上的此示例中使用的体系结构。 请注意,此参考体系结构中的代码只是一个指南示例,在用于生产环境之前,可能还有需要优化的地方。

体系结构关系图

S使用 Azure Kubernetes 服务实现同步多人游戏

相关服务

体系结构注意事项

自定义资源定义 (CRD)

在此参考体系结构中,通过使用自定义资源定义 (CRD) 对象扩展了 Kubernetes。 这些对象将用于表示专用游戏服务器实体。

具体来说,有 2 个核心实体,分别由 2 个不同的 CRD 表示:

  • DedicatedGameServer:表示多人游戏服务器本身。 每个 DedicatedGameServer 都有一个单独对应的子 Pod,它将使用游戏服务器可执行文件运行容器映像。

  • DedicatedGameServerCollection:表示将运行相同 Pod 模板的相关 DedicatedGameServers 集合,并且可以在集合内进行缩放(即添加或删除更多服务器实例)。

    属于同一 DedicatedGameServerCollection 成员的 DedicatedGameServer 在执行环境方面有很多相似之处,例如,都可以启动相同的多人游戏地图或相同类型的游戏。 因此,您可以在游戏中针对“夺旗”模式创建一个集合,针对“征服”模式创建另一个集合。 或者,针对地图“X”上的玩家创建一个集合,针对地图“Y”上的玩家创建另一个集合。

组件

此参考体系结构包含两个主要组件,它们都是作为单实例 Kubernetes 部署创建的:

  1. API 服务器组件

    这是我们项目的 API 服务器(与 Kubernetes API 服务器无关)。 它包含两个子组件:

    1. API 服务器子组件

      它提供可由游戏服务器或外部安排系统(如大厅服务或 Matchmaker)调用的 REST API。

    2. Webhook 子组件

      一个 Kubernetes 准入 Webhook,可验证和修改关于我们对 Kubernetes API 服务器的 CRD 的请求。

  2. 控制器

    Kubernetes 控制器是表现为主动协调进程的对象。 简而言之,这意味着控制器会监控某个(或某组)对象,查看对象是否达到理想状态以及其实际状态。 它会主动比较这两种状态,并尽全力使实际状态接近理想状态。

    此项目包含一组控制器,每个控制器都会执行协调特定对象集的任务。 所有控制器都基于官方 Kubernetes 示例控制器此处的相应文档构建而成。 此项目中的控制器是为了协调我们的自定义资源定义 (CRD) 对象,即 DedicatedGameServerCollections 和 DedicatedGameServers。

    1. DedicatedGameServerCollectionController

      它负责处理 DedicatedGameServerCollection 的 DedicatedGameServer 对象。

    2. DedicatedGameServerController

      它负责处理 DedicatedGameServer 对象的 Pod。

    3. DGSActivePlayersAutoScalerController

      您可以选择是否启动它(通过控制器上的命令行参数),它负责每个选择加入 Pod 自动缩放机制的 DedicatedGameServerCollection 上的 Pod 自动缩放。

这些组件是它们自己的命名空间的一部分(示例中名为 dgs-system),与 DedicatedGameServers 的命名空间分离。 在大型群集场景中,每个 DedicatedGameServerCollections 列表可以有一个命名空间。

公共 IP

游戏客户端应该能够直接连接到专用游戏服务器,因此所有节点都应该有一个公共 IP。 Azure Kubernetes 服务默认不提供公共 IP,但您可以使用此 GitHub 项目来启用它。

部署模板

按照这些说明创建 Azure Kubernetes 群集。

安全注意事项

所有 API 方法都通过访问代码进行保护,显示为字符串形式,并保存在名为 apiaccesscode 的 Kubernetes 密钥中。 这是在项目安装过程中创建的,应传递到所有方法调用代码 GET 参数中。 默认情况下,唯一不要求身份验证的方法是 /running 方法。 但是,可以在 API 服务器进程命令行参数中更改方法。

优化注意事项

对于较小的群集,您可以使用适用于所有节点的单个 Pod(包含 API 服务器子组件、Webhook 子组件和控制器的 Pod)来实现简化。 按照设计,在 Kubernetes 群集中,每个 Pod 可以与所有其他节点中的其他 Pod 对话。

S使用带单个 Pod 管理组的 AKS 实现服务器托管

其他资源和示例

官方 Kubernetes 文档

定价

如果您没有 Azure 订阅,可以创建免费帐户,开始使用 12 个月的免费服务。 除非您超出这些服务的使用限制,否则无需为 Azure 免费帐户中包含的这些免费服务付费。 了解如何通过 Azure 门户使用情况文件查看服务使用情况。

您需要承担运行这些参考体系结构时所使用的 Azure 服务的费用。 总金额将因使用情况而异。 请参阅参考体系结构中使用的每项服务的定价网页:

您还可以使用 Azure 定价计算器,以配置和估算您计划使用的 Azure 服务的成本。