設計 Amazon GameLift 貨櫃車隊 - Amazon GameLift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設計 Amazon GameLift 貨櫃車隊

本文件適用於公開預覽版本中的功能。內容可能變動。

這些主題說明您在設定 Amazon GameLift 容器叢集時會做出的重要決定。您的決策會影響您設定容器、容器群組和叢集的設定方式。

建構您的車隊貨櫃結構

第一步,請確定託管遊戲伺服器所需的軟體和資源,包括:

  • 您的遊戲伺服器應用程式 該應用程序必須與 Amazon GameLift 功能集成以進行託管,包括服務器 SDK 版本 5 +。請參閱將您的遊戲與 Amazon 整合 GameLift

  • Amazon GameLift 代理。這個運算上的代理程式會維持與 Amazon GameLift 服務的通訊,並管理所有遊戲伺服器程序的生命週期。如需詳細資訊,請參閱遊戲伺服器和 Amazon GameLift 代理

  • 視需要提供其他軟體和資源。這可能包括執行遊戲伺服器應用程式所需的軟體。常見的支援軟體可用於記錄和監控、安全性、內容交付和資料同步。

接下來,決定如何為 Amazon GameLift 容器叢集建構軟體和資源。Amazon GameLift 使用容器群組來組織容器。叢集永遠有一個複本容器群組,而且可以選擇性地擁有精靈容器叢集。如需詳細資訊,請參閱貨櫃車隊元件

  • 從設計複本容器群組開始。請考量下列準則:

    • 將您的遊戲伺服器應用程式和 Amazon GameLift 代理程式捆綁到同一個容器中。將此容器設為複本群組的唯一必要容器。

    • 將遊戲伺服器的所有其他軟體整理到容器中。您可以選擇將所有內容放入複本群組中的單一容器中。或者,您可以選擇創建一個或多個附屬容器。使用側車的一些原因包括:

      • 為個別軟體設定啟動/關閉順序。您可以通過將軟件放在單獨的容器中並設置它們之間的依賴關係來實現此目的。

      • 設定容器特定的記憶體和 CPU 使用量限制。

      • 為每個容器指定不同的容器組態設定,例如啟動命令、進入點、工作目錄、環境變數或健康狀態檢查。

  • 決定是否需要叢集的精靈容器群組。考慮下列各項:

    • 守護程式容器通常用於執行背景或監視程序。

    • 精靈群組中的容器不會在叢集執行個體上複寫。這表示精靈群組中的容器不會隨著複本容器群組一起擴充。

    • 精靈群組可以有多個容器。您可以將精靈群組中的任何容器指定為必要的容器。

設定資源限制

針對每個容器群組,判斷群組執行其軟體所需的記憶體和 CPU 數量。Amazon GameLift 依賴此資訊來管理容器群組的資源。它也會使用此資訊來計算叢集映像可以容納多少個複本容器群組。您也可以設定個別容器的限制。

設定容器的選擇性限制

設定容器特定的資源限制可讓您更好地控制個別容器如何使用群組資源。如果您未設定容器特定的限制,群組中的所有容器都會共用群組資源。共享提供了更大的靈活性,可以在需要的地方使用資源。它還增加了進程相互競爭並導致容器故障的可能性。

為任何容器設定下列任一ContainerDefinition屬性。

  • SoftLimit(記憶體) — 保留最低容量的記憶體供容器專用使用。容器一律具有可用的保留金額。它可以在任何時候超過這個最低限度,如果有其他資源可用。

  • HardLimit(記憶體) — 設定容器的最大記憶體限制。如果容器超過此限制,則會導致重新啟動。

  • Cpulimit — 保留最少數量的 CPU 資源,以供容器專用使用。容器一律具有可用的保留金額。它可以在任何時候超過這個最低限度,如果有其他資源可用。(1024 個 CPU 單位相當於 1 個 vCPU。)

設定容器群組的資源總計限制

告訴 Amazon GameLift 每個容器群組需要多少記憶體和 CPU 資源。目標是分配足夠的資源來最佳化遊戲伺服器效能。Amazon GameLift 使用這些限制來計算如何在叢集執行個體上包裝複本容器群組。您也可以在為容器叢集選擇執行個體類型時使用它們。

計算一組中每個容器中所有進程所需的總內存和 CPU。考慮下列各項:

  • 在容器群組中的所有容器中執行哪些程序? 將這些程序所需的資源加起來。

  • 您計劃在每個容器群組中執行多少個並行遊戲伺服器程序? 您將此值設定為叢集的執行階段組態的一部分,但您必須在此處為它們規劃足夠的記憶體 (請參閱最佳化執行階段組態)。

根據您預估的容器群組需求,設定下列ContainerGroupDefinition屬性:

  • TotalMemoryLimit— 設定容器群組的最大記憶體限制。群組中的所有容器都會共用配置的記憶體。如果您設定個別容器限制,總記憶體限制必須為:

    • 等於或大於所有容器軟性記憶體限制的總和

    • 等於或大於群組中容器的最高硬碟記憶體限制

  • TotalCpuLimit — 設定容器群組的最大 CPU 限制。群組中的所有容器都會共用配置的 CPU 資源。如果您設定個別容器限制,CPU 總限制必須為:

    • 等於或大於所有容器 CPU 限制的總和。最佳作法是考慮將此值設定為容器 CPU 限制總和的兩倍。

範例藍本

假設我們正在定義具有以下三個容器的複本容器群組:

  • 容器 A 是我們必不可少的複製品容器。它運行遊戲服務器進程和 Amazon GameLift 代理。我們估計一部遊戲伺服器的資源需求為 512 MiB 和 1024 處理器。我們計劃讓容器運行 10 個服務器進程。由於此容器執行我們最重要的軟體,因此我們設定了 6144 MiB 的軟體記憶體保留,而且沒有硬碟記憶體限制或 CPU 保留限制。

  • 容器 B 執行的資源需求估計為 1024 MiB 和 1536 個 CPU 的支援軟體。我們將軟體記憶體保留限制設定為 1024 MiB、硬碟記憶體限制為 2048 MiB,以及 1024 個 CPU 的 CPU 保留限制。

  • 容器 C 會執行非關鍵記錄和其他監視公用程式。我們設置了 512 MiB 的硬存儲器限制和 512 CPU 的 CPU 保留限制。

使用此資訊,我們為容器群組設定下列總限制:

  • 總記憶體限制:7680 MiB。此值超過 (1) 軟體記憶體限制 (6144+1024 MiB) 和 (2) 最高硬碟記憶體限制 (1024 MiB) 的總和。

  • 中央處理器總限制:13312 中央處理器。這個值超過 CPU 限制的總和 (1024+512 中央處理器)。

指定必要的容器

對於每個容器,將容器指定為必要或非必要容器。所有容器群組都必須至少有一個必要容器。基本容器會執行容器群組的關鍵工作,例如託管您的遊戲伺服器。必要的容器始終預計將運行。如果失敗,整個容器群組就會重新啟動。

  • 您的叢集複本容器群組只能有一個基本容器。此容器會執行 Amazon GameLift 代理程式及其管理的遊戲伺服器處理程序。

  • 如果您的叢集有精靈容器群組,您可以指定多個基本容器。如果您希望容器失敗提示容器群組重新啟動,請將精靈容器設為必要項目。

Essential將每個容器的ContainerDefinition屬性設定為真或假。

設定網路連線

您可以建立網路存取權,讓外部流量連線至容器叢集中的任何容器。例如,您必須與執行遊戲伺服器程序的容器建立網路連線,以便遊戲用戶端可以加入並暢玩您的遊戲。遊戲客戶端使用端口和 IP 地址連接到遊戲服務器。

在容器叢集中,用戶端與伺服器之間的連線不是直接的。在內部,容器中的處理序會偵聽容器連接埠。在外部,傳入流量會使用連線連接埠連線至叢集執行個體。Amazon 會 GameLift 維護內部容器連接埠與外部連線連接埠之間的對應,以便傳入流量路由到執行個體上的正確程序。

Amazon 為您的網絡連接 GameLift 提供了一層額外的控制。每個容器叢集都有輸入權限設定,可讓您控制每個對外連線連接埠的存取。您無法變更現有叢集的連接埠設定,但可以透過調整輸入權限,視需要允許或限制存取。例如,您可以移除所有連線連接埠的權限,以關閉對叢集容器的所有存取。

網路連接埠可讓外部流量連線至容器叢集中執行的處理序。EC2 入站許可允許流量存取連線連接埠,這些連接埠在叢集中的每個執行個體上開啟。連接埠會在內部對應至容器連接埠,這些連接埠會指派給個別處理序。
設定容器連接埠範圍

為任何需要外部存取的程序設定具有足夠容器連接埠的容器定義。有些容器不需要任何連接埠。其他人必須擁有足夠的連接埠,才能將一個連接埠指派給每個需要一個

執行遊戲伺服器的基本複本容器群組需要為每個同時執行的遊戲伺服器程序使用連接埠 (如叢集中的設定RuntimeConfiguration)。遊戲伺服器程序會監聽指派的連接埠,並將其報告給 Amazon GameLift。

建立容器群組定義時,請為每個需要網路存取的容器定義容器連接埠範圍 (請參閱 ContainerDefinitionInput:PortConfiguration)。確保範圍足夠大,可以為每個需要一個進程分配一個端口。處理序必須在容器的連接埠組態中指派連接埠號碼。

設定連接埠範圍

使用一組連接埠設定您的容器叢集。連線連接埠可讓您對執行容器的叢集執行個體提供外部存取權。Amazon GameLift 會根據需要指派連接埠,並將其對應至容器連接埠。

建立容器叢集時,請定義連線連接埠範圍 (請參閱 ContainerGroupsConfiguration:ConnectionPortRange)。確定範圍具有足夠的連接埠,可對應至叢集執行個體中的每個容器連接埠。若要計算所需的最小連接埠,請使用下列公式:

[Total number of container ports defined for containers in the replica container group] * [Number of replica container groups per instance] + [Total number of container ports defined for containers in the daemon container group]

最佳作法是將最小連接埠數目加倍。

注意

connecton 連接埠的數目可能會限制每個執行個體的複本容器群組數目。如果叢集只有足夠的連線連接埠可容納每個執行個體一個複本容器群組,Amazon 只 GameLift 會部署一個複本容器群組,即使執行個體具有足夠的運算能力供多個複本容器群組使用。

設定輸入權限

輸入權限可指定要針對內送流量開啟的連線連接埠,藉此控制對容器叢集的外部存取。您可以使用此設定,視需要開啟或關閉叢集的網路存取。

建立容器叢集時,請定義一組輸入許可 (請參閱:EC2 CreateFleet)。InboundPermissions設定輸入權限連接埠內容,以在叢集的連線連接埠設定中包含部分或所有值。若要變更現有容器叢集的輸入權限,請撥打 UpdateFleetPortSettings

範例藍本

此範例說明如何設定所有三個網路連線屬性。

  • 我們艦隊的複製容器組有 1 個容器,用於運行遊戲服務器進程。執行階段確認會告訴容器執行 10 個並行遊戲伺服器處理序。

    在複本容器群組定義中,我們設定此容器的PortConfiguration參數,如下所示:

    "PortConfiguration": { "ContainerPortRanges": [ { "FromPort": 10, "ToPort": 20, "Protocol": "TCP"} ] }
  • 我們的車隊也有一個守護進程容器組與 1 個容器。它有 1 個需要網絡訪問的進程。在守護進程容器組定義中,我們為此容器設置PortConfiguration參數,如下所示:

    "PortConfiguration": { "ContainerPortRanges": [ { "FromPort": 25, "ToPort": 25, "Protocol": "TCP"} ] }
  • 我們的機隊配置了每個車隊實例 3 副本容器組。有了這些信息,我們可以使用公式來計算我們需要的連接端口數量:

    • 最少:31 個連接埠 [10 個複本容器連接埠 * 每個執行個體 3 個複本容器群組 + 1 個精靈容器連接埠]

    • 最佳做法:62 個連接埠 [最少連接埠 * 2]

    建立容器叢集時,我們在中設定ConnectionPortRange參數,ContainerGroupsConfiguration如下所示:

    "ConnectionPortRange": { "FromPort": 1010, "ToPort": 1071 }
  • 我們希望允許訪問所有可用的連接端口。建立容器叢集時,我們設定EC2InboundPermissions參數如下:

    "EC2InboundPermissions": [ {"FromPort": 1010, "ToPort": 1071, "IpRange": "10.24.34.0/23", "Protocol": "TCP"} ]

設定容器的健康狀態檢查

如果容器遇到終端機故障並停止運行,則會自動重新啟動。如果容器是必要的,整個容器群組都會重新啟動。

您可以定義其他自訂條件來測量容器健全狀況,並使用健康狀態檢查來測試該條件。若要設定容器健康狀態檢查,您可以在 docker 容器映像檔或容器定義中定義它。如果您在容器定義中設定健康狀態檢查,它會覆寫容器映像中的任何設定。

根據容器類型設定選擇性的健全狀況檢查,如下所示:

  • 對於基本複本容器,請勿設定健康狀態檢查。Amazon GameLift 代理程式會自動處理此容器的運作狀態報告。

  • 對於非必要的複本容器和任何精靈容器,您可以選擇性地設定健康狀態檢查參數。

設定容器健ContainerDefinition全狀況檢查的下列屬性:

  • Command— 提供檢查容器健康狀況某些方面的命令。您可以決定用什麼標準來衡量健康狀況。指令必須導致結束值為 1 (狀況不良) 或 0 (狀況良好)。

  • StartPeriod— 指定健全狀況檢查失敗開始計數之前的初始延遲。這種延遲使容器有時間來引導其進程。

  • Interval— 決定執行健康狀態檢查命令的頻率。您希望偵測和解決容器故障的速度有多快?

  • Timeout— 決定在重試健康狀態檢查命令之前等待成功或失敗的時間長度。健康狀態檢查命令需要多長時間才能完成?

  • Retries— 在註冊失敗之前,健康狀態檢查命令應重試多少次?

設定容器相依性

在每個容器群組中,您可以根據容器狀態設定容器之間的相依性。相依容器可以根據另一個容器的狀態啟動或關閉時,相依性會受到影響。

相依性的主要使用案例是建立容器群組的啟動和關閉順序。

例如,您可能希望容器 A 在容器 B 和 C 啟動之前先啟動並成功完成。若要達成此目的,請先為容器 A 上的容器 B 建立相依性,並符合容器 A 必須順利完成的條件。然後使用相同條件為容器 A 上的容器 C 建立相依性。啟動順序會以相反的順序進行關機。

設定容器叢集

建立容器叢集時,請考量下列決策點。這些點大部分都取決於您的容器架構和配置。

決定您要在哪裡部署您的車隊

通常,您希望將車隊部署在玩家附近的地理位置,以最大程度地減少延遲。您可以將您的容器叢集部署到任何 Amazon GameLift 支援 AWS 區域 的每個項目。如果您想要將相同的遊戲伺服器部署到其他地理位置,您可以將遠端位置新增至叢集,包括 AWS 區域 和 Local Zones。對於多地點叢集,您可以在每個叢集位置獨立調整容量。如需支援的叢集位置的詳細資訊,請參閱Amazon GameLift 服務地點

選擇叢集的執行個體類型和大小

Amazon GameLift 支援各種 Amazon EC2 執行個體類型,所有這些類型都可以與容器叢集搭配使用。執行個體類型的可用性和價格因地點而異。您可以在 Amazon GameLift 主控台 (在資源、執行個體和服務配額下) 檢視受支援的執行個體類型清單,並按位置篩選。

選擇例證類型時,首先要考慮例證族群。執行個體系列提供 CPU、記憶體、儲存和網路功能的各種組合。取得 EC2 執行個體系列的詳細資訊。在每個族群中,您都有一系列例證大小可供選擇。選取例證大小時,請考慮下列問題:

  • 支援工作負載的最小執行個體大小是多少? 使用此資訊可消除任何太小的執行個體類型。

  • 哪些執行個體類型大小適合您的容器架構? 理想情況下,您想要選擇可容納多個複本容器群組副本的大小,而浪費空間最少。

  • 什麼縮放粒度對您的遊戲有意義? 擴展叢集容量涉及新增或移除執行個體,而每個執行個體代表能夠託管特定數量的遊戲工作階段。考慮每個執行個體要新增或移除多少容量。如果玩家需求每分鐘都有數千個變化,那麼使用可以託管數百或數千個遊戲工作階段的大型執行個體可能是有意義的。相較之下,您可能更喜歡使用較小的執行個體類型進行更精細的縮放控制。

  • 是否可以根據大小節省成本? 您可能會發現某些執行個體類型的費用會因可用性而有所不同。

優化您的運行時配置

叢集的執行階段設定是一組指示,說明如何為遊戲工作階段主控執行伺服器處理序。這些指示由 Amazon GameLift 代理程式在叢集中的每個複本容器群組中實作。

叢集的執行階段設定會決定每個複本容器群組中同時執行的伺服器處理序數目。此設定會影響您計算容器群組資源限制的方式,以及為叢集選擇執行個體類型的方式。在設計艦隊時,您需要平衡這三個要素。

如需如何使用執行階段設定的詳細資訊,請參閱管理 Amazon 如何GameLift啟動遊戲伺服器

設定其他選擇性叢集設定

設定容器叢集時,您可以使用下列選用功能:

  • 設定您的遊戲伺服器以存取其他 AWS 資源。請參閱與您車隊的其他AWS資源進行溝通

  • 保護與活躍玩家的遊戲階段,避免在縮小活動期間過早終止。

  • 在有限的時間範圍內,限制一個人可以在艦隊上建立的遊戲工作階段數量。