本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
验证集装箱队列部署并对其进行故障排除
队列部署(在本主题中称为部署)是将容器队列实例上的容器替换为使用队列新设置(例如新的容器组定义版本)的容器的过程。Amazon GameLift Servers部署不是一次更换每个正在运行的容器,而是首先验证新容器是否可以托管游戏会话,然后逐步替换其余容器以捕捉不良更改,然后再将其部署到整个队列。集装箱舰队在三种情况下开始部署:
-
当您使用容器组定义创建队列时。如果您的CreateContainerFleet请求包含游戏服务器容器组定义,则队列创建会启动部署,将您的容器安装在队列的新实例上。如果您创建的队列没有容器组定义,则在您添加游戏服务器容器组定义之前,不会部署任何实例,也不会部署队列。
-
当您更新舰队的容器组定义或其他容器设置时。 UpdateContainerFleet当更新更改队列运行的容器时(例如,当您指定新的游戏服务器容器组定义版本时),就会开始部署。不更改任何设置的更新都不会启动部署。有关哪些设置启动部署的信息,请参阅更新一个 亚马逊 GameLift 服务器 托管集装箱船队。
-
当你向活跃舰队添加地点时。 Amazon GameLift Servers使用队列配置的容器组定义在新位置开始部署。现有地点不会重新部署。在另一次部署正在进行时,您无法添加地点。
要查看部署的详细信息,请调用 DescribeFleetDeployment,它会返回一个FleetDeployment对象。它包括部署 ID、状态和配置,以及正在部署的容器组定义版本和回滚版本。舰队的DeploymentDetails.LatestDeploymentId财产标识了其最新部署。
注意
部署仅适用于托管集装箱舰队。
配置部署
部署DeploymentConfiguration是一组规则,用于控制部署在舰队中的进行方式以及部署失败时会发生什么。有关每个设置的值和默认值的信息,请参阅 Amazon GameLift ServersAPI 参考DeploymentConfiguration中的。
您可以在控制台中调用UpdateContainerFleet或编辑队列时设置部署配置。 CreateContainerFleet不接受部署配置,因此队列的首次部署始终使用默认值。
操作方法 亚马逊 GameLift 服务器 验证部署
部署开始时,Amazon GameLift Servers首先验证队伍中每个位置的游戏服务器容器组。它使用船队现有容量的一小部分运行新集装箱,并检查它们是否处于健康状态。当游戏服务器容器调用报告它已准备好托管游戏会话ProcessReady()时,新的游戏服务器容器组就处于健康状态。
此初始验证会检查游戏服务器容器组。如果您的队列还使用每个实例的容器组定义,则在Amazon GameLift Servers更新游戏服务器组后更新这些组。 Amazon GameLift Servers在部署完成之前分别检查每个实例的组;它们不使用游戏服务器的ProcessReady()检查。
如果新的游戏服务器容器组在Amazon GameLift Servers停止等待之前未恢复正常,则验证失败。有关常见原因以及如何调查这些原因的信息,请参阅调试受损的部署。
如果验证失败,则Amazon GameLift Servers应用部署ImpairmentStrategy并将部署状态设置为 IMPAIRED (forMAINTAIN) 或 ROLLBACK_IN_PROGRESS (forROLLBACK)。只有在某个位置成功验证后,才会Amazon GameLift Servers替换在那里运行游戏服务器的剩余容器。
验证需要多长时间
当用于验证的容量Amazon GameLift Servers用于托管受保护的游戏会话时,验证需要更长的时间。舰队NewGameSessionProtectionPolicy决定了新游戏会话的默认保护。有效值为 NoProtection 和 FullProtection。部署ProtectionStrategy决定部署是否支持该保护。有效值为 WITH_PROTECTION 和 IGNORE_PROTECTION。
当队列NewGameSessionProtectionPolicy设置为FullProtection且部署设置ProtectionStrategy为时WITH_PROTECTION,Amazon GameLift Servers允许延长受保护游戏会话结束的验证超时时间。对于任何其他组合,它使用的超时时间都更短。
重要
如果您的新容器从未运行正常,并且队列在WITH_PROTECTION部署中FullProtection使用,则部署可以保持IN_PROGRESS状态,直到受保护的游戏会话在报告失败之前结束。要更快地获得信号,请在测试新的容器镜像IGNORE_PROTECTION时部署它们,或者自己取消部署。有关取消部署的说明,请参阅通过启动新部署来取消部署。
如果你UpdateGameSession在舰队中保护个人游戏会话NoProtection,NewGameSessionProtectionPolicy那么等待时间就Amazon GameLift Servers不会延长。如果这些游戏会话没有及时结束,即使新配置正在运行,验证也可能失败。
跟踪部署状态
要在Amazon GameLift Servers控制台
有关部署状态值及其含义的信息,请参阅 Amazon GameLift ServersAPI 参考DeploymentStatus中的。
调试受损的部署
部署受损意味着新容器在验证期间没有恢复正常:在Amazon GameLift Servers停止等待ProcessReady()之前没有游戏服务器容器被调用,这通常是因为容器退出或无法启动。原因通常出在容器镜像或游戏服务器上。找出容器退出的原因或为什么游戏服务器从未报告准备就绪。
查看舰队事件日志
舰队事件日志记录了部署期间Amazon GameLift Servers观察到的情况。在控制台中舰队的 “事件” 选项卡上查看,或致电describe-fleet-events。以下事件代码与失败的部署有关:
-
GAME_SERVER_CONTAINER_GROUP_CRASHED和PER_INSTANCE_CONTAINER_GROUP_CRASHED— 容器组已退出或无法启动。当Amazon GameLift Servers有容器的退出代码时,它会在事件消息中包含该代码。 -
GAME_SERVER_CONTAINER_GROUP_REPLACED_UNHEALTHY和INSTANCE_REPLACED_UNHEALTHY— Amazon GameLift Servers 替换了一个容器组或一个运行状况不佳的实例。部署失败时,这些事件可能会在舰队的各个位置重复。 -
SERVER_PROCESS_MISCONFIGURED_CONTAINER_PORT— 游戏服务器容器使用的端口与容器组定义中声明的端口不匹配。 -
LOCATION_STATE_UPDATING而且LOCATION_STATE_ACTIVE— 它们将每个位置的部署分成一列,这可以帮助你将其他事件与产生这些事件的部署对齐。 -
COMPUTE_LOG_UPLOAD_FAILED— 容器的日志收集已停止工作,因此该容器中的日志可能不完整或丢失。
阅读容器日志
集装箱舰队的LogConfiguration集合Amazon GameLift Servers将每个容器的标准输出发送到哪里:CLOUDWATCH(默认)S3、或NONE。将其设置为 orCLOUDWATCH,S3以便在部署失败时容器输出可用。当容器在游戏服务器开始运行之前出现故障时,例如由于容器的入口点引用了图像中不存在的文件,则此输出是唯一的失败记录。有关容器日志记录的信息,请参阅日志差异:托管舰队 EC2 与容器舰队。
Connect 连接到受损的容器
如果您使用MAINTAIN减值策略进行部署,则可以连接到Amazon GameLift Servers保存该策略的容器并直接对其进行检查。使用它来检查文件权限,确认图像实际包含哪些文件,然后手动运行游戏服务器可执行文件以查看其报告的内容。有关连接容器的说明,请参阅Connect 到容器。
常见的部署问题
以下症状及其常见原因在部署失败或部署缓慢中很常见。
- 容器一遍又一遍地立即启动和退出。
-
如果容器的入口点无法运行,请检查以下内容:
-
验证镜像中启动脚本和游戏服务器可执行文件是否标记为可执行。
-
确认可执行文件的 CPU 架构与队列的实例类型相匹配。
-
检查图像是否包含可执行文件所需的解释器和共享库。
有关构建Amazon GameLift Servers可以运行的映像的信息,请参阅为构建容器镜像 亚马逊 GameLift 服务器。
-
- 部署速度很慢,但没有任何失败。
-
WITH_PROTECTION部署会等待受保护的游戏会话结束,无论是在验证期间还是在替换舰队的容器时。在将长时间部署视为失败之前,请检查舰队的活跃游戏会话。有关验证等待时间的信息,请参阅验证需要多长时间。
通过启动新部署来取消部署
要取消部署并将队列恢复到之前的配置,请在控制台中调用UpdateContainerFleet或编辑舰队以开始新的部署,从而撤消更改。最常见的情况是新的容器组定义版本,以下过程将恢复该版本。 Amazon GameLift Servers将队列上次在进行中的部署中处于活动状态时使用的版本记录为RollbackGameServerBinaryArn和RollbackPerInstanceBinaryArn,因此您不必确定要返回到哪个版本。如果部署还更改了其他设置,例如日志配置或连接端口范围,请在同一个UpdateContainerFleet请求中重新设置这些设置。
在开始之前,请 AWS CLI 为您的账户配置并确定舰队的所在地 AWS 区域。此过程需要正在进行的部署和之前的容器组定义版本才能恢复。用于list-fleet-deployments查找部署 ID。有关说明,请参阅跟踪部署状态。
在命令中,fleet-id替换为你的舰队 ID、deployment-id正在进行的部署 ID 和舰队fleet-home-region的所在 AWS 区域地。
将正在进行的部署替换为以前的容器版本 (AWS CLI)
-
使用以下 AWS CLI 命令获取要返回的版本:
aws gamelift describe-fleet-deployment \ --fleet-idfleet-id\ --deployment-iddeployment-id\ --regionfleet-home-region在响应中,
RollbackGameServerBinaryArn保存了队列上次处于活动状态时使用的游戏服务器容器组定义版本。如果队列具有每个实例的容器组,则RollbackPerInstanceBinaryArn保留该版本。 -
使用以下 AWS CLI 命令以该版本启动新部署。
rollback-game-server-cgd-arn替换为步骤 1 中的RollbackGameServerBinaryArn值。如果队列具有每个实例的容器组,则还要传递--per-instance-container-group-definition-name该RollbackPerInstanceBinaryArn值。aws gamelift update-container-fleet \ --fleet-idfleet-id\ --game-server-container-group-definition-namerollback-game-server-cgd-arn\ --regionfleet-home-region -
确认之前的部署会报告
CANCELLED状态,并且新的部署在完成COMPLETE时会报告。
注意
以这种方式取消部署并不是立即停止。新的部署与其他部署的步骤相同,包括验证,因此舰队需要一些时间才能安顿下来。舰队之前成功运行的版本通常会很快得到验证。
相关主题
有关更多信息,请参阅以下主题。