

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

# 自訂Amazon GameLift Servers容器機群
<a name="containers-design-fleet"></a>

本節中的主題說明Amazon GameLift Servers受管容器的一些選用功能。您可以選擇使用任何或所有這些功能。

**Topics**
+ [設定資源限制](#containers-design-fleet-limits)
+ [了解容器機群記憶體配置](#containers-design-fleet-memory-allocation)
+ [設定 NVMe 磁碟機存取](#containers-design-fleet-nvme)
+ [指定必要容器](#containers-design-fleet-essential)
+ [設定網路連線](#containers-custom-network)
+ [設定容器的運作狀態檢查](#containers-design-fleet-health)
+ [設定容器相依性](#containers-design-fleet-dependencies)
+ [設定容器機群](#containers-design-fleet-config)

## 設定資源限制
<a name="containers-design-fleet-limits"></a>

對於每個容器群組，您可以判斷容器群組執行其軟體所需的記憶體和運算能力。 Amazon GameLift Servers 依賴此資訊來管理整個容器群組的資源。它也會使用此資訊來計算機群映像可以容納多少遊戲伺服器容器群組。您也可以設定個別容器的限制。

您可以設定容器群組的記憶體和運算能力上限。根據預設，群組中的所有容器都會共用這些資源。您可以設定個別容器的限制，進一步自訂資源管理。

**設定個別容器的選用限制**  
設定容器特定的資源限制可讓您對個別容器如何使用群組的資源進行更大的控制。如果您未設定容器特定的限制，群組中的所有容器都會共用群組資源。共用可提供更大的彈性，以在需要時使用資源。它也會提高程序彼此競爭並導致容器故障的可能性。  
為任何容器設定下列任何`ContainerDefinition`屬性。  
+ `MemoryHardLimitMebibytes` – 設定容器的記憶體上限。如果容器超過此限制，則會導致重新啟動。
+ `Vcpu` 限制 – 保留最低數量的 vCPU 資源供容器專屬使用。容器一律有可用的預留數量。如果有其他資源可用，則可以隨時超過此最小值。(1024 CPU 單位相當於 1 個 vCPU。)

**設定容器群組的總資源限制**  
如果您為個別容器設定限制，您可能需要修改容器群組所需的記憶體和 vCPU 資源數量。目標是配置足夠的資源來最佳化遊戲伺服器效能。 Amazon GameLift Servers 使用這些限制來計算如何在機群執行個體上封裝遊戲伺服器容器群組。您也會在為容器機群選擇執行個體類型時使用它們。  
計算容器群組所需的總記憶體和 vCPU。考慮下列各項：  
+ 容器群組中所有容器執行的所有程序有哪些？ 新增這些程序所需的資源。請記下任何容器特定的限制。
+ 您計劃在每個容器群組中執行多少個並行遊戲伺服器程序？ 您可以在遊戲伺服器容器映像中確定這一點。
根據您對容器群組需求的預估，設定下列`ContainerGroupDefinition`屬性：  
+ `TotalMemoryLimitMebibytes` – 設定容器群組的記憶體上限。群組中的所有容器都會共用配置的記憶體。如果您設定個別容器限制，總記憶體限制必須等於或大於最高容器特定記憶體限制。
+ `TotalVcpuLimit` – 設定容器群組的 vCPU 上限。群組中的所有容器都會共用配置的 CPU 資源。如果您設定個別容器限制，CPU 總限制必須等於或大於所有容器特定 CPU 限制的總和。最佳實務是考慮將此值設定為容器 CPU 限制總和的兩倍。

**範例藍本**  
假設我們正在定義具有下列三個容器的遊戲伺服器容器群組：  
+ 容器 A 是我們的遊戲伺服器容器。我們估計一個遊戲伺服器在 512 MiB 和 1024 CPU 的資源需求。我們計劃讓容器執行 1 個伺服器程序。由於此容器會執行我們最重要的軟體，因此我們不設定記憶體限制或 vCPU 預留限制。
+ 容器 B 是支援容器，其資源需求估計為 1024 MiB 和 1536 CPU。我們設定 2048 MiB 的記憶體限制，以及 1024 CPU 的 CPU 預留限制。
+ 容器 C 是另一個支援容器。我們設定硬記憶體限制為 512 MiB，CPU 預留限制為 512 CPU。
使用此資訊，我們為容器群組設定下列總限制：  
+ 總記憶體限制：7680 MiB。此值超過最高記憶體限制 (1024 MiB)。
+ CPU 總限制：13312 CPU。此值超過 CPU 限制 (1024\$1512 CPU) 的總和。

## 了解容器機群記憶體配置
<a name="containers-design-fleet-memory-allocation"></a>

在機群執行個體上Amazon GameLift Servers部署容器群組時，並非所有執行個體的記憶體都可供您的容器使用。 會為作業系統、Amazon ECS 代理程式和其他支援服務Amazon GameLift Servers保留部分執行個體記憶體。預留記憶體的數量會根據執行個體類型的總記憶體而有所不同。了解此額外負荷可協助您設定容器群組定義，以充分利用可用的資源。

### 記憶體額外負荷公式
<a name="containers-design-fleet-memory-formula"></a>

Amazon GameLift Servers 使用下列步驟計算容器群組可用的記憶體：

1. **決定記憶體緩衝區百分比。** 會根據下列層Amazon GameLift Servers保留執行個體總記憶體的百分比：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/containers-design-fleet.html)

1. **計算可用的記憶體。**從總執行個體記憶體中減去預留記憶體：

   `AvailableMemory = InstanceMemory - round(InstanceMemory × BufferPercentage)`

1. **減去每個執行個體容器群組記憶體。**如果您的機群使用每個執行個體容器群組，`TotalMemoryLimitMebibytes`請從可用的記憶體中減去它。每個機群執行個體都會執行一個每個執行個體容器群組。

   `AvailableMemory = AvailableMemory - PerInstanceCGD.TotalMemoryLimitMebibytes`

1. **記錄路由器額外負荷的帳戶。**如果為機群啟用了日誌記錄， 會為日誌路由器Amazon GameLift Servers保留每個遊戲伺服器容器群組額外的 50 MiB。

1. **計算遊戲伺服器容器群組的上限。**每個記憶體適合執行個體的遊戲伺服器容器群組數量上限為：

   `MaxGroupsByMemory = floor(AvailableMemory / (GameServerCGD.TotalMemoryLimitMebibytes + LogRouterMemory))`

   如果啟用記錄，其中 `LogRouterMemory`為 50 MiB，如果停用記錄，則為 0。

**注意**  
記憶體只是決定執行個體上有多少遊戲伺服器容器群組的因素之一。 Amazon GameLift Servers也會考慮 vCPU 容量和可用的連線連接埠，並至少使用這三個計算。

### 記憶體計算範例
<a name="containers-design-fleet-memory-example"></a>

考慮使用啟用記錄的`c5.xlarge`執行個體 (8，192 MiB 總記憶體） 的機群：

1. 執行個體記憶體為 8，192 MiB，落在 5，000–9，999 層 (6% 緩衝區）

1. 預留記憶體 = round(8，192 × 0.06) = 492 MiB

1. 可用的記憶體 = 8，192 - 492 = 7，700 MiB

1. 如果使用具有 512 `TotalMemoryLimitMebibytes`的每個執行個體容器群組：可用記憶體 = 7，700 - 512 = 7，188 MiB

1. 如果每個遊戲伺服器容器群組`TotalMemoryLimitMebibytes`的 1，024：MaxGroupsByMemory = floor(7，188 / (1，024 \$1 50)) = floor(7，188 / 1，074) = 6

### 執行個體類型的可用記憶體
<a name="containers-design-fleet-memory-reference"></a>

下表顯示常用執行個體類型的總記憶體和可用記憶體 （在Amazon GameLift Servers緩衝區之後）。設定容器群組定義時，請使用這些值做為起點。*可用記憶體*欄會顯示執行個體上所有容器群組可用的記憶體，再減去任何每個執行個體容器群組或日誌路由器額外負荷。


| 執行個體類型 | 記憶體總計 (MiB) | 緩衝區百分比 | 可用的記憶體 (MiB) | 
| --- | --- | --- | --- | 
| c5.large | 4,096 | 8% | 3，768 | 
| c5.xlarge | 8,192 | 6% | 7，700 | 
| c5.2xlarge | 16,384 | 5% | 15，565 | 
| c5.4xlarge | 32,768 | 5% | 31，130 | 
| c5.9xlarge | 73，728 | 5% | 70，042 | 
| c5.12xlarge | 98，304 | 4% | 94，372 | 
| c5.18xlarge | 147，456 | 4% | 141，558 | 
| c5.24xlarge | 196，608 | 4% | 188，744 | 
| m5.large | 8,192 | 6% | 7，700 | 
| m5.xlarge | 16,384 | 5% | 15，565 | 
| m5.2xlarge | 32,768 | 5% | 31，130 | 
| m5.4xlarge | 65，536 | 5% | 62，259 | 
| m5.8xlarge | 131，072 | 4% | 125，829 | 
| m5.12xlarge | 196，608 | 4% | 188，744 | 
| r5.large | 16,384 | 5% | 15，565 | 
| r5.xlarge | 32,768 | 5% | 31，130 | 
| r5.2xlarge | 65，536 | 5% | 62，259 | 
| r5.4xlarge | 131，072 | 4% | 125，829 | 
| c6i.large | 4,096 | 8% | 3，768 | 
| c6i.xlarge | 8,192 | 6% | 7，700 | 
| c6i.2xlarge | 16,384 | 5% | 15，565 | 
| c6i.4xlarge | 32,768 | 5% | 31，130 | 
| c6i.8xlarge | 65，536 | 5% | 62，259 | 
| c7i.large | 4,096 | 8% | 3，768 | 
| c7i.xlarge | 8,192 | 6% | 7，700 | 
| c7i.2xlarge | 16,384 | 5% | 15，565 | 
| c7i.4xlarge | 32,768 | 5% | 31，130 | 
| c7i.8xlarge | 65，536 | 5% | 62，259 | 
| m7i.large | 8,192 | 6% | 7，700 | 
| m7i.xlarge | 16,384 | 5% | 15，565 | 
| m7i.2xlarge | 32,768 | 5% | 31，130 | 
| m7i.4xlarge | 65，536 | 5% | 62，259 | 
| m7i.8xlarge | 131，072 | 4% | 125，829 | 
| m7i.12xlarge | 196，608 | 4% | 188，744 | 
| r7i.large | 16,384 | 5% | 15，565 | 
| r7i.xlarge | 32,768 | 5% | 31，130 | 
| r7i.2xlarge | 65，536 | 5% | 62，259 | 
| r7i.4xlarge | 131，072 | 4% | 125，829 | 

對於此處未列出的執行個體類型，您可以使用上述公式計算可用的記憶體。檢查 [Amazon EC2 執行個體類型文件](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-instance-type-specifications.html)，了解所選執行個體類型的總記憶體。

## 設定 NVMe 磁碟機存取
<a name="containers-design-fleet-nvme"></a>

在 d 類型執行個體上，NVMe 磁碟機會在主機啟動期間自動掛載至 `/data`目錄。若要讓容器存取 SSD 儲存體，請設定下列`ContainerGroupDefinition`屬性 `MountPoints`：
+ `InstancePath` – 設定為 `/data` 以參考主機執行個體上的自動掛載 NVMe 磁碟機。
+ `AccessLevel` – 選擇適合您容器需求的存取層級 （例如 READ\$1ONLY 或 READ\$1WRITE)。
+ `ContainerPath` – （選用） 指定將執行個體路徑掛載在容器內的路徑。如果未指定，則會預設為執行個體路徑。

如需掛載點的詳細資訊，請參閱《Amazon GameLift Servers API 參考》中的 [ContainerMountPoint](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_ContainerMountPoint.html)。

## 指定必要容器
<a name="containers-design-fleet-essential"></a>

對於每個執行個體容器群組，請將每個容器指定為必要或非必要。每個執行個體容器群組必須至少有一個基本支援容器。基本容器會執行容器群組的重要工作。基本容器預期一律在執行中。如果失敗，整個容器群組會重新啟動。

將每個容器的 `ContainerDefinition` 屬性`Essential`設定為 true 或 false。

## 設定網路連線
<a name="containers-custom-network"></a>

您可以自訂網路存取，以允許外部流量連接到容器機群中的任何容器。例如，您必須建立與執行遊戲伺服器程序之容器的網路連線，讓遊戲用戶端可以加入並玩遊戲。遊戲用戶端會使用連接埠和 IP 地址連線至遊戲伺服器。

在容器機群中，用戶端和伺服器之間的連線不是直接的。在內部，容器中的程序會接聽*容器連接埠*。在外部，傳入流量會使用*連線連接埠*連線至機群執行個體。 Amazon GameLift Servers會維護內部容器連接埠與對外連線連接埠之間的映射，以便傳入流量路由至執行個體上的正確程序。

Amazon GameLift Servers 為您的網路連線提供額外的控制層。每個容器機群都有*傳入許可*設定，可讓您控制對每個對外連線連接埠的存取。例如，您可以移除所有連線連接埠的許可，以關閉機群容器的所有存取。

您可以更新機群的傳入許可、連線連接埠和容器連接埠。

**警告**  
如果您提供自訂 InstanceConnectionPortRange 或 InstanceInboundPermissions， Amazon GameLift Servers 將不再管理機群的任一值。您必須設定兩個欄位，以避免未定義的行為。

**設定容器連接埠範圍**  
在每個容器定義中設定容器連接埠範圍。這是容器群組定義的必要參數。您需要設定足夠的連接埠，以容納所有同時執行且需要外部存取的程序。有些容器不需要任何連接埠。  
執行遊戲伺服器的遊戲伺服器容器需要一個連接埠，才能用於每個同時執行的遊戲伺服器程序。遊戲伺服器程序會監聽指派的連接埠，並將其回報給 Amazon GameLift Servers。

**設定連線連接埠範圍**  
使用一組連線連接埠設定容器機群。連線連接埠提供執行您容器之機群執行個體的外部存取權。 Amazon GameLift Servers會指派連線連接埠，並視需要將其映射至容器連接埠。  
根據預設， 會Amazon GameLift Servers計算所有容器群組所需的連接埠數目，並設定連接埠範圍以容納它們。我們強烈建議您使用Amazon GameLift Servers計算值，這些值會在您將更新部署至容器群組定義時更新。如果您需要自訂連線連接埠範圍，請使用下列指引。  
當您建立容器機群時，請定義連線連接埠範圍 （請參閱 [ ContainerFleet：InstanceConnectionPortRange](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_ContainerFleet.html))。請確定範圍有足夠的連接埠可對應至機群中兩個容器群組中所有容器所定義的每個容器連接埠。若要計算所需的最小連線連接埠，請使用下列公式：  
`[Total number of container ports defined for containers in the game server container group] * [Number of game server container groups per instance] + [Total number of container ports defined for containers in the per-instance container group]`  
最佳實務是連接連接埠數量下限的兩倍。  
連線連接埠的數量可能會限制每個執行個體的遊戲伺服器容器群組數量。如果機群每個執行個體只有一個遊戲伺服器容器群組的足夠連線連接埠，則 只會Amazon GameLift Servers部署一個遊戲伺服器容器群組，即使執行個體具有適用於多個遊戲伺服器容器群組的足夠運算能力。

**設定傳入許可**  
傳入許可透過指定要為傳入流量開啟的連線連接埠，來控制容器機群的外部存取。您可以使用此設定，視需要開啟和關閉機群的網路存取。  
根據預設， 會Amazon GameLift Servers計算所有容器群組所需的連接埠數目，並設定連接埠範圍以容納它們。我們強烈建議您使用Amazon GameLift Servers計算值，這些值會在您將更新部署至容器群組定義時更新。如果您需要自訂連線連接埠範圍，請使用下列指引。  
當您建立容器機群時，請定義一組傳入許可 （請參閱 [ ContainerFleet：InstanceInboundPermissions](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_ContainerFleet.html))。傳入許可連接埠應與機群的連線連接埠範圍相符。  
由於容器連接埠是從 InstanceConnectionPortRange 隨機選取，為了確保可以進行工作階段連線，InstanceConnectionPortRange 中的所有連接埠都應涵蓋在 InstanceInboundPermissions 中的連接埠

**範例藍本**  
此範例說明如何設定所有三個網路連線屬性。  
+ 我們機群的遊戲伺服器容器群組有 1 個容器，可執行 1 個遊戲伺服器程序。

  在遊戲伺服器容器群組定義中，我們會設定此容器的 `PortConfiguration` 參數，如下所示：

  ```
  "PortConfiguration": {
    "ContainerPortRanges": [ { "FromPort": 10, "ToPort": 20, "Protocol": "TCP"} ]  }
  ```
+ 我們的機群也具有具有 1 個容器的每個執行個體容器群組。它有 1 個程序需要網路存取。在每個執行個體容器定義中，我們設定此容器的 `PortConfiguration` 參數，如下所示：

  ```
  "PortConfiguration": {
    "ContainerPortRanges": [ { "FromPort": 25, "ToPort": 25, "Protocol": "TCP"} ]  }
  ```
+ 我們的機群為每個機群執行個體設定了 20 個遊戲伺服器容器群組。根據此資訊，我們可以使用 公式來計算所需的連線連接埠數量：
  + 下限：**21 個連接埠** 【1 個遊戲伺服器容器連接埠 \$1 每個執行個體 20 個遊戲伺服器容器群組 \$1 每個執行個體容器連接埠 1 個】
  + 最佳實務：**42 個連接埠** 【最小連接埠 \$1 2】

  建立容器機群時，我們會設定 `InstanceConnectionPortRange` 參數，如下所示：

  ```
  "InstanceConnectionPortRange": { "FromPort": 1010, "ToPort": 1071 }
  ```
+ 我們希望允許存取所有可用的連線連接埠。建立容器機群時，我們會設定 `InstanceInboundPermissions` 參數，如下所示：

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

## 設定容器的運作狀態檢查
<a name="containers-design-fleet-health"></a>

如果容器遇到終端故障並停止執行，容器會自動重新啟動。如果容器視為必要，它會提示整個容器群組重新啟動。

所有遊戲伺服器容器都會自動視為必要。支援容器可以指定為必要容器，但他們需要有機制來報告運作狀態。您也可以設定非必要支援容器的運作狀態檢查。

您可以定義其他自訂條件來測量容器運作狀態，並使用運作狀態檢查來測試該條件。若要設定容器運作狀態檢查，您可以在 Docker 容器映像或容器定義中定義它。如果您在容器定義中設定運作狀態檢查，它會覆寫容器映像中的任何設定。

為容器運作狀態檢查設定下列`SupportContainerDefinition`屬性：
+ `Command` — 提供可檢查容器運作狀態某些層面的命令。您可以決定使用哪些條件來測量運作狀態。命令必須導致結束值為 1 （運作狀態不良） 或 0 （運作狀態良好）。
+ `StartPeriod` — 指定運作狀態檢查失敗開始計數之前的初始延遲。此延遲可讓容器有時間引導其程序。
+ `Interval` — 決定執行運作狀態檢查命令的頻率。您想要多快偵測和解決容器故障？
+ `Timeout` — 決定等待成功或失敗的時間，然後再重試運作狀態檢查命令。運作狀態檢查命令需要多長時間才能完成？
+ `Retries` — 在註冊失敗之前，應該重試多少次運作狀態檢查命令？

## 設定容器相依性
<a name="containers-design-fleet-dependencies"></a>

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

相依性的關鍵使用案例是為容器群組建立啟動和關閉序列。

例如，您可能希望容器 A 先啟動，並在容器 B 和 C 啟動之前成功完成。若要達成此目的，請先建立容器 A 上容器 B 的相依性，條件為容器 A 必須成功完成。然後為容器 A 上具有相同條件的容器 C 建立相依性。啟動序列會以關機的相反順序發生。

## 設定容器機群
<a name="containers-design-fleet-config"></a>

當您建立容器機群時，請考慮下列決策點。這些點大多取決於您的容器架構和組態。

**決定您要部署機群的位置**  
一般而言，您想要在玩家附近的地理位置部署機群，以將延遲降至最低。您可以將容器機群部署到任何 AWS 區域 Amazon GameLift Servers支援的 。如果您想要將相同的遊戲伺服器部署到其他地理位置，您可以將遠端位置新增至機群，包括 AWS 區域 和 Local Zones。對於多位置機群，您可以在每個機群位置獨立調整容量。如需支援的機群位置的詳細資訊，請參閱 [Amazon GameLift Servers 服務位置](gamelift-regions.md)。  
考慮使用 [UDP Ping 指標](reference-udp-ping-beacons.md) 收集不同地理位置的網路延遲資料，以預測玩家裝置和潛在機群位置之間的延遲。這些特殊端點接受 UDP 訊息，而非傳統的 ICMP ping，因而提供了準確的延遲測量，以協助您選取最佳的機群位置。

**為您的機群選擇執行個體類型和大小**  
Amazon GameLift Servers 支援各種 Amazon EC2 執行個體類型，所有類型都可以與容器機群搭配使用。執行個體類型可用性和價格因位置而異。您可以在 Amazon GameLift Servers主控台 （在**資源、執行個體和服務配額**下） 中檢視依位置篩選的支援執行個體類型清單。  
選擇執行個體類型時，請先考慮執行個體系列。執行個體系列提供各種 CPU、記憶體、儲存和聯網功能的組合。取得 [EC2 執行個體系列](https://aws.amazon.com/ec2/instance-types/)的詳細資訊。在每個系列中，您有各種執行個體大小可供選擇。選取執行個體大小時，請考慮下列問題：  
+ 可支援工作負載的執行個體大小下限是多少？ 使用此資訊可消除任何過小的執行個體類型。
+ 哪些執行個體類型大小非常適合您的容器架構？ 理想情況下，您想要選擇可容納遊戲伺服器容器群組多個複本的大小，並將浪費的空間減到最少。
+ 擴展精細程度對您的遊戲有何意義？ 擴展機群容量涉及新增或移除執行個體，而每個執行個體代表託管特定數量遊戲工作階段的能力。考慮您要為每個執行個體新增或移除多少容量。如果玩家的需求因分鐘而異，那麼使用可以託管數百或數千個遊戲工作階段的非常大型執行個體可能很有意義。相反地，您可能偏好使用較小的執行個體類型進行更精細的擴展控制。
+ 是否有根據大小節省成本？ 由於可用性，您可能會發現特定執行個體類型的成本因位置而異。

**設定其他選用機群設定**  
您可以在設定容器機群時使用下列選用功能：  
+ 設定您的遊戲伺服器以存取其他 AWS 資源。請參閱 [將Amazon GameLift Servers託管遊戲伺服器連接到其他 AWS 資源](gamelift-sdk-server-resources.md)。
+ 保護具有作用中玩家的遊戲工作階段，避免在縮減規模事件期間提早終止。
+ 限制一個人可以在有限的時間內在機群上建立的遊戲工作階段數量。