Personalizar uma frota de contêineres do Amazon GameLift Servers
Os tópicos desta seção descrevem alguns dos recursos opcionais para contêineres gerenciados pelo Amazon GameLift Servers. Você pode optar por usar qualquer um ou todos esses atributos.
Tópicos
Definir limites de recursos
Para cada grupo de contêineres, você pode determinar quanta memória e capacidade de processamento o grupo de contêineres precisa para executar seu software. O Amazon GameLift Servers depende dessas informações para gerenciar recursos em todo o grupo de contêineres. Ele também usa essas informações para calcular quantos grupos de contêineres de servidores de jogos uma imagem da frota pode conter. Você também pode definir limites para contêineres individuais.
Você pode definir um limite máximo de memória e capacidade de computação para um grupo de contêineres. Por padrão, esses recursos são compartilhados por todos os contêineres do grupo. Você pode personalizar ainda mais o gerenciamento de recursos definindo limites para contêineres individuais.
- Definir limites opcionais para contêineres individuais
-
Definir limites de recursos específicos para contêineres permite que você exerça maior controle sobre como contêineres individuais podem usar os recursos do grupo. Se você não definir limites específicos para contêineres, todos os contêineres do grupo compartilharão os recursos do grupo. O compartilhamento oferece maior flexibilidade para usar os recursos onde eles são necessários. Também aumenta o potencial de os processos competirem entre si e resultarem em falhas no contêiner.
Defina qualquer uma das propriedades de
ContainerDefinitiona seguir para qualquer contêiner.-
MemoryHardLimitMebibytes— Definir um limite máximo de memória para o contêiner. Se o contêiner exceder esse limite, isso resultará em uma reinicialização. -
Limite de
Vcpu— Reserve uma quantidade mínima de recursos de vCPU para uso exclusivo do contêiner. O contêiner sempre tem o valor reservado disponível. Ele pode exceder esse mínimo a qualquer momento, se houver recursos adicionais disponíveis. (1024 unidades de CPU equivalem a 1 vCPU.)
-
- Definir limites totais de recursos para um grupo de contêineres
-
Se você definir limites para contêineres individuais, talvez seja necessário modificar a quantidade de recursos de memória e vCPU que o grupo de contêineres precisa. O objetivo é alocar recursos suficientes para otimizar o desempenho do servidor de jogos. O Amazon GameLift Servers usa esses limites para calcular como agrupar grupos de contêineres de servidores de jogos em uma instância de frota. Você também os utilizará ao escolher um tipo de instância para uma frota de contêineres.
Calcular a memória total e a vCPU necessárias para um grupo de contêineres. Considere o seguinte:
-
Quais são todos os processos que são executados em todos os contêineres do grupo de contêineres? Some os recursos necessários para esses processos. Anote quaisquer limites específicos do contêiner.
-
Quantos processos simultâneos de servidor de jogos você planeja executar em cada grupo de contêineres? Você determina isso na imagem do contêiner do seu servidor de jogos.
Com base em sua estimativa dos requisitos do grupo de contêineres, defina as seguintes propriedades de
ContainerGroupDefinition:-
TotalMemoryLimitMebibytes— Definir um limite máximo de memória para o grupo de contêineres. Todos os contêineres do grupo compartilham a memória alocada. Se você definir limites de contêineres individuais, o limite total de memória deverá ser igual ou maior que o limite máximo de memória específico do contêiner. -
TotalVcpuLimit— Definir um limite máximo de vCPU para o grupo de contêineres. Todos os contêineres do grupo compartilham os recursos de CPU alocados. Se você definir limites de contêineres individuais, o limite total de CPU deverá ser igual ou maior que a soma de todos os limites de CPU específicos dos contêineres. Como prática recomendada, considere definir esse valor para dobrar a soma dos limites de CPU do contêiner.
-
- Exemplo de cenário
-
Digamos que estamos definindo um grupo de contêineres de servidores de jogos com os três contêineres a seguir:
-
O contêiner A é o nosso contêiner de servidor de jogos. Estimamos os requisitos de recursos para um servidor de jogos em 512 MiB e 1024 de CPU. Planejamos que o contêiner execute 1 processo de servidor. Como esse contêiner executa nosso software mais crítico, não definimos limite de memória ou limite de reserva de vCPU.
-
O contêiner B é um contêiner de suporte com requisitos de recursos estimados em 1024 MiB e 1536 de CPU. Definimos um limite de memória de 2048 MiB e um limite de reserva de CPU de 1024 de CPU.
-
O contêiner C é outro contêiner de suporte. Definimos um limite de memória absoluto de 512 MiB e um limite de reserva de CPU de 512 de CPU.
Usando essas informações, definimos os seguintes limites totais para o grupo de contêineres:
-
Limite total de memória: 7680 MiB. Esse valor excede o limite máximo de memória (1024 MiB).
-
Limite total de CPU: 13312 CPU. Esse valor excede a soma do limite de CPU (1024+512 CPU).
-
Designar contêineres essenciais
Para um grupo de contêineres por instância, designe cada contêiner como essencial ou não essencial. Os grupos de contêineres por instância devem ter pelo menos um contêiner de suporte essencial. O contêiner essencial faz o trabalho crítico do grupo de contêineres. Espera-se que o contêiner essencial esteja sempre funcionando. Se falhar, todo o grupo de contêineres será reiniciado.
Defina propriedade de ContainerDefinition como Essential verdadeira ou falsa para cada contêiner.
Configurar conexões de rede
Você pode personalizar o acesso à rede para permitir que o tráfego externo se conecte a qualquer contêiner em uma frota de contêineres. Por exemplo, você deve estabelecer conexões de rede com o contêiner que executa os processos de seu servidor de jogos, para que os clientes do jogo possam entrar e jogar seu jogo. Clientes de jogos se conectam aos servidores de jogos usando portas e endereços IP.
Em uma frota de contêineres, a conexão entre cliente e servidor não é direta. Internamente, um processo em um contêiner recebe em uma porta de contêiner. Externamente, o tráfego de entrada se conecta a uma instância de frota usando uma porta de conexão. O Amazon GameLift Servers mantém os mapeamentos entre as portas internas do contêiner e as portas de conexão externas, para que o tráfego de entrada seja roteado para o processo correto na instância.
O Amazon GameLift Servers fornece uma camada extra de controle para suas conexões de rede. Cada frota de contêineres tem uma configuração de permissões de entrada, que permite controlar o acesso a cada porta de conexão externa. Por exemplo, você pode remover as permissões de todas as portas de conexão para desligar todo o acesso aos contêineres da frota.
Você pode atualizar as permissões de entrada, as portas de conexão e as portas de contêineres de uma frota.
Atenção
Se você fornecer um InstanceConnectionPortrange ou InstanceInboundPermissions personalizado, o Amazon GameLift Servers não gerenciará mais nenhum dos valores da sua frota. Você deve definir os dois campos para evitar um comportamento indefinido.
- Configurar intervalos de portas do contêiner
-
Configure os intervalos de portas do contêiner como parte da definição de cada contêiner. Esse é um parâmetro obrigatório para a definição de um grupo de contêineres. Você precisa configurar portas suficientes para acomodar todos os processos em execução simultânea que precisam de acesso externo. Alguns contêineres não precisarão de portas.
Seu contêiner de servidor de jogos, que executa seus servidores de jogos, precisa de uma porta para cada processo de servidor de jogos em execução simultânea. O processo do servidor do jogo escuta a porta atribuída e a reporta ao Amazon GameLift Servers.
- Configurar intervalos de portas de conexão
-
Configure sua frota de contêineres com um conjunto de portas de conexão. As portas de conexão fornecem acesso externo às instâncias da frota que estão executando seus contêineres. O Amazon GameLift Servers atribui portas de conexão e as mapeia para portas de contêiner conforme necessário.
Por padrão, o Amazon GameLift Servers calcula o número de portas necessárias para todos os grupos de contêineres e define um intervalo de portas para acomodá-los. É altamente recomendável usar valores calculados pelo Amazon GameLift Servers, que são atualizados quando você implanta atualizações em uma definição de grupo de contêineres. Se você precisar personalizar os intervalos de portas de conexão, use as orientações a seguir.
Ao criar uma frota de contêineres, defina um intervalo de portas de conexão (consulte ContainerFleet:InstanceConnectionPortrange). Certifique-se de que o intervalo tenha portas suficientes para mapear para cada porta de contêiner definida em todos os contêineres nos dois grupos de contêineres da frota. Para calcular as portas de conexão mínimas necessárias, use a seguinte fórmula:
[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]Como prática recomendada, dobre o número mínimo de portas de conexão.
nota
O número de portas de conexão pode potencialmente limitar o número de grupos de contêineres de servidores de jogos por instância. Se uma frota tiver apenas portas de conexão suficientes para um grupo de contêineres de servidores de jogos por instância, o Amazon GameLift Servers implantará somente um grupo de contêineres de servidores de jogos, mesmo que as instâncias tenham capacidade computacional suficiente para vários grupos de contêineres de servidores de jogos.
- Configurar permissões de entrada
As permissões de entrada controlam o acesso externo a uma frota de contêineres especificando quais portas de conexão devem ser abertas para o tráfego de entrada. Você pode usar essa configuração para ativar e desativar o acesso à rede de uma frota conforme necessário.
Por padrão, o Amazon GameLift Servers calcula o número de portas necessárias para todos os grupos de contêineres e define um intervalo de portas para acomodá-los. É altamente recomendável usar valores calculados pelo Amazon GameLift Servers, que são atualizados quando você implanta atualizações em uma definição de grupo de contêineres. Se você precisar personalizar os intervalos de portas de conexão, use as orientações a seguir.
Ao criar uma frota de contêineres, defina um conjunto de permissões de entrada (consulte containerfleet:instanceInboundPermissions). As portas de permissão de entrada devem corresponder aos intervalos de portas de conexão da frota.
nota
Como as portas de contêineres são selecionadas aleatoriamente no InstanceConnectionPorRange, para garantir que as conexões de sessão possam ser feitas, todas as portas em InstanceConnectionPorRange devem ser cobertas por portas em InstanceInboundPermissions
- Exemplo de cenário
Este exemplo ilustra como definir as três propriedades de conexão.
-
O grupo de contêineres de servidores de jogos da nossa frota tem 1 contêiner, que executa 1 processo de servidor de jogos.
Na definição do grupo de contêineres do servidor de jogos, definimos o parâmetro
PortConfigurationpara esse contêiner da seguinte forma:"PortConfiguration": { "ContainerPortRanges": [ { "FromPort": 10, "ToPort": 20, "Protocol": "TCP"} ] } -
Nossa frota também tem um grupo de contêineres por instância com 1 contêiner. Ela tem 1 processo que precisa de acesso à rede. Na definição do grupo de contêineres por instância, definimos o parâmetro
PortConfigurationpara esse contêiner da seguinte forma:"PortConfiguration": { "ContainerPortRanges": [ { "FromPort": 25, "ToPort": 25, "Protocol": "TCP"} ] }
-
Nossa frota é configurada com 20 grupos de contêineres de servidores de jogos por instância da frota. Com essas informações, podemos usar a fórmula para calcular o número de portas de conexão necessárias:
-
Mínimo: 21 portas [1 porta de contêiner de servidor de jogos * 20 grupos de contêineres de servidores de jogos por instância + 1 porta de contêiner por instância]
-
Melhor prática: 42 portas [portas mínimas* 2]
Ao criar a frota de contêineres, definimos o parâmetro
InstanceConnectionPortRangeda seguinte forma:"InstanceConnectionPortRange": { "FromPort": 1010, "ToPort": 1071 } -
-
Queremos permitir o acesso a todas as portas de conexão disponíveis. Ao criar a frota de contêineres, definimos o parâmetro
InstanceInboundPermissionsda seguinte forma:"InstanceInboundPermissions": [ {"FromPort": 1010, "ToPort": 1071, "IpRange": "10.24.34.0/23", "Protocol": "TCP"} ]
-
Configurar verificações de saúde para contêineres
Um contêiner é reiniciado automaticamente se ocorrer uma falha terminal e parar de funcionar. Se um contêiner for considerado essencial, ele solicitará que todo o grupo de contêineres seja reiniciado.
Todos os contêineres do servidor de jogos são automaticamente considerados essenciais. Os contêineres de suporte podem ser designados como essenciais, mas precisam ter um mecanismo para relatar a integridade. Você também pode definir verificações de integridade para contêineres de suporte não essenciais.
Você pode definir critérios personalizados adicionais para medir a integridade do contêiner e usar uma verificação de integridade para testar esses critérios. Para configurar uma verificação de integridade do contêiner, você pode defini-la em uma imagem de contêiner do Docker ou em sua definição de contêiner. Se você definir uma verificação de integridade na definição do contêiner, ela substituirá todas as configurações na imagem do contêiner.
Defina as propriedades de SupportContainerDefinition a seguir para uma verificação de integridade de contêiner:
-
Command— Forneça um comando que verifique algum aspecto da integridade do contêiner. Você decide quais critérios usar para medir a integridade. O comando deve resultar em um valor de saída de 1 (não íntegro) ou 0 (íntegro). -
StartPeriod— Especifique um atraso inicial antes que as falhas na verificação de integridade comecem a ser contadas. Esse atraso dá ao contêiner tempo para inicializar seus processos. -
Interval— Decida com que frequência executar o comando de verificação de integridade. Com que rapidez você deseja detectar e resolver uma falha no contêiner? -
Timeout— Decida quanto tempo esperar pelo sucesso ou pela falha antes de tentar novamente o comando de verificação de integridade. Quanto tempo o comando de verificação de integridade deve levar para ser concluído? -
Retries— Quantas vezes o comando de verificação de integridade deve ser repetido antes de registrar uma falha?
Definir dependências de contêiner
Em cada grupo de contêineres, você pode definir dependências entre contêineres com base no status do contêiner. Uma dependência afeta quando o contêiner dependente pode ser iniciado ou encerrado com base no status de outro contêiner.
Um caso de uso importante para dependências é criar sequências de startup e desligamento para o grupo de contêineres.
Por exemplo, você pode querer que o contêiner A inicialize primeiro e seja concluído com êxito antes do início dos contêineres B e C. Para conseguir isso, primeiro crie uma dependência para o contêiner B no contêiner A, com a condição de que o contêiner A seja concluído com êxito. Em seguida, crie uma dependência para o contêiner C no contêiner A com a mesma condição. As sequências de startup ocorrem na ordem inversa do desligamento.
Configurar uma frota de contêineres
Ao criar uma frota de contêineres, considere os seguintes pontos de decisão. A maioria desses pontos depende da arquitetura e da configuração do contêiner.
- Decida onde você deseja implantar sua frota
-
Em geral, você deseja implantar suas frotas geograficamente perto de seus jogadores para minimizar a latência. Você pode implantar sua frota de contêineres em qualquer Região da AWS a que o Amazon GameLift Servers ofereça suporte. Se você quiser implantar o mesmo servidor de jogo em outras localizações geográficas, você pode adicionar locais remotos à frota, incluindo Regiões da AWS e Zonas Locais. Para uma frota multilocal com vários locais, você pode ajustar a capacidade de forma independente em cada local da frota. Para obter mais informações sobre localizações de frotas que recebem suporte, consulte Locais de serviço do Amazon GameLift Servers.
Considere utilizar Sinalizadores de ping UDP para coletar dados de latência de rede em várias localizações geográficas para prever a latência entre os dispositivos dos jogadores e possíveis locais da frota. Esses endpoints especiais aceitam mensagens UDP em vez de pings ICMP tradicionais, fornecendo medições de latência precisas para ajudar você a selecionar os locais ideais da frota.
- Escolha um tipo e tamanho de instância para sua frota
-
O Amazon GameLift Servers suporta uma ampla variedade de tipos de instâncias do Amazon EC2, todas disponíveis para uso com uma frota de contêineres. A disponibilidade e o preço do tipo de instância variam de acordo com o local. Você pode ver uma lista dos tipos de instância compatíveis, filtrados por localização, no console do Amazon GameLift Servers (em Recursos, Instância e service quotas).
Ao escolher um tipo de instância, primeiro considere a família de instâncias. As famílias de instância oferecem combinações variadas de capacidades de rede, CPU, memória e armazenamento. Obtenha mais informações sobre famílias de instâncias do EC2
. Em cada família, você tem uma variedade de tamanhos de instância para escolher. Considere os seguintes problemas ao selecionar um tamanho de instância: -
Qual é o tamanho mínimo de instância que pode suportar sua workload? Use essas informações para eliminar qualquer tipo de instância que seja muito pequeno.
-
Quais tamanhos de tipo de instância são adequados para sua arquitetura de contêiner? O ideal é escolher um tamanho que possa acomodar várias cópias do seu grupo de contêineres de servidores de jogos com o mínimo de espaço desperdiçado.
-
Qual granularidade de escala faz sentido para seu jogo? A capacidade da frota de escalar envolve adicionar ou remover instâncias, e cada instância representa a capacidade de hospedar um número específico de sessões de jogo. Considere a capacidade que você deseja adicionar ou remover com cada instância. Se a demanda dos jogadores variar em milhares de minuto a minuto, talvez faça sentido usar instâncias muito grandes que possam hospedar centenas ou milhares de sessões de jogo. Por outro lado, você pode preferir um controle de escalabilidade mais refinado com tipos de instância menores.
-
Há economia de custos disponível com base no tamanho? Você pode descobrir que o custo de certos tipos de instância varia de acordo com o local devido à disponibilidade.
-
- Definir outras configurações opcionais da frota
É possível usar os seguintes atributos opcionais ao configurar uma frota de contêineres:
-
Configure seus servidores de jogos para acessar outros recursos da AWS. Consulte Conecte seu servidor de jogos hospedado pelo Amazon GameLift Servers a outros recursos da AWS.
-
Impeça que sessões de jogos com jogadores ativos sejam encerradas prematuramente durante um evento de redução de escala.
-
Limite o número de sessões de jogo que um indivíduo pode criar na frota dentro de um período de tempo limitado.
-