Déployer une application à l'aide de GKE Autopilot et de Spanner

Ce tutoriel explique comment déployer une application Web conteneurisée sur un cluster Google Kubernetes Engine (GKE) Autopilot avec un backend de base de données Spanner. Vous pouvez créer et déployer des applications Web évolutives et fiables sans gérer d'infrastructure complexe à l'aide de clusters GKE Autopilot et de Spanner. GKE provisionne et gère automatiquement les ressources de votre cluster Kubernetes, ce qui réduit les frais d'exploitation. Spanner est une base de données relationnelle entièrement gérée et distribuée à l'échelle mondiale. Elle offre des performances et une disponibilité élevées grâce aux transactions ACID et à la sémantique SQL.

Avant de lire cette page, assurez-vous de maîtriser Kubernetes.

Ce document s'adresse aux développeurs et aux administrateurs de plates-formes cloud. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans le contenu Google Cloud , consultez Rôles utilisateur et tâches courantes de GKE.

Pourquoi utiliser GKE et Spanner ?

En tant que développeur, vous ne souhaitez peut-être pas consacrer du temps à déterminer la quantité de ressources de stockage et de calcul dont votre application a besoin, ni à prédire la consommation de RAM et de processeur lors des périodes de demandes variables, ou à vous soucier de la défaillance de l'application lors de la charge maximale.

En utilisant GKE Autopilot en tant que service Kubernetes entièrement géré, et Spanner en tant que service de base de données entièrement géré, vous pouvez développer et déployer des applications plus rapidement sur une infrastructure stable, qui simplifie la configuration et la gestion des ressources. GKE Autopilot gère la configuration et le scaling de l'infrastructure permettant d'héberger votre application en ajoutant des nœuds au cluster, ou en en supprimant de celui-ci, en fonction des exigences lors de l'exécution. De même, Spanner peut effectuer un scaling horizontal ou vertical de manière dynamique, en ne nécessitant qu'une intervention manuelle minime, à mesure que les exigences de stockage ou de puissance de calcul évoluent.

Par exemple, imaginons que vous commercialisez le prochain jeu à succès, qui est susceptible de devenir viral et donc d'attirer un trafic Web important pendant sa semaine de lancement. Spanner peut vous aider à gérer ce débit soudain en vous permettant d'augmenter, de réduire ou de redistribuer instantanément des ressources de calcul, tout en maintenant une disponibilité maximale pour votre application grâce à GKE Autopilot.

Objectifs

Dans ce tutoriel, vous allez apprendre à effectuer les opérations suivantes :

  • Créez une base de données Spanner qui stocke un registre des joueurs.

  • Déployez un exemple d'application Web appelé hello-app-cloud-spanner, avec une interface utilisateur graphique.

Le tableau suivant décrit les ressources Google Cloud que vous créez ou utilisez, les variables avec lesquelles elles sont identifiées et les valeurs qui leur sont recommandées pour les besoins de ce tutoriel :

Ressource Variable Valeur
ID du projetGoogle Cloud PROJECT_ID

L'ID du projet généré lorsque vous créez un projet.

Exemple : my-gcp-project

Région de calcul COMPUTE_REGION

La région Compute Engine dans laquelle vous souhaitez créer l'instance Spanner et le cluster GKE. Nous vous recommandons de choisir la région la plus proche de l'emplacement géographique de vos clients. Cependant, pour ce tutoriel, utilisez us-west1.

Instance Spanner - hello-instance
Base de données Spanner - hello-database
Cluster GKE Autopilot CLUSTER_NAME hello-cluster
Espace de noms Kubernetes NAMESPACE hello-namespace
Compte de service Kubernetes KUBERNETES_SERVICEACCOUNT ksa-helloapp

Pour ce tutoriel, nous vous recommandons de créer des ressources, ce qui vous permet de les supprimer facilement et sans risque après avoir déployé l'exemple d'application. Toutefois, si vous disposez d'espaces de noms et de comptes de service Kubernetes existants, vous pouvez les utiliser.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai sans frais.

Une fois que vous avez terminé les tâches décrites dans ce document, supprimez les ressources que vous avez créées pour éviter que des frais vous soient facturés. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

Assurez-vous de remplir les conditions préalables suivantes :

Sélectionner ou créer un projet

Vous pouvez utiliser un projet existant ou en créer un pour ce tutoriel.

  1. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

Activer les API

Activez les API Artifact Registry, Compute Engine, GKE, IAM Service Account Credentials et Spanner, si elles ne sont pas déjà activées.

Rôles requis pour activer les API

Pour activer les API, vous devez disposer de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation grâce au rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation grâce au rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

Activer les API

Configurer Cloud Shell

Dans ce tutoriel, vous utilisez Cloud Shell pour exécuter des commandes gcloud et kubectl. Cloud Shell est un environnement shell permettant de gérer les ressources hébergées sur Google Cloud. Il est préinstallé avec Google Cloud CLI et l'outil de ligne de commande kubectl.

Dans la console Google Cloud , activez Cloud Shell.

Activer Cloud Shell

Une session Cloud Shell s'ouvre dans un cadre situé en bas de la console.

Avant d'exécuter des commandes dans ce tutoriel, assurez-vous que votre projet par défaut est défini sur l'ID du projet dans lequel vous souhaitez déployer l'exemple d'application. Si ce n'est pas déjà fait, exécutez la commande suivante dans Cloud Shell :

gcloud config set project PROJECT_ID

Remplacez PROJECT_ID par votre ID du projet

Attribuer des rôles IAM

Assurez-vous que votre compte Google Cloud dispose des rôles IAM requis pour ce tutoriel.

Attribuez des rôles à votre compte utilisateur. Exécutez la commande suivante une fois pour chacun des rôles IAM suivants : roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageConsumer, roles/iam.serviceAccountUser, roles/iam.securityAdmin, roles/spanner.admin, roles/container.admin

gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet.
  • USER_IDENTIFIER : identifiant de votre compte utilisateur . Par exemple, myemail@example.com.
  • ROLE : rôle IAM que vous attribuez à votre compte utilisateur.

Configurer Spanner

Pour configurer Spanner, vous devez créer une instance Spanner et une base de données Spanner.

Créer une instance Spanner

Une instance Spanner est une allocation de ressources utilisée par les bases de données Spanner créées dans cette instance.

Créez une instance Spanner appelée hello-instance avec une configuration régionale et une capacité de calcul de 100 unités de traitement.

gcloud spanner instances create hello-instance \
  --config=regional-COMPUTE_REGION \
  --description="Spanner sample instance" \
  --processing-units=100

Remplacez COMPUTE_REGION par us-west1 pour ce tutoriel.

Créer une base de données Spanner

Une base de données Spanner inclut vos tables, vues et index. Une base de données hérite des propriétés de son instance parente, comme par exemple sa configuration (régionale ou multirégionale), sa capacité de calcul disponible et son stockage.

Créez une base de données Spanner appelée hello-database avec une table nommée Players à l'aide du dialecte GoogleSQL. Exécutez la requête suivante dans Cloud Shell :

gcloud spanner databases create hello-database \
  --instance=hello-instance \
  --database-dialect=GOOGLE_STANDARD_SQL \
  --ddl="CREATE TABLE Players (
    PlayerUuid STRING(36) NOT NULL,
    FirstName STRING(1024),
    LastName STRING(1024),
    BirthDate DATE) PRIMARY KEY(PlayerUuid)"

Créer un cluster GKE Autopilot

Une fois que vous avez configuré Spanner, créez un cluster Autopilot et utilisez la fédération d'identité de charge de travail pour GKE afin d'accéder à votre base de données de manière sécurisée et gérable.

Créez un cluster Autopilot nommé hello-cluster. La fédération d'identité de charge de travail pour GKE est activée par défaut sur les clusters Autopilot.

gcloud container clusters create-auto CLUSTER_NAME \
 --location=CONTROL_PLANE_LOCATION

Remplacez les éléments suivants :

  • CLUSTER_NAME : hello-cluster
  • CONTROL_PLANE_LOCATION : région Compute Engine du plan de contrôle de votre cluster. Pour ce tutoriel, utilisez la même région, us-west1, que celle où vous avez créé l'instance Spanner. Nous vous recommandons de créer l'instance Spanner et le cluster GKE Autopilot dans la même région pour réduire la latence.

La création du cluster peut prendre entre 8 et 10 minutes.

Le résultat ressemble à ce qui suit :

NAME: hello-cluster
LOCATION: us-west1
MASTER_VERSION: 1.26.5-gke.1200
MASTER_IP: 192.0.2.1
MACHINE_TYPE: e2-medium
NODE_VERSION: 1.26.5-gke.1200
NUM_NODES: 3
STATUS: RUNNING

Configurer le cluster afin qu'il utilise la fédération d'identité de charge de travail pour GKE

Configurez votre cluster afin qu'il s'authentifie auprès de Google Cloud à l'aide de Workload Identity Federation for GKE avant de déployer l'application.

  1. Obtenez des identifiants pour accéder à votre cluster :

    gcloud container clusters get-credentials CLUSTER_NAME \
     --location=CONTROL_PLANE_LOCATION
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME : hello-cluster
    • CONTROL_PLANE_LOCATION : us-west1

    Cela met à jour un fichier kubeconfig avec les identifiants et les informations de point de terminaison appropriés pour pointer kubectl vers votre cluster.

  2. Créez un espace de noms à utiliser pour le compte de service Kubernetes. Vous pouvez également utiliser l'espace de noms par défaut ou tout espace de noms existant.

    kubectl create namespace NAMESPACE
    

    Remplacez NAMESPACE par hello-namespace, le nom du nouvel espace de noms que vous créez.

  3. Créez un compte de service Kubernetes que votre application pourra utiliser.

    kubectl create serviceaccount KUBERNETES_SERVICEACCOUNT \
     --namespace NAMESPACE
    

    Remplacez les éléments suivants :

    • KUBERNETES_SERVICEACCOUNT : ksa-helloapp, nom du nouveau compte de service Kubernetes que vous créez.
    • NAMESPACE : hello-namespace
  4. Ajoutez une liaison de stratégie IAM pour votre compte de service Kubernetes afin de lire et d'écrire dans Spanner :

    gcloud projects add-iam-policy-binding PROJECT_ID \
     --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
     --role="roles/spanner.admin" \
     --condition=None
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet Google Cloud
    • PROJECT_NUMBER : numéro de votre projet Google Cloud
    • NAMESPACE : hello-namespace
    • KUBERNETES_SERVICEACCOUNT : ksa-helloapp

    Exemple :

    gcloud projects add-iam-policy-binding my-gcp-project \
    --member="principal://iam.googleapis.com/projects/123456789012/locations/global/workloadIdentityPools/my-gcp-project.svc.id.goog/subject/ns/hello-namespace/sa/ksa-helloapp" \
    --role="roles/spanner.admin" \
    --condition=None

Déployer l'application exemple sur le cluster

Maintenant que vous avez configuré GKE et Spanner avec les services et l'authentification nécessaires, vous êtes prêt à déployer l'exemple d'application hello-app-cloud-spanner.

  1. Clonez l'exemple d'application depuis le dépôt GitHub vers Cloud Shell :

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  2. Lancez l'éditeur Cloud Shell en cliquant sur Bouton Éditeur de code Ouvrir l'éditeur dans la barre d'outils de la fenêtre du terminal.

    Pour en savoir plus, consultez Présentation de l'interface de l'éditeur Cloud Shell.

  3. Ouvrez le volet de l'explorateur de l'éditeur Cloud Shell, puis accédez au répertoire kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s.

  4. Ouvrez le fichier deployment.yaml et mettez à jour le champ serviceAccountName en remplaçant <KSA_NAME> par ksa-helloapp, le nom de votre compte de service Kubernetes.

    Modifiez le fichier YAML pour mettre à jour le nom du compte de service Kubernetes.
    Figure 1. Mettez à jour le nom du compte de service Kubernetes dans le fichier de déploiement.
  5. Fermez l'éditeur Cloud Shell et revenez au terminal Cloud Shell.

  6. Dans le terminal Cloud Shell, accédez au répertoire hello-app-cloud-spanner :

    cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
    
  7. Pour déployer l'application, procédez comme suit :

    kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
    

    Remplacez NAMESPACE par hello-namespace.

  8. Attendez que l'application soit déployée avec STATUS en tant que Running :

    kubectl get pods -n=NAMESPACE --watch
    

    Remplacez NAMESPACE par hello-namespace.

    Le résultat ressemble à ce qui suit :

    NAME                    READY  STATUS       RESTARTS  AGE
    hello-app-cloud-spanner-765c9b8779-lfcrc  0/1   ContainerCreating  0     87s
    hello-app-cloud-spanner-765c9b8779-lfcrc  1/1   Running       0     3m15s
    
  9. Appuyez sur Ctrl+C sur votre clavier pour revenir à l'invite de commande et exécuter d'autres commandes.

Exposer l'application exemple sur Internet

Pour exposer un service Kubernetes en dehors du cluster, créez un service de type LoadBalancer. Ce type de service génère une adresse IP d'équilibreur de charge externe pour vos pods, accessible via Internet.

  1. Déployez l'équilibreur de charge :

    kubectl apply -f k8s/service.yaml -n=NAMESPACE
    

    Remplacez NAMESPACE par hello-namespace.

  2. Recherchez une adresse IP externe à attribuer :

    kubectl get service -n=NAMESPACE --watch
    

    Remplacez NAMESPACE par hello-namespace.

  3. Une fois l'opération terminée, copiez l'EXTERNAL-IP (par exemple, 203.0.113.0) et ouvrez-la dans un navigateur. Une interface Web s'ouvre, qui affiche et gère la base de données des joueurs.

  4. Vous pouvez utiliser l'interface utilisateur de l'application pour créer ou supprimer des enregistrements de joueurs, qui sont enregistrés dans la base de données Spanner.

    Ajouter ou supprimer des joueurs.
    Figure 2. Créer ou supprimer des joueurs dans le registre.

    Exécutez la requête suivante pour vérifier si la base de données Spanner a été mise à jour avec vos entrées :

    gcloud spanner databases execute-sql hello-database \
     --instance=hello-instance \
     --sql="SELECT * FROM Players LIMIT 10"
    

    Le résultat ressemble à ce qui suit :

    PlayerUuid: a1f34bbf-929c-498d-8b16-39bbb29d70e3
    FirstName: John
    LastName: Smith
    BirthDate: 1997-07-12
    
    PlayerUuid: d634e157-96ea-45f2-be3f-fb907ced188e
    FirstName: Jane
    LastName: Doe
    BirthDate: 2013-07-12
    

Effectuer un nettoyage

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez chaque ressource individuellement.

Supprimer votre projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Supprimer un projet Google Cloud  :

gcloud projects delete PROJECT_ID

Si vous avez supprimé le projet, le nettoyage est terminé. Si vous n'avez pas supprimé le projet, suivez les étapes ci-après afin de supprimer les ressources GKE et Spanner.

Supprimer les ressources GKE

  1. Supprimez le service. Cette étape annule l'allocation de l'équilibreur de charge Google Cloud créé pour le service :

    kubectl delete service hello-app-cloud-spanner -n=NAMESPACE
    

    Remplacez NAMESPACE par hello-namespace.

  2. Supprimez le cluster GKE. Cela supprime les ressources qui constituent un cluster, telles que les instances de calcul, les disques et les ressources réseau :

    gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATION
    

Supprimer les ressources Spanner

  1. Supprimez la base de données Spanner :

    gcloud spanner databases delete hello-database --instance=hello-instance
    
  2. Supprimez l'instance Spanner :

    gcloud spanner instances delete hello-instance
    

Étapes suivantes