Como configurar a alocação de vários clusters

Nesta página, explicamos como configurar a alocação de vários clusters para o Game Servers A alocação de vários clusters permite que você solicite um GameServer em um estado Ready de um cluster em um realm e receba um GameServer em estado Ready de qualquer cluster alocado nesse realm. A alocação de vários clusters requer configuração manual para permitir que os clusters se conectem uns aos outros e também ao endpoint da alocação de vários clusters.

Para saber mais sobre alocações GameServer, consulte o guia de início rápido sobre como criar uma frota do Game Servers do Agones para ter uma visão geral.

Antes de começar

Antes de começar, recomendamos que você se familiarize com os principais conceitos na Visão geral do Game Servers. Verifique se você também realizou as seguintes tarefas:

  • Verifique se você ativou a API Game Services.
  • Ativar a API Game Services
  • Escolha um shell com a CLI gcloud instalada ou use um cliente de API:
  • Cloud Shell

    Para iniciar o Cloud Shell, execute os seguintes passos:

    1. Acesse o Console do Google Cloud.

      Console do Google Cloud

    2. No canto superior direito do console, clique no botão Ativar Cloud Shell:

    Uma sessão do Cloud Shell é aberta dentro de um quadro inferior no console. Use esse shell para executar comandos gcloud.

    Shell local

    Instale a CLI gcloud.

    Verifique se você definiu o projeto padrão desejado para a Google Cloud CLI. Caso contrário, será necessário especificar a sinalização --project explicitamente para cada comando mais tarde:

    gcloud config list project
    

    Caso contrário, execute o seguinte comando para definir um projeto padrão, substituindo PROJECT_ID pelo ID do projeto que você quer:

    gcloud config set project PROJECT_ID
    

    Execute o seguinte comando para verificar a versão da Google Cloud CLI. O Game Servers requer a versão 306.0.0 ou mais recente da CLI gcloud.

    gcloud version
    

    Para atualizar a instalação, execute o seguinte comando:

    gcloud components update
    

    curl / PowerShell

    Para usar a API REST com curl ou o Windows PowerShell, faça o seguinte:

    1. Crie uma conta de serviço.
    2. Faça o download de uma chave privada como um arquivo JSON.
    3. Set the environment variable GOOGLE_APPLICATION_CREDENTIALS to the path of the JSON file that contains your credentials. This variable applies only to your current shell session, so if you open a new session, set the variable again.

    Biblioteca de cliente

    O Game Servers do Google Cloud pode ser controlado de maneira programática usando uma biblioteca de cliente. Consulte Visão geral das bibliotecas de cliente para instruções sobre como usar a biblioteca e fazer a autenticação.

Como configurar o serviço de alocador do Agones

Verifique se o serviço de alocador do Agones está configurado para a instalação do Agones e se a alocação de cluster único funciona usando o mesmo guia. Observe que, por padrão, o serviço agones-allocator não tem um certificado de serviço válido instalado e que o certificado precisa ser substituído. É possível reservar um endereço IP regional do Google Cloud Platform e instalar o agones-allocator usando o IP reservado, que também emite um certificado válido para o serviço. Para reservar um IP, execute o seguinte comando:

gcloud compute addresses create allocator-service --region REGION

Para encontrar o IP reservado, execute o seguinte comando:

gcloud compute addresses describe allocator-service --region REGION --format="value(address)"

Em seguida, instale/faça upgrade do Agones passando o IP reservado como RESERVED_IP do comando anterior:

helm upgrade RELEASE --install --set agones.allocator.http.loadBalancerIP=RESERVED_IP --set agones.allocator.service.loadBalancerIP=RESERVED_IP --namespace agones-system --create-namespace agones/agones

RESERVED_IP é o endereço IP a ser usado para o serviço agones-allocator.

RELEASE é o nome da versão do Agones para a instalação do gráfico do Helm.

Como instalar o Citadel

O Game Servers usa o projeto Citadel como gerenciador de certificados para o certificado de alocação de vários clusters do lado do cliente, usado pelo Agones para facilitar conexões seguras entre clusters. Você precisa instalá-lo em cada cluster do Google Kubernetes Engine registrado com o Game Servers.

Para cada namespace no cluster, o Citadel emitirá um secret istio.default do Kubernetes usado pelo Game Servers como certificado do lado do cliente.

Pule esta etapa se já tiver instalado o Istio no cluster do Google Kubernetes Engine. Atualmente, há problemas conhecidos com a compatibilidade do Agones com uma instalação completa do Istio.

Se você for usuário do Terraform, poderá instalar o Citadel usando o Terraform. Você pode analisar os arquivos de configuração de exemplo sobre como instalar o Citadel usando o Terraform no GitHub.

Este guia pressupõe que você tenha as ferramentas de linha de comando instaladas para o helm v3 e o git.

Para instalar o Citadel:

  1. Clone o repositório do Istio no GitHub:

    git clone -b release-1.5 https://github.com/istio/istio.git
    
  2. Crie um novo namespace para o Istio:

    kubectl create ns istio-system
    

  3. Copie e execute cada um dos seguintes comandos para gerar arquivos de instalação do Citadel YAML a partir dos modelos do Helm do Istio:

    helm template istio/install/kubernetes/helm/istio --name-template istio --namespace istio-system -s charts/security/templates/serviceaccount.yaml -s charts/security/templates/clusterrole.yaml -s charts/security/templates/clusterrolebinding.yaml -s charts/security/templates/deployment.yaml > citadel.yaml
    

  4. Em seguida, execute o comando a seguir para aplicar ao cluster do Google Kubernetes Engine o arquivo YAML gerado na etapa anterior:

    kubectl apply -f citadel.yaml
    
  5. Valide se a Citadel está funcionando corretamente:

    kubectl get pods --namespace=istio-system
    

    Verifique se a implantação do Citadel está em execução em um único pod.

Requisitos de rede para alocação de vários clusters

Para que a alocação de vários clusters funcione em seu realm, você precisa garantir que cada cluster esteja executando um serviço de alocação em que o serviço tem um endereço externo público.

Para verificar se isso está configurado, verifique se um balanceador de carga externo está alocado para o serviço:

kubectl get service agones-allocator -n agones-system
NAME               TYPE                      CLUSTER-IP   EXTERNAL-IP    PORT(S)
agones-allocator   LoadBalancer              10.86.3.77   RESERVED_IP  443:30219/TCP

RESERVED_IP não pode estar vazio.

Como validar a alocação de vários clusters

Para testar o processo de alocação, conclua as seguintes etapas:

  1. Registre dois clusters do Game Servers no seu realm e configure-os para alocação de vários clusters conforme mostrado acima.

  2. Crie uma implantação de Game Servers.

  3. Crie uma configuração de servidores de jogos com uma especificação de frota que tenha réplicas definidas como 5 e o rótulo gameName: udp-server aplicado.

  4. Atualize o lançamento da implantação do Game Servers para ativar a configuração.

  5. Copie o seguinte YAML para um LOCAL_FILE :

    apiVersion: "allocation.agones.dev/v1"
    kind: GameServerAllocation
    spec:
      multiClusterSetting:
        enabled: true
      required:
        matchLabels:
          gameName: udp-server
    

Use o seguinte comando para aplicar o arquivo YAML a um dos clusters do Game Servers no seu realm:

kubectl create -f LOCAL_FILE -o yaml

Isso alocará uma das dez réplicas prontas nos dois clusters. Repita o comando mais nove vezes e garanta que todas as dez réplicas em ambos os clusters estejam alocadas.

Agora, qualquer endpoint em qualquer cluster no realm pode ser usado para alocar um GameServer de qualquer cluster no realm. As alocações de GameServer são balanceadas por carga em todos os clusters no realm usando um esquema round-robin.

Solução de problemas

Se você tiver problemas com os procedimentos deste guia, recomendamos que consulte os seguintes documentos de solução de problemas:

Nenhuma política de alocação de vários clusters foi especificada

Você tenta alocar um servidor de jogo e vê o seguinte erro:

no multi-cluster allocation policy is specified

Verifique se você instalou o Citadel corretamente no cluster certificando-se de que o secret istio.default seja criado pelo Citadel no namespace do servidor de jogos:

kubectl get secret istio.default -n NAMESPACE

Certificado assinado por autoridade desconhecida

Você tenta alocar um servidor de jogo e vê o seguinte erro:

transport: authentication handshake failed: x509: certificate signed by unknown authority

Verifique se você definiu corretamente o secret allocator-tls-ca do Kubernetes para todos os clusters. A instalação do Helm também atualiza o secret allocator-tls-ca, mas se você alterar manualmente o secret TLS, será necessário atualizar o secret allocator-tls-ca também. Para verificar a autoridade de certificação, execute os seguintes comandos:

kubectl get secret allocator-tls-ca -n agones-system -ojsonpath="{.data.tls-ca\.crt}" | base64 -d > ca.crt
kubectl get secret allocator-tls -n agones-system -ojsonpath="{.data.tls\.crt}" | base64 -d > tls.crt
openssl verify -verbose -CAfile ca.crt tls.crt

A verificação deve imprimir tls.crt: OK.

Causa raiz corrigida, e o problema permanece

A reconciliação das alterações feitas em um único cluster em todos os clusters pode levar até uma hora. É possível acionar a reconciliação imediatamente alterando os recursos dos Game Servers, por exemplo, atualizando rótulos em um recurso de realm:

gcloud game servers realms update REALM_NAME --update-labels=usage=testing --location=REALM_LOCATION

A seguir