容器在 Amazon 中的运作方式 GameLift - Amazon GameLift

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

容器在 Amazon 中的运作方式 GameLift

本文档适用于公开预览版中的一项功能。本文档随时可能更改。

Amazon GameLift 容器队列旨在让您灵活部署和扩展容器化应用程序。它使用亚马逊弹性容器服务 (Amazon ECS) Service 来管理您的亚马逊 GameLift 舰队的任务部署和执行。本主题描述了在 Amazon GameLift 托管队列上运行容器的基本结构元素,说明了常见架构,并概述了一些核心概念。

集装箱船队组件

实例集

容器队列是运行您的容器化游戏服务器的 Amazon EC2 实例的集合 GameLift,由 Amazon 管理。创建队列时,您可以配置如何将容器架构和游戏服务器软件部署到每个队列实例。您可以将集装箱舰队部署到单个 AWS 区域 或多个地理位置。您可以使用 Amazon GameLift 手动或自动扩展工具来扩展容器舰队的容量,以托管游戏会话和玩家。

实例

Amazon EC2 实例是为游戏托管提供计算容量的虚拟服务器。借助 Amazon GameLift,您可以从各种实例类型中进行选择。每种实例类型都提供不同的 CPU、内存、存储和网络容量组合。

当您创建容器队列时,Amazon 会根据您选择的实例类型和队列配置来 GameLift 部署实例。每个部署的队列实例都是相同的,并且以相同的方式运行您的容器化游戏服务器软件。队列中的实例数量决定了队列的大小和游戏托管容量。

容器组

Amazon GameLift 使用容器组的概念来描述和管理一组容器。容器组类似于容器 “任务” 或 “pod”。在每个容器组中,您可以定义容器如何共享可用 CPU 和内存资源。您还可以在容器之间设置依赖关系并管理容器组的生命周期。

容器组可以在每个队列实例之间进行复制,以优化资源使用。您可以通过设置容器组的调度策略来管理复制,如下所示:

  • 副本容器组管理运行游戏服务器应用程序和支持软件的容器。所有容器舰队都必须定义一个副本容器组。一个副本组在每个队列实例上可能有多个副本,具体取决于容器组的要求和所用实例类型的资源。副本组中的所有容器都会自动在实例中一起扩展。

  • 守护程序容器组是可选的,可用于运行后台服务或实用程序,例如用于监控。你的游戏服务器软件不直接依赖于守护程序组中的进程。守护程序容器组不会被复制——每个队列实例最多有一个守护程序组副本。这意味着守护程序组中的容器不能与副本组中的容器一起跨队列实例进行扩展。

容器队列必须有一个副本容器组,并且可以选择拥有一个守护程序组。

容器

容器是基于容器的架构中最基本的元素。它由包含软件可执行文件和依赖文件的容器镜像组成。当您定义要用于 Amazon 的容器时 GameLift,您可以配置软件在容器中的运行方式。

集装箱船队中的每个集装箱组必须有一个被指定为 “必备” 的集装箱。基本容器驱动着容器组的生命周期。如果基本容器出现故障,则整个容器组将重新启动。

容器类型包括:

  • 基本副本容器包含运行游戏服务器进程和为玩家托管游戏会话所需的一切。它包括您的游戏服务器版本(与 Amazon GameLift 服务器 SDK 集成)和相关软件。它还包括管理游戏服务器进程生命周期的 Amazon A GameLift gent。舰队的仿制集装箱组正好有一个基本的复制集装箱。

  • 非必需的副本容器(也称为 “sidecar” 容器)运行软件来支持您的游戏服务器应用程序。使用边车容器可以让你在游戏服务器旁边运行和扩展支持软件,但可以作为单独的容器进行管理。如果这种类型的容器出现故障,则只有容器本身会重新启动;容器组不会受到影响。

  • 守护程序容器运行守护程序服务来管理后台进程。守护程序容器的常见用途是运行 A mazon CloudWatch (CloudWatch) 代理来收集容器的指标、日志和跟踪。守护程序容器可以是必需的,也可以是非必需的,具体取决于容器故障何时必须导致容器组重启。

计算

计算是一种队列托管资源,已在 Amazon GameLift 服务中注册并能够与该服务进行通信。在容器队列中,计算是带有管理计算注册过程的进程的容器。在集装箱舰队的基本复制容器中,Amazon A GameLift gent 会自动将此容器注册为计算容器。

常见架构

下图说明了最简单的集装箱船队结构。在此结构中,队列中的每个实例都维护一个副本容器组的副本。容器组有一个基本容器,用于运行 Amazon A GameLift gent、游戏服务器应用程序以及用于托管游戏会话的所有支持软件。代理实现特定于队列的指令,以同时运行三个服务器进程。由于每个实例有一个副本容器组,因此每个队列实例同时运行三个服务器进程。

一个简单的容器架构示例,副本容器组中只有一个容器。

第二个示例说明了更复杂的集装箱船队设计。在此示例中,队列有一个包含多个容器的副本容器组和一个包含一个容器的守护程序容器组。队列配置在每个队列实例上放置三个副本容器组副本。守护程序容器组永远不会被复制。

中的每组副本组容器在每个实例上都有三个副本。在每个基本副本容器中,代理被指示同时运行两个服务器进程。因此,每个队列实例同时运行六个服务器进程(三个基本副本容器中各运行两个进程)。

容器架构示例,副本容器组中有多个容器,守护程序容器组中有一个容器。

核心概念

本节总结了 Amazon 如何 GameLift 实现一些基本的容器概念。有关如何使用集装箱船队的说明,请参阅本指南中的相关主题。

集装箱组包装

在开发用于部署到集装箱舰队中的容器结构时,一个共同的目标是优化对可用计算能力的使用。要实现此目标,请在不影响游戏服务器性能的情况下找到可以在舰队实例上放置的最大数量的副本容器组。

Amazon GameLift 可以帮助您做到这一点。它根据以下信息计算每个实例的最大副本组数:

  • 队列的实例类型以及可用的 CPU 和内存资源。

  • 您为副本组中的所有容器设置的 CPU 和内存要求。

    您为守护程序组中的所有容器(如果有)设置的 CPU 和内存要求。

  • 为管理每个实例上的容器和其他关键应用程序而预留的资源。

创建集装箱船队时,您可以选择使用计算得出的最大数量,也可以通过指定所需数量来覆盖计算出的数字。作为最佳实践,请对容器化游戏服务器软件进行试验,以确定准确的资源需求。使用这些数据来寻找游戏服务器性能的最佳打包策略。

游戏服务器和 Amazon GameLift 代理

在构建基本副本容器时,您需要将游戏服务器软件和 Amazon A GameLift gent 一起打包到同一个容器镜像中。这个计算代理控制容器中游戏服务器的生命周期。在每个副本容器组中,基本副本容器运行代理和所有游戏服务器进程。

Amazon A GameLift gent 执行集装箱队列运行时配置中的指令。运行时配置标识 (1) 要开始运行的可执行文件,(2) 一组可选的启动参数,以及 (3) 要同时运行的进程数。运行时配置可以包含针对多个不同可执行文件的指令。游戏服务器可执行文件必须至少有一条指令。例如,运行时配置可能指示代理维护游戏服务器可执行文件的 10 个进程以供生产使用,1 个具有特殊启动参数的相同可执行文件用于测试,1 个进程用于日志实用程序。

您可以随时修改队列的运行时配置。Amazon GameLift 代理会定期向该服务请求更新。当有更新的运行时配置可用时,代理会收到该配置并开始执行指令。操作可能包括添加或关闭服务器进程。

Amazon A GameLift gent 是计算代理的开源版本,亚马逊 GameLift 用于托管 EC2 队列。本指南提供了有关如何从源代码构建代理并将其构建到容器映像中的说明。代理处理以下任务:

服务器进程管理:

  • 根据运行时配置启动、关闭和替换服务器进程。

  • 当服务器进程未及时激活时,将其关闭。

  • 服务器进程终止 GameLift 时向 Amazon 报告。

  • 为服务器进程发出队列事件。

容器管理:

  • 按照 Amazon 的提示关闭服务器进程 GameLift。

  • 报告容器运行状况。

日志上传任务:

  • 将游戏会话日志上传到指定的 Amazon S3 存储桶。

  • 将计算代理日志上传到指定的 Amazon S3 存储桶。

扩展实例集容量

舰队容量衡量舰队在任何时候可以托管的游戏会话数量。您还可以根据舰队可以同时支持的玩家数量来衡量容量。

要增加或减少队列的托管容量,您可以添加或移除队列实例。集装箱舰队的打包策略决定了每个舰队实例上同时运行多少游戏会话。这个数字告诉你在增加或减少舰队容量时增加或减少的游戏会话(和玩家位置)的数量。

对于集装箱船队,您可以使用Amazon GameLift 提供的任何扩展方法。其中包括:

  • 通过设置特定的所需队列实例数来手动设置队列容量。

  • 通过定位所需的可用实例缓冲区来设置自动扩展(目标跟踪)。此方法会自动维护一组闲置的主机资源,以便新来的玩家可以随时快速进入游戏。随着玩家需求的增加或减少,该缓冲区的大小会不断调整。

  • 使用自定义缩放规则设置自动扩展(高级功能)。

游戏客户端/服务器连接

托管 EC2 队列和容器队列以类似的方式处理游戏客户端和云托管游戏服务器之间的连接。当 Amazon GameLift 创建新的游戏会话时,该服务会传达游戏会话的连接信息。游戏客户端使用这些信息直接连接到托管游戏会话的游戏服务器。对于所有类型的舰队,连接信息均由 IP 地址和端口分配组成。

创建集装箱船队时,您需要定义两组端口范围。首先,定义一系列面向外部的连接端口,允许游戏客户端连接到游戏。其次,定义一组仅限内部使用的容器端口,这些端口被分配给在容器中运行的每个游戏服务器进程。Amazon GameLift 动态地将内部容器端口映射到外部连接端口,让玩家可以访问游戏。这种方法可以保护您的游戏服务器免受直接访问容器端口,从而提供额外的安全层。

在为容器队列定义端口范围时,必须为范围提供足够的端口,以容纳在实例上的容器上同时运行的所有服务器进程。

为了获得更多控制,您还可以为队列设置入站权限。入站权限决定哪些连接端口对传入流量开放。您可以随时更改舰队的入站权限。有了入站权限,您可以根据需要快速关闭所有连接端口、打开某些端口或全部打开。