容器是如何工作的 Amazon GameLift Servers - Amazon GameLift Servers
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

容器是如何工作的 Amazon GameLift Servers

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

使用这些托管容器工具加快入门速度:
  • 容器入门套件简化了集成和舰队设置。它为您的游戏服务器添加了基本的游戏会话管理功能,并使用预先配置的模板为游戏服务器构建容器队列和自动部署管道。部署后,使用 Amazon GameLift Servers 控制台和 API 工具,用于监控舰队性能、管理游戏会话和分析指标。

  • 对于虚幻引擎或Unity开发者,请使用 Amazon GameLift Servers用于集成游戏服务器并从游戏引擎的开发环境中构建容器队列的插件。该插件的指导式工作流程可帮助您使用托管容器创建快速、简单的解决方案,实现基于云的托管。然后在此基础上再接再厉,为您的游戏创建自定义托管解决方案。

集装箱船队组件

实例集

容器队列是一组 Amazon EC2 实例,用于托管您的容器化游戏服务器。这些实例由以下人员管理 Amazon GameLift Servers 代表你。创建队列时,您可以配置如何将带有游戏服务器软件的容器架构部署到每个队列实例。您可以创建一个容器队列,其实例位于一个或多个地理位置。您可以使用 … Amazon GameLift Servers 扩展工具以自动扩展容器舰队的容量,以托管游戏会话和玩家。

实例

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

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

容器组

Amazon GameLift Servers 使用容器组的概念来描述和管理一组容器。容器组类似于容器 “任务” 或 “pod”。在每个容器组中,您可以定义容器的行为方式、设置依赖关系以及共享可用的 CPU 和内存资源。

每个舰队实例可以有以下类型的容器组:

  • 游戏服务器容器组管理运行游戏服务器应用程序和支持软件的容器。容器舰队必须有一个此类容器组才能托管游戏会话和玩家。可以在舰队实例之间复制游戏服务器容器组。每个队列实例的游戏服务器组副本数量取决于软件的计算要求和实例上可用的计算资源。

  • 每个实例的容器组是可选的,它使您能够在每个队列实例上运行其他软件。它们对于运行后台服务或实用程序非常有用,例如用于监控。您的游戏服务器软件不直接依赖于每个实例组中的进程。每个队列实例仅部署每个实例容器组的一个副本。

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

容器

容器是基于容器的架构中最基本的元素。它包括一个包含软件可执行文件和依赖文件的容器镜像。定义容器以配置软件的运行和交互方式 Amazon GameLift Servers.

Amazon GameLift Servers 定义了两种类型的容器:

  • 游戏服务器容器包含运行游戏服务器进程和为玩家托管游戏会话所需的一切。它包括您的游戏服务器版本和相关软件。为舰队的游戏服务器容器组定义一个游戏服务器容器。游戏服务器容器自动被认为对容器组至关重要。

  • 支持容器运行其他软件来支持您的游戏服务器。它类似于 “边车” 容器的概念。它使您可以选择在游戏服务器旁边运行和扩展支持软件,但可以作为单独的容器进行管理。在游戏服务器容器组中,您可以定义零个或多个支持容器。在每个实例的容器组中,所有容器都是支持容器。任何支撑容器都可以指定为必需品。

计算

计算表示舰队实例上游戏服务器容器组的副本。

常见架构

下图说明了最简单的集装箱船队结构。在这种结构中,队列中的每个实例都维护一个游戏服务器容器组的副本。容器组有一个运行一个游戏服务器进程的游戏服务器容器。在此示例中,容器队列配置为每个实例放置一个游戏服务器容器组副本。使用这种架构,每个实例都运行一个游戏服务器进程。

一个简单的容器架构示例,游戏服务器容器组中只有一个游戏服务器容器。

第二张图说明了更复杂的集装箱船队架构。在这种结构中,队列既有游戏服务器容器组,又有每个实例的容器组。游戏服务器容器组具有用于游戏服务器进程和支持进程的独立容器。队列配置为在每个队列实例上放置三个游戏服务器容器组副本。每个实例的容器组永远不会被复制。在此示例中,容器队列配置为每个实例放置三个游戏服务器容器组副本。使用这种架构,每个实例运行三个游戏服务器进程。

容器架构示例,游戏服务器容器组中有多个容器,每个实例容器组中有一个容器。

核心功能

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

活跃的舰队更新

托管容器提供高级支持,帮助您管理托管软件和容器架构的生命周期。您可以更新容器定义,包括容器镜像,并将更改部署到现有队列。此功能可以更快、更轻松地在开发过程中对容器进行迭代更改。它还提供一些功能,可帮助您构建、部署和跟踪软件版本随时间的推移而更新。这些功能包括:

  • 管理容器组定义更新和版本控制。您可以更新容器组定义的几乎所有属性,包括容器镜像和配置设置。每当你更新容器时,Amazon GameLift Servers 自动为更新分配版本号,默认情况下会保留所有版本。您可以访问任何特定版本,也可以根据需要删除版本。创建容器队列时,您可以指定要部署的容器组定义和版本。

  • 使用新的容器组定义和配置设置更新现有容器舰队。您可以将容器更新部署到已部署到队列实例的队列。您可以使用 Amazon Web Services Management Console 或 Amazon SDK 和 CLI 跟踪每个队列位置的更新部署状态。

  • 配置您希望如何在活跃的队列中部署队列更新。

    • 游戏会话保护。选择在游戏会话结束之前使用活跃的游戏会话保护舰队实例(安全部署)。或者,无论游戏会话活动如何,都可以选择替换舰队实例(不安全的部署)。在开发和测试阶段使用不安全的部署以缩短部署时间。

    • 最低健康百分比。指定要在部署期间维护的正常任务的百分比。此功能允许您决定部署期间有多少舰队实例受到影响。较低的值优先考虑部署速度,而较高的值可确保游戏服务器在整个部署过程中保持较高的可用性。

    • 部署失败策略。决定部署失败时要采取的措施。部署失败意味着某些更新的容器未通过状态检查并被视为受损。您可以将部署设置为自动将所有队列实例回滚到先前部署的状态。或者,您可以选择维护一些受损的队列实例以用于调试。

当你想为游戏服务器软件部署更新时,更新活跃舰队的功能非常有用。为游戏服务器构建了新的容器镜像后,部署该镜像的过程分为两步:第一,使用新镜像更新容器组定义,第二,更新容器队列。Amazon GameLift Servers 根据需要处理所有其他任务。

集装箱包装

在开发用于部署到集装箱舰队中的容器结构时,一个共同的目标是优化对可用计算能力的使用。为了实现这个目标,你需要将尽可能多的游戏服务器容器组打包到每个队列实例上。

Amazon GameLift Servers 通过根据以下信息计算每个实例的最大游戏服务器容器组数来帮助您实现此目的:

  • 队列的实例类型及其 vCPU 和内存资源。

  • 游戏服务器容器组中所有容器的 vCPU 和内存要求。

    每实例容器组(如果有)中所有容器的 vCPU 和内存要求。

创建集装箱船队时,您可以使用计算得出的最大值,也可以指定所需的数量。作为最佳实践,请计划对容器化游戏服务器软件进行试验,以确定资源需求,以实现最佳游戏服务器性能。

容量扩展

舰队容量衡量舰队可以同时托管的游戏会话数量。您还可以根据舰队可以支持的并发玩家数量来衡量容量。要增加或减少队列的托管容量,您可以添加或移除队列实例。

容器队列配置为在每个舰队实例上运行特定数量的并发游戏服务器进程。(您可以基于 (1) 每个实例的游戏服务器容器组和 (2) 每个容器组中运行的游戏服务器进程数来计算此值。) 每个实例的并发游戏服务器数量告诉您添加或删除每个队列实例会产生什么影响。例如,如果您的容器队列在每个游戏服务器容器组中运行 1 个游戏服务器进程,并且每个队列实例包含 100 个游戏服务器容器组,则以 100 为增量增加或减少队列托管并发游戏会话的容量。如果每个游戏会话有 10 个玩家位置,那么你可以增加或减少舰队接待玩家的容量,增量为 1000。

对于容器队列,您可以使用提供的任何容量扩展方法 Amazon GameLift Servers。 这些包括:

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

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

  • 使用自定义缩放规则设置自动扩展(高级功能)。此方法允许您根据自己选择的舰队指标进行扩展。

游戏客户端/服务器连接

With Amazon GameLift Servers 托管舰队,游戏客户端直接连接到您的云托管游戏服务器。当游戏客户端要求加入游戏时,Amazon GameLift Servers 查找游戏会话并向游戏客户端提供连接信息(IP 和端口)。您可以通过为队列开放特定端口范围(入站权限)来控制对队列实例的外部访问。入站权限决定哪些端口对传入流量开放。您可以快速关闭所有端口,限制为几个端口,或者打开所有端口。

托管容器队列需要额外的设置,以允许访问在容器中运行的进程。创建容器定义时,需要指定一组端口,每个连接的进程对应一个端口。这包括:

  • 将在游戏服务器容器中同时运行的所有游戏服务器进程。所有游戏服务器进程都必须允许游戏客户端连接才能加入游戏会话。

  • 支持容器中需要外部源连接的任何进程。例如,您可以远程连接到测试应用程序。

当您设置面向内部的容器端口设置时,Amazon GameLift Servers 使用它们来计算游戏客户端和其他应用程序可以连接到的面向外部的入站权限。Amazon GameLift Servers 还管理入站权限和各个容器端口之间的映射,允许玩家访问容器中的游戏会话。这种内部映射保护您的游戏服务器免受直接访问容器端口,从而提供了一层安全保护。您可以根据需要选择自定义舰队的面向外部的端口设置。有关手动设置集装箱舰队港口的更多信息,请参阅

您可以随时修改集装箱船队的港口设置。此更改需要部署舰队更新。

下图说明了集装箱船队中港口连接的作用。如图所示,您在各个容器上设置端口,然后 Amazon GameLift Servers 使用此信息在队列实例上配置足够的端口以映射到每个容器端口。面向外部的实例入站权限和面向内部的连接端口的计算公式为 Amazon GameLift Servers 适用于您的舰队,除非您选择手动设置。

集装箱船队的港口设置图示。端口映射使外部流量能够连接到队列实例并访问该实例上的单个容器。

容器日志

在托管容器队列中,会捕获所有容器的标准输出(和标准错误)流。这包括游戏服务器的游戏会话日志。您可以将容器队列配置为使用以下几个选项之一来处理输出流:

  • 将容器输出保存为 Amazon CloudWatch 日志流。每个日志流都引用舰队 ID 和容器。如果您为队列选择此日志记录选项,则可以指定一个 CloudWatch 日志组,该组将组织队列中的所有日志流。然后,您可以根据需要使用 CloudWatch 功能来搜索和分析日志数据。

  • 将容器输出保存到亚马逊简单存储服务 (Amazon S3) Simple S3 存储桶中。您可以根据需要查看、共享或下载内容。

  • 关闭日志记录。在这种情况下,不保存容器输出。

Amazon GameLift Servers 将托管集装箱船队的日志数据发送到您 Amazon 账户中的 CloudWatch 或 Amazon S3 服务。要查看您的数据,请登录您的 Amazon 账户并使用各项服务,使用 Amazon Web Services Management Console 或其他工具。您可以将有限访问权限扩展到 Amazon GameLift Servers 通过为集装箱舰队创建服务角色来执行这些操作。

您可以随时修改容器队列的日志配置。此更改需要部署舰队更新。

集装箱船队和 Amazon GameLift Servers 座席

常用的容器架构在每个容器中运行一个进程。在一个 Amazon GameLift Servers 容器舰队,游戏服务器容器组有一个游戏服务器容器,它运行一个游戏服务器进程。有了这种架构,Amazon GameLift Servers 管理舰队实例上每个游戏服务器容器组中单个游戏服务器进程的生命周期。

如果您选择构建在每个游戏服务器容器组中运行多个游戏服务器进程的容器架构,则需要一种方法来管理所有进程的生命周期。这包括根据需要启动、关闭和替换进程、管理要同时运行的所需数量的进程以及处理故障状态等任务。

你可以选择使用 Amazon GameLift Servers 这些任务的代理。对于容器队列,代理实现运行时指令,这些指令指定要运行哪些可执行文件(以及运行多少),提供启动参数并设置游戏服务器激活规则。例如,运行时指令可能会告诉代理维护十个游戏服务器进程供生产使用,以及一个带有特殊启动参数的游戏服务器进程用于测试。

要在容器队列中使用代理,请将代理添加到您的容器映像中,并附上一组运行时说明。有关代理的更多信息,请参阅