Configura la asignación de varios clústeres

En esta página, se explica cómo configurar la asignación de varios clústeres para Game Servers. La asignación de varios clústeres te permite solicitar un GameServer en un estado Ready desde un clúster dentro de un dominio y obtener un GameServer en un estado Ready de cualquier clúster dentro de ese dominio. La asignación de varios clústeres requiere una configuración manual y la configuración para permitir que los clústeres se conecten entre sí y también al extremo de asignación de varios clústeres.

Para obtener más información sobre las asignaciones GameServer, consulta Create a Game Server Fleet quickstart de Agones para obtener una descripción general completa.

Antes de comenzar

Antes de comenzar, te recomendamos que te familiarices con los conceptos clave en la Descripción general de servidores para juegos. Asegúrate de haber realizado las siguientes tareas:

  • Asegúrate de haber habilitado la API de los servicios de juego.
  • Habilitar la API de servicios de juego
  • Elige una shell que tenga gcloud CLI instalada o usa un cliente de API:
  • Cloud Shell

    Para iniciar Cloud Shell, sigue estos pasos:

    1. Ve a la consola de Google Cloud.

      Consola de Google Cloud

    2. Desde la esquina superior derecha de la consola, haz clic en el botón Activar Cloud Shell: .

    Se abrirá una sesión de Cloud Shell dentro de un marco en la parte inferior en la consola. Usa esta shell para ejecutar los comandos de gcloud.

    Shell local

    Instala la CLI de gcloud

    Verifica que hayas configurado el proyecto predeterminado que deseas para Google Cloud CLI (de lo contrario, debes especificar la marca --project de forma explícita para cada comando más adelante):

    gcloud config list project
    

    Si no puedes ejecutar el siguiente comando para configurar un proyecto predeterminado, reemplaza PROJECT_ID por el ID del proyecto deseado:

    gcloud config set project PROJECT_ID
    

    Ejecuta el siguiente comando para verificar tu versión de Google Cloud CLI. Game Servers requiere la versión 306.0.0 o una posterior de gcloud CLI.

    gcloud version
    

    Para actualizar la instalación, ejecuta el siguiente comando:

    gcloud components update
    

    curl / PowerShell

    Para usar la API de REST con curl o Windows PowerShell, haz lo siguiente:

    1. Crea una cuenta de servicio.
    2. Descarga una clave privada como un archivo 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 cliente

    Google Cloud Game Servers se puede controlar de manera programática mediante una biblioteca cliente. Consulta Descripción general de bibliotecas cliente a fin de obtener instrucciones para usar la biblioteca y la autenticación.

Configura el servicio de asignador de Agones

Asegúrate de que el servicio de asignador de Agones esté configurado para tu instalación de Agones y que la asignación de un solo clúster funcione con la misma guía. Ten en cuenta que, de forma predeterminada, el servicio agones-allocator no tiene instalado un certificado de servicio válido y se debe reemplazar el certificado. Puedes reservar una dirección IP regional de Google Cloud Platform y, luego, instalar el agones-allocator con la IP reservada, que también emite un certificado válido para el servicio. Para reservar una IP, ejecuta el siguiente comando:

gcloud compute addresses create allocator-service --region REGION

Para encontrar la IP reservada, ejecuta el siguiente comando:

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

Luego, instala o actualiza Agones mediante la transmisión de la IP reservada como RESERVED_IP del 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 es la dirección IP que se usará para el servicio agones-allocator.

RELEASE es el nombre de tu versión de Agones para la instalación del gráfico de helm.

Instala Citadel

Game Servers usa el proyecto Citadel como administrador de certificados para el certificado del cliente de asignación de varios clústeres, que usa Agones a fin de facilitar las conexiones seguras entre clústeres. Debes instalarlo en cada clúster de Google Kubernetes Engine registrado en Game Servers.

Para cada espacio de nombres en el clúster, Citadel emitirá un secret de Kubernetes istio.default que se usa en Game Servers como el certificado del cliente.

Puedes omitir este paso si ya instalaste Istio en tu clúster de Google Kubernetes Engine. Ten en cuenta que existen problemas conocidos en la compatibilidad con Agones con una instalación completa de Istio.

Si eres un usuario de Terraform, puedes instalar Citadel con Terraform. Puedes revisar los archivos de configuración de ejemplo para instalar Citadel con Terraform en GitHub.

En esta guía, se supone que tienes instaladas las herramientas de línea de comandos para helm v3 y git.

Para instalar Citadel, sigue estos pasos:

  1. Clona el repositorio de GitHub de Istio:

    git clone -b release-1.5 https://github.com/istio/istio.git
    
  2. Crea un espacio de nombres nuevo para Istio:

    kubectl create ns istio-system
    

  3. Copia y ejecuta cada uno de los siguientes comandos para generar archivos de instalación YAML de Citadel desde las plantillas de Helm de 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. A continuación, ejecuta el siguiente comando para aplicar el archivo YAML que generaste en el paso anterior en el clúster de Google Kubernetes Engine:

    kubectl apply -f citadel.yaml
    
  5. Verifica que Citadel funcione correctamente:

    kubectl get pods --namespace=istio-system
    

    Verifica que la implementación de Citadel se ejecute en un solo pod.

Requisitos de Herramientas de redes para la asignación de varios clústeres

Para que la asignación de varios clústeres funcione en tu dominio, debes asegurarte de que cada clúster ejecute un servicio de asignador en el que el servicio tenga una dirección externa pública.

Para verificar que esté configurada, verifica que se haya asignado un balanceador de cargas externo para el servicio:

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 no debe estar vacío.

Valida la asignación de varios clústeres

Para probar el proceso de asignación, completa los siguientes pasos:

  1. Registra 2 clústeres de Game Servers en tu dominio y configúralos para la asignación de varios clústeres como se muestra más arriba.

  2. Crea una implementación de Game Servers.

  3. Crea una configuración de Game Servers con una especificación de flota que tenga réplicas configuradas en 5 y la etiqueta gameName: udp-server aplicada.

  4. Actualiza el lanzamiento de la implementación de Game Servers para que la configuración se publique.

  5. Copia el siguiente YAML en un LOCAL_FILE:

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

Usa el siguiente comando para aplicar el archivo YAML a uno de los clústeres de Game Servers en tu dominio:

kubectl create -f LOCAL_FILE -o yaml

Esto asignará 1 de las 10 réplicas listas a los dos clústeres. Repite el comando 9 veces más y asegúrate de que estén asignadas las 10 réplicas en ambos clústeres.

Cualquier extremo en cualquier clúster dentro del dominio se puede usar para asignar un GameServer desde cualquier clúster en el dominio. Las asignaciones de GameServer se balancean en todos los clústeres dentro del dominio mediante un esquema round robin.

Soluciona problemas

Si tienes problemas con los procedimientos de esta guía, te recomendamos que revises los siguientes documentos sobre solución de problemas:

No se especifica ninguna política de asignación para varios clústeres

Intentas asignar un servidor para videojuegos y aparece el siguiente error:

no multi-cluster allocation policy is specified

Verifica que instalaste Citadel en el clúster de forma correcta y asegúrate de que el Secret istio.default se cree mediante Citadel en el espacio de nombres del servidor para videojuegos:

kubectl get secret istio.default -n NAMESPACE

Certificado firmado por autoridad desconocida

Intentas asignar un servidor para videojuegos y aparece el siguiente error:

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

Verifica que configuraste correctamente el Secret allocator-tls-ca de Kubernetes para todos los clústeres. La instalación de Helm también actualiza el Secret allocator-tls-ca, pero si cambias manualmente el Secret TLS, también debes actualizar el Secret allocator-tls-ca. Para verificar la autoridad certificada, ejecuta los siguientes 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

La verificación debe mostrar tls.crt: OK.

La causa raíz se corrigió, pero persiste el problema

La conciliación de los cambios realizados en un solo clúster en todos los clústeres puede tardar hasta una hora. Puedes activar la conciliación de inmediato si modificas los recursos de Game Servers, por ejemplo, si actualizas las etiquetas en un recurso de dominio:

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

¿Qué sigue?