Configurer l'allocation multicluster

Cette page explique comment configurer l'allocation multicluster pour Game Servers. L'allocation multicluster vous permet de demander un GameServer doté d'un état Ready à partir d'un cluster dans un domaine donné, et de récupérer un GameServer dans un état Ready depuis n'importe quel cluster de ce domaine. L'allocation multicluster nécessite une configuration manuelle pour permettre aux clusters de se connecter les uns aux autres ainsi qu'au point de terminaison d'allocation multicluster.

Pour en savoir plus sur les allocations GameServer, consultez le Guide de démarrage rapide Créer un parc Game Server pour obtenir une présentation complète.

Avant de commencer

Avant de commencer, nous vous recommandons de vous familiariser avec les concepts clés de la page Présentation de Game Servers. Assurez-vous également que vous avez également effectué les tâches suivantes :

  • Assurez-vous d'avoir activé l'API des services de jeux.
  • Activer l'API Game Services
  • Choisissez une interface système sur laquelle gcloud CLI est installée ou utilisez un client API:
  • Cloud Shell

    Pour lancer Cloud Shell, procédez comme suit :

    1. Accédez à Google Cloud Console.

      Google Cloud Console

    2. Dans l'angle supérieur droit de la console, cliquez sur le bouton Activer Cloud Shell :

    Une session Cloud Shell s'ouvre dans un cadre situé en bas de la console. Cette interface système vous permet d'exécuter les commandes gcloud.

    Shell local

    Installer gcloud CLI

    Vérifiez que vous avez défini le projet par défaut souhaité pour Google Cloud CLI (sinon, vous devrez spécifier l'indicateur --project explicitement pour chaque commande ultérieurement):

    gcloud config list project
    

    Si non, vous pouvez exécuter la commande suivante pour définir un projet par défaut, en remplaçant PROJECT_ID par l'ID de projet souhaité :

    gcloud config set project PROJECT_ID
    

    Exécutez la commande suivante pour vérifier votre version de Google Cloud CLI. Game Servers nécessite la version 306.0.0 ou ultérieure de gcloud CLI.

    gcloud version
    

    Pour mettre à jour votre installation, exécutez la commande suivante :

    gcloud components update
    

    curl/PowerShell

    Pour utiliser l'API REST avec curl ou Windows PowerShell, procédez comme suit :

    1. Créer un compte de service
    2. Téléchargez une clé privée sous la forme d'un fichier JSON.
    3. Définissez la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS sur le chemin d'accès du fichier JSON contenant vos identifiants. Cette variable ne s'applique qu'à la session de shell actuelle. Par conséquent, si vous ouvrez une nouvelle session, vous devez de nouveau la définir.

    Bibliothèque cliente

    Google Cloud Game Servers peut être contrôlé par programmation à l'aide d'une bibliothèque cliente. Pour obtenir des instructions sur l'utilisation de la bibliothèque et l'authentification, consultez la page Présentation des bibliothèques clientes.

Configurer le service d'allocation Agones

Assurez-vous que le service d'allocation Agones est configuré pour votre installation Agones et que l'allocation de cluster unique fonctionne avec le même guide. Notez que, par défaut, le service agones-allocator n'a pas de certificat de service valide installé et qu'il doit être remplacé. Vous pouvez réserver une adresse IP Google Cloud Platform régionale et installer agones-allocator à l'aide de l'adresse IP réservée, ce qui génère également un certificat valide pour le service. Pour réserver une adresse IP, exécutez la commande suivante :

gcloud compute addresses create allocator-service --region REGION

Pour trouver l'adresse IP réservée, exécutez la commande suivante :

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

Ensuite, installez/mettez à niveau Agones en transmettant l'adresse IP réservée en tant que RESERVED_IP à partir de la commande précédente :

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 est l'adresse IP à utiliser pour le service agones-allocator.

RELEASE est le nom de votre release Agones pour l'installation du graphique Helm.

Installer Citadel

Game Servers utilise le projet Citadel comme gestionnaire de certificats pour le certificat côté client d'allocation multicluster, utilisé par Agones pour faciliter les connexions sécurisées entre les clusters. Vous devez l'installer sur chaque cluster Google Kubernetes Engine enregistré auprès de Game Servers.

Pour chaque espace de noms sur le cluster, Citadel émet un secret Kubernetes istio.default qui est utilisé par Game Servers comme certificat côté client.

Vous pouvez ignorer cette étape si vous avez déjà installé Istio sur votre cluster Google Kubernetes Engine. Notez qu'il existe actuellement des problèmes connus liés à la compatibilité d'Agones avec une installation Istio complète.

Si vous utilisez Terraform, vous pouvez installer Citadel à l'aide de Terraform. Vous pouvez consulter les exemples de fichiers de configuration pour installer Citadel à l'aide de Terraform sur GitHub.

Dans ce guide, nous partons du principe que vous avez installé des outils de ligne de commande pour helm v3 et git.

Pour installer Citadel :

  1. Clonez le dépôt GitHub Istio :

    git clone -b release-1.5 https://github.com/istio/istio.git
    
  2. Créez un espace de noms pour Istio:

    kubectl create ns istio-system
    

  3. Copiez et exécutez chacune des commandes suivantes pour générer des fichiers d'installation Citadel YAML à partir des modèles Helm d'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. Exécutez ensuite la commande suivante pour appliquer au fichier Google Kubernetes Engine le fichier YAML généré à l'étape précédente :

    kubectl apply -f citadel.yaml
    
  5. Vérifiez que Citadel fonctionne correctement :

    kubectl get pods --namespace=istio-system
    

    Vérifiez que le déploiement Citadel est exécuté dans un seul pod.

Exigences de mise en réseau pour l'allocation multicluster

Pour que l'allocation multicluster fonctionne dans votre domaine, vous devez vous assurer que chaque cluster exécute un service d'allocation dans lequel le service dispose d'une adresse externe publique.

Pour s'assurer que cela est configuré, vérifiez qu'un équilibreur de charge externe est alloué au service :

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 ne doit pas être vide.

Valider l'allocation multicluster

Pour tester le processus d'allocation, procédez comme suit :

  1. Enregistrez deux clusters Game Servers dans votre domaine et configurez-les pour l'allocation multicluster, comme indiqué ci-dessus.

  2. Créer un déploiement Game Servers.

  3. Créez une configuration de Game Servers avec une spécification de parc dont les instances dupliquées sont définies sur 5 et le libellé gameName: udp-server.

  4. Mettez à jour le déploiement de Game Servers pour qu'il mette en œuvre la configuration.

  5. Copiez le fichier YAML suivant dans un fichier LOCAL_FILE :

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

Utilisez la commande suivante pour appliquer le fichier YAML à l'un des clusters de Game Servers dans votre domaine :

kubectl create -f LOCAL_FILE -o yaml

Cela permettra d'allouer l'une des 10 instances dupliquées prêtes entre les deux clusters. Répétez la commande neuf fois et assurez-vous que les 10 instances dupliquées des deux clusters sont allouées.

Tout point de terminaison sur un cluster du domaine peut désormais être utilisé pour allouer un GameServer à partir de n'importe quel cluster du domaine. La charge des allocations GameServer est équilibrée sur tous les clusters du domaine utilisant un schéma round robin (à tour de rôle).

Dépannage

Si vous rencontrez des problèmes avec les procédures décrites dans ce guide, nous vous recommandons de consulter les documents de dépannage suivants :

Aucune règle d'allocation multicluster n'est spécifiée

Le message d'erreur suivant s'affiche lorsque vous essayez d'allouer un serveur de jeu :

no multi-cluster allocation policy is specified

Vérifiez que vous avez correctement installé Citadel sur le cluster en vous assurant que le secret istio.default est créé par Citadel dans l'espace de noms du serveur de jeu :

kubectl get secret istio.default -n NAMESPACE

Certificat signé par une autorité inconnue

Le message d'erreur suivant s'affiche lorsque vous essayez d'allouer un serveur de jeu :

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

Vérifiez que vous avez correctement défini le secret Kubernetes allocator-tls-ca pour tous les clusters. L'installation de Helm met également à jour le secret allocator-tls-ca, mais si vous modifiez manuellement le secret TLS, vous devez également mettre à jour le code secret allocator-tls-ca. Pour vérifier l'autorité de certification, exécutez les commandes suivantes :

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 vérification devrait imprimer tls.crt: OK.

Cause initiale corrigée, le problème persiste

Le rapprochement des modifications apportées à un seul cluster dans tous les clusters peut prendre jusqu'à une heure. Vous pouvez déclencher le rapprochement immédiatement en modifiant vos ressources Game Servers. Pour ce faire, mettez à jour les libellés d'une ressource de domaine :

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

Étapes suivantes