Ce tutoriel explique comment créer une application Web multiniveau à l'aide de Google Kubernetes Engine (GKE).
Dans ce tutoriel, vous allez effectuer les opérations suivantes :
- Configurez une application Web avec une adresse IP externe et un équilibreur de charge.
- Créez un cluster Redis avec un seul maître (leader) et plusieurs instances dupliquées (esclaves).
L'exemple décrit les concepts Kubernetes suivants :
- Configuration déclarative utilisant des fichiers manifeste YAML
- Les déploiements, qui sont des ressources Kubernetes déterminant la configuration d'un ensemble de pods répliqués
- Les services, qui permettent de créer des équilibreurs de charge internes et externes pour un ensemble de pods
Objectifs
Pour déployer et exécuter l'application sur GKE, procédez comme suit :- Configurer l'instance maître Redis
- Configurer deux instances esclaves Redis
- Configurer l'interface Web
- Accéder au site Web
- Augmenter la capacité de l'interface Web à la hausse
Le schéma ci-dessous présente une vue d'ensemble de l'architecture de cluster que vous obtiendrez après avoir réalisé ces objectifs :
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
Cloud Shell est préinstallé avec les logiciels dont vous avez besoin dans ce tutoriel, y compris kubectl
et gcloud CLI. Si vous n'utilisez pas Cloud Shell, vous devez installer la gcloud CLI.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
Préparer l'environnement
Pour configurer votre environnement, procédez comme suit :
Définissez les variables d'environnement :
export PROJECT_ID=PROJECT_ID export COMPUTE_LOCATION=COMPUTE_LOCATION
Remplacez les éléments suivants :
PROJECT_ID
: l'ID de votre projet Google Cloud.COMPUTE_LOCATION
: emplacement Compute Engine, tel queus-central1
.
Clonez le dépôt GitHub.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Accédez au répertoire de travail :
cd kubernetes-engine-samples/quickstarts/guestbook/
Créer un cluster GKE
Créez un cluster GKE Autopilot ou Standard :
Autopilot
gcloud container clusters create-auto guestbook \
--location=${COMPUTE_LOCATION} \
Standard
gcloud container clusters create guestbook \
--location=${COMPUTE_LOCATION} \
--num-nodes=4
Se connecter au cluster
Configurez kubectl
pour communiquer avec le cluster :
gcloud container clusters get-credentials guestbook \
--location=${COMPUTE_LOCATION}
Configurer l'instance maître Redis
L'application utilise Redis pour stocker ses données. L'application écrit ses données sur une instance maître Redis et lit les données à partir de plusieurs instances esclaves Redis.
Le fichier manifeste suivant décrit un déploiement Kubernetes qui exécute un seul pod maître Redis dupliqué:
Appliquez le fichier manifeste à votre cluster :
kubectl apply -f redis-leader-deployment.yaml
Vérifiez que le pod maître Redis est en cours d'exécution :
kubectl get pods
Le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE redis-leader-343230949-qfvrq 1/1 Running 0 43s
Plusieurs minutes peuvent être nécessaires pour que
STATUS
passe dePending
àRunning
.
Créer le service maître Redis
L'application Web doit communiquer avec l'instance maître Redis pour écrire ses données. Vous pouvez créer un service faisant office de proxy pour le trafic vers le pod maître Redis.
Un service est une abstraction de Kubernetes qui définit un ensemble logique de pods et une règle permettant d'autoriser l'accès à ces pods. Lorsque vous créez un service, vous décrivez les pods à assigner au proxy en fonction des libellés de pods.
Le fichier manifeste suivant décrit un service pour l'instance maître Redis:
Ce fichier manifeste comprend un ensemble de sélecteurs de libellés. Ces libellés correspondent à l'ensemble de libellés déployé à l'étape précédente. Par conséquent, ce service achemine le trafic réseau vers le pod maître Redis créé précédemment.
La section
ports
du fichier manifeste déclare un seul mappage de port. Le service achemine le trafic sur le portport: 6379
vers le porttargetPort: 6379
des conteneurs correspondant aux libellésselector
spécifiés. La propriétécontainerPort
utilisée dans le déploiement doit correspondre à la propriététargetPort
utilisée pour acheminer le trafic vers le déploiement.Appliquez le fichier manifeste à votre cluster :
kubectl apply -f redis-leader-service.yaml
Vérifiez que GKE a créé le service :
kubectl get service
Le résultat ressemble à ce qui suit :
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.51.240.1 <none> 443/TCP 42s redis-leader 10.51.242.233 <none> 6379/TCP 12s
Configurer des instances esclaves Redis
Bien que le maître Redis soit un pod unique, vous pouvez le rendre hautement disponible afin qu'il réponde à la demande de trafic en ajoutant des instances dupliquées (esclaves) Redis.
Le fichier manifeste suivant décrit un déploiement pour les pods esclaves Redis:
Appliquez le fichier manifeste à votre cluster :
kubectl apply -f redis-follower-deployment.yaml
Vérifiez que les deux instances répliquées esclaves Redis sont en cours d'exécution :
kubectl get pods
Le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE redis-follower-76588f55b7-bnsq6 1/1 Running 0 27s redis-follower-76588f55b7-qvtws 1/1 Running 0 27s redis-leader-dd446dc55-kl7nl 1/1 Running 0 119s
Plusieurs minutes peuvent être nécessaires pour que
STATUS
passe dePending
àRunning
.
Créer le service esclave Redis
L'application Web doit communiquer avec les instances esclaves Redis pour lire les données. Pour rendre les instances esclaves Redis visibles, vous devez configurer un autre service.
Le fichier manifeste suivant décrit un service pour les instances esclaves Redis:
Ce fichier manifeste spécifie le service exécuté sur le port 6379. Le champ
selector
du service correspond aux pods esclaves Redis créés à l'étape précédente.Appliquez le fichier manifeste à votre cluster :
kubectl apply -f redis-follower-service.yaml
Vérifiez que GKE a créé le service :
kubectl get service
Le résultat ressemble à ce qui suit :
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.51.240.1 <none> 443/TCP 1m redis-leader 10.51.242.233 <none> 6379/TCP 49s redis-follower 10.51.247.238 <none> 6379/TCP 3s
Configurer l'interface Web de l'application
Maintenant que vous disposez d'un espace de stockage Redis pour votre application, démarrez les serveurs Web. Comme les instances esclaves Redis, l'interface est déployée à l'aide d'un déploiement Kubernetes.
L'application Web utilise une interface PHP configurée pour communiquer avec les services maîtres ou esclaves Redis, selon la nature de la requête (lecture ou écriture). Elle expose une interface JSON et propose une expérience utilisateur basée sur jQuery-Ajax.
Le fichier manifeste suivant décrit un déploiement pour le serveur Web:
Le fichier manifeste spécifie la variable d'environnement
GET_HOSTS_FROM=dns
. Lorsque vous fournissez la configuration à l'application d'interface Web, celle-ci utilise les noms d'hôteredis-follower
etredis-leader
pour effectuer une résolution DNS. La résolution DNS recherche les adresses IP des services que vous avez créés aux étapes précédentes. Ce concept s'appelle recherche de services DNS.Appliquez le fichier manifeste à votre cluster :
kubectl apply -f frontend-deployment.yaml
Vérifiez que les instances dupliquées sont en cours d'exécution :
kubectl get pods -l app=guestbook -l tier=frontend
Le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE frontend-7b78458576-8kp8s 1/1 Running 0 37s frontend-7b78458576-gg86q 1/1 Running 0 37s frontend-7b78458576-hz87g 1/1 Running 0 37s
Exposer l'interface sur une adresse IP externe
Avec la configuration actuelle, les services redis-follower
et redis-leader
que vous avez créés aux étapes précédentes ne sont accessibles que dans le cluster GKE, car le type par défaut d'un service est ClusterIP
.
Un service ClusterIP
fournit une adresse IP unique pour l'ensemble de pods vers lesquels il pointe. Cette adresse IP est accessible uniquement au sein du cluster.
Pour rendre le service d'interface Web accessible en externe, vous pouvez spécifier type: LoadBalancer
ou type: NodePort
dans la configuration du service, selon vos besoins.
Le fichier manifeste suivant décrit un service de type LoadBalancer :
La déclaration de port sous la section ports
spécifie le port port: 80
, et la propriété targetPort
n'est pas spécifiée. Lorsque vous omettez la propriété targetPort
, la valeur du champ port
est indiquée par défaut. Dans ce cas, ce service achemine le trafic externe sur le port 80 vers le port 80 des conteneurs dans le déploiement frontend
.
Appliquez le fichier manifeste à votre cluster :
kubectl apply -f frontend-service.yaml
Lors de la création du service frontend
, GKE crée un équilibreur de charge et une adresse IP externe. Ces ressources sont susceptibles d'être facturées.
Accéder au site Web de l'application
Pour accéder au site Web de l'application, obtenez l'adresse IP externe du service frontend
:
kubectl get service frontend
Le résultat ressemble à ce qui suit :
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.51.242.136 109.197.92.229 80:32372/TCP 1m
La colonne EXTERNAL-IP
peut indiquer <pending>
pendant la création de l'équilibreur de charge. Cela peut prendre quelques minutes. Si vous rencontrez des erreurs telles que Does not have minimum availability
, attendez quelques minutes. Cette erreur temporaire se produit, car GKE recrée les nœuds pour apporter les modifications.
Copiez l'adresse IP, puis ouvrez la page dans votre navigateur :
Essayez d'ajouter des entrées en saisissant un message, puis en cliquant sur Submit (Envoyer). Le message que vous avez saisi s'affiche dans l'interface. Ce message indique que les données ont bien été ajoutées à Redis via les services que vous avez créés.
Augmenter la capacité de l'interface Web à la hausse
Supposons que votre application fonctionne depuis un certain temps et qu'elle voit sa cote de popularité soudainement grimper en flèche. Vous décidez alors qu'il serait judicieux d'ajouter davantage de serveurs Web à votre interface. Pour ce faire, vous pouvez augmenter le nombre de pods.
Augmentez le nombre de pods
frontend
:kubectl scale deployment frontend --replicas=5
Le résultat ressemble à ce qui suit :
deployment.extensions/frontend scaled
Vérifiez le nombre d'instances dupliquées en cours d'exécution :
kubectl get pods
Le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE frontend-88237173-3s3sc 1/1 Running 0 1s frontend-88237173-twgvn 1/1 Running 0 1s frontend-88237173-5p257 1/1 Running 0 23m frontend-88237173-84036 1/1 Running 0 23m frontend-88237173-j3rvr 1/1 Running 0 23m redis-leader-343230949-qfvrq 1/1 Running 0 54m redis-follower-132015689-dp23k 1/1 Running 0 37m redis-follower-132015689-xq9v0 1/1 Running 0 37m
Vous pouvez réduire le nombre de pods
frontend
à l'aide de la même commande, en remplaçant5
par1
.
Effectuer un nettoyage
Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.
Supprimer le projet
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Supprimer les ressources individuelles
Si vous avez utilisé un projet existant et que vous ne souhaitez pas le supprimer, supprimez les ressources individuelles.
Supprimez le service
frontend
:kubectl delete service frontend
Supprimez le cluster GKE :
gcloud container clusters delete guestbook
Étapes suivantes
- Apprenez à configurer l'autoscaling de pods horizontaux.
- Découvrez comment déployer WordPress dans GKE avec Persistent Disk et Cloud SQL.
- Découvrez comment configurer des noms de domaine avec des adresses IP statiques.
- Découvrez d'autres tutoriels Kubernetes Engine.