Contexte
Par nature, les pods sont éphémères. Cela signifie que GKE détruit l'état et la valeur stockés dans un pod lorsque celui-ci est supprimé, évincé ou reprogrammé.
En tant qu'opérateur d'application, vous souhaitez peut-être conserver des charges de travail avec état. Les applications traitant des articles WordPress, les applications de messagerie et les applications de traitement des opérations de machine learning en sont des exemples.
En utilisant Filestore sur GKE, vous pouvez effectuer les opérations suivantes:
- Déployer des charges de travail avec état évolutives.
- Activez plusieurs pods afin que leur champ
ReadWriteManysoit défini suraccessMode, afin que plusieurs pods puissent lire et écrire en même temps sur le même espace de stockage. - Configurer GKE pour installer des volumes dans plusieurs pods simultanément.
- Conservez l'espace de stockage lorsque les pods sont supprimés.
- Autorisez les pods à partager des données et à évoluer facilement.
Objectifs
Ce tutoriel s'adresse aux opérateurs d'application et aux autres utilisateurs qui souhaitent configurer une charge de travail avec état évolutive sur GKE à l'aide de PVC et de NFS.
Ce tutoriel couvre les étapes suivantes :
- créer un cluster GKE ;
- Configurez le stockage de fichiers géré avec Filestore à l'aide de CSI.
- Créer un pod lecteur et rédacteur
- Exposer le pod lecteur à un équilibreur de charge de service et y accéder.
- Effectuez le scaling à la hausse du rédacteur.
- Accéder aux données du pod du rédacteur.
Coûts
Ce tutoriel utilise les composants facturables suivants de Google Cloud :Utilisez le simulateur de coût pour générer une estimation des coûts en fonction de votre utilisation prévue.
Une fois que vous avez terminé ce tutoriel, évitez de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Pour obtenir des instructions détaillées sur cette tâche directement dans la console Google Cloud , cliquez sur Visite guidée :
Avant de commencer
Configurer votre projet
- 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.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, GKE, and Filestore APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, GKE, and Filestore APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. Dans la console Google Cloud , démarrez une instance Cloud Shell :
Ouvrir Cloud ShellTéléchargez le code source pour cet exemple d'application :
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/databases/stateful-workload-filestoreDéfinissez les variables d'environnement par défaut :
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION gcloud config set compute/zone COMPUTE_ZONE gcloud config set filestore/zone COMPUTE_ZONE gcloud config set filestore/region COMPUTE_REGIONRemplacez les valeurs suivantes :
- PROJECT_ID : ID de votre projet Google Cloud.
- COMPUTE_REGION: région Compute Engine.
- COMPUTE_ZONE: zone Compute Engine.
Créez un cluster GKE :
gcloud container clusters create-auto CLUSTER_NAME --location CONTROL_PLANE_LOCATIONRemplacez la valeur suivante :
- CLUSTER_NAME : nom de votre cluster.
- CONTROL_PLANE_LOCATION : emplacement Compute Engine du plan de contrôle de votre cluster. Indiquez une région pour les clusters régionaux ou une zone pour les clusters zonaux.
Une fois le cluster créé, le résultat ressemble à ce qui suit :
gcloud container clusters describe CLUSTER_NAME NAME: CLUSTER_NAME LOCATION: northamerica-northeast2 MASTER_VERSION: 1.21.11-gke.1100 MASTER_IP: 34.130.255.70 MACHINE_TYPE: e2-medium NODE_VERSION: 1.21.11-gke.1100 NUM_NODES: 3 STATUS: RUNNINGOù
STATUSestRUNNING.volumeBindingModeest défini surWaitForFirstConsumer, ce qui retarde le provisionnement du volume jusqu'à ce qu'un pod l'utilise. Ce paramètre permet au plan de contrôle de connaître l'emplacement du volume (Kubernetes appelle cela sa topologie) et permet à cet exemple de fonctionner pour les nouveaux clusters sans nœud, où il n'y a pas encore de topologie.tierest défini surstandardpour accélérer la création de l'instance Filestore. Si vous avez besoin d'un espace de stockage NFS supérieur, d'instantanés pour la sauvegarde de données, de la réplication de données sur plusieurs zones et d'autres fonctionnalités de niveau entreprise, définisseztiersurenterprise. Remarque: La règle de récupération pour le PV créé dynamiquement est définie par défaut surDeletesi lereclaimPolicyduStorageClassn'est pas défini.Créez la ressource
StorageClass:kubectl create -f filestore-storageclass.yamlVérifiez que la classe de stockage est créée:
kubectl get scLe résultat ressemble à ce qui suit :
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94mCréez la ressource
StorageClass:kubectl create -f preprov-storageclass.yamlVérifiez que la classe de stockage est créée:
kubectl get scLe résultat ressemble à ce qui suit :
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94mVérifiez que l'instance Filestore préexistante est prête:
gcloud filestore instances listLe résultat ressemble à ce qui suit, où la valeur
STATEestREADY:INSTANCE_NAME: stateful-filestore LOCATION: us-central1-a TIER: ENTERPRISE CAPACITY_GB: 1024 FILE_SHARE_NAME: statefulpath IP_ADDRESS: 10.109.38.98 STATE: READY CREATE_TIME: 2022-04-05T18:58:28Notez les valeurs
INSTANCE_NAME,LOCATION,FILE_SHARE_NAMEetIP_ADDRESSde l'instance Filestore.Renseignez les variables de la console d'instance Filestore:
INSTANCE_NAME=INSTANCE_NAME LOCATION=LOCATION FILE_SHARE_NAME=FILE_SHARE_NAME IP_ADDRESS=IP_ADDRESSRemplacez les variables d'espace réservé par les variables de console obtenues ci-dessus dans le fichier
preprov-pv.yaml:sed "s/<INSTANCE_NAME>/$INSTANCE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<LOCATION>/$LOCATION/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<FILE_SHARE_NAME>/$FILE_SHARE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<IP_ADDRESS>/$IP_ADDRESS/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yamlCréer le PV :
kubectl apply -f preprov-pv.yamlVérifiez que le champ
STATUSdu PV est défini surBound:kubectl get pvLe résultat ressemble à ce qui suit :
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE fileserver 1Ti RWX Delete Bound default/fileserver filestore-sc 46mDéployez la PVC:
kubectl create -f pvc.yamlVérifiez que la PVC est créée:
kubectl get pvcLe résultat ressemble à ce qui suit :
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fileserver Bound pvc-aadc7546-78dd-4f12-a909-7f02aaedf0c3 1Ti RWX filestore-sc 92mDéployez le pod du lecteur:
kubectl apply -f reader-fs.yamlVérifiez que l'instance Filestore que vous venez de créer est prête:
gcloud filestore instances listLe résultat ressemble à ce qui suit :
INSTANCE_NAME: pvc-5bc55493-9e58-4ca5-8cd2-0739e0a7b68c LOCATION: northamerica-northeast2-a TIER: STANDARD CAPACITY_GB: 1024 FILE_SHARE_NAME: vol1 IP_ADDRESS: 10.29.174.90 STATE: READY CREATE_TIME: 2022-06-24T18:29:19Vérifiez que les instances dupliquées du lecteur sont en cours d'exécution en interrogeant la liste des pods:
kubectl get podsLe résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30sDéployez le pod rédacteur :
kubectl apply -f writer-fs.yamlVérifiez que les pods du rédacteur sont en cours d'exécution en interrogeant la liste des pods:
kubectl get podsLe résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s writer-855565fbc6-8gh2k 1/1 Running 0 2m31s writer-855565fbc6-lls4r 1/1 Running 0 2m31sCréez un service de type
LoadBalancernomméreader-lb:kubectl create -f loadbalancer.yamlRegardez le déploiement afin de constater que GKE attribue une
EXTERNAL-IPau servicereader-lb:kubectl get svc --watchLorsque
Serviceest prêt, la colonneEXTERNAL-IPaffiche l'adresse IP publique de l'équilibreur de charge:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.8.128.1 <none> 443/TCP 2d21h reader-lb LoadBalancer 10.8.131.79 34.71.232.122 80:32672/TCP 2d20hAppuyez sur Ctrl+C pour mettre fin au processus de contrôle.
Utilisez un navigateur Web pour accéder à l'
EXTERNAL-IPattribuée à l'équilibreur de charge. La page est actualisée toutes les 30 secondes. Plus nombreux sont les pods de rédacteurs et plus la fréquence d'écriture est courte, plus le nombre d'entrées affichées est élevé.Effectuez un scaling à la hausse de
writerà cinq instances dupliquées:kubectl scale deployment writer --replicas=5Le résultat ressemble à ce qui suit :
deployment.extensions/writer scaledVérifiez le nombre d'instances dupliquées en cours d'exécution:
kubectl get podsLe résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 11m writer-855565fbc6-8dfkj 1/1 Running 0 4m writer-855565fbc6-8gh2k 1/1 Running 0 10m writer-855565fbc6-gv5rs 1/1 Running 0 4m writer-855565fbc6-lls4r 1/1 Running 0 10m writer-855565fbc6-tqwxc 1/1 Running 0 4mUtilisez un navigateur Web pour accéder de nouveau à l'
EXTERNAL-IPattribuée à l'équilibreur de charge.Obtenez le nom du pod du rédacteur:
kubectl get podsLe résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20dNotez le nom d'hôte d'un pod rédacteur (exemple:
writer-5465d65b46-7hxv4).Exécutez la commande suivante pour accéder au pod rédacteur:
kubectl exec -it WRITER_HOSTNAME -- /bin/shConsultez le composant partagé dans le fichier
indexData.html:cd /html cat indexData.htmlEffacez le fichier
indexData.html:echo '' > indexData.htmlActualisez le navigateur Web hébergeant l'adresse
EXTERNAL-IPpour afficher la modification.Quittez l'environnement:
exit- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Supprimez le service d'équilibrage de charge:
kubectl delete service reader-lbAttendez que l'équilibreur de charge provisionné pour le service de lecture soit supprimé.
Vérifiez que la liste renvoie
Listed 0 items:gcloud compute forwarding-rules listSupprimer les déploiements
kubectl delete deployment writer kubectl delete deployment readerVérifiez que les pods sont supprimés et renvoie le résultat
No resources found in default namespace.kubectl get podsSupprimez la PVC. Cela supprimera également le PV et l'instance Filestore en raison de la règle de conservation définie sur
delete.kubectl delete pvc fileserverSupprimez le cluster GKE :
gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATIONCela supprime les ressources qui composent le cluster GKE, y compris les pods de lecteur et de rédacteur.
- Apprenez à déployer Cloud SQL avec GKE.
- Modes d'accès pour le PV et la PVC
- Apprenez-en plus sur GKE et Filestore
- En savoir plus sur le pilote CSI Filestore
- Créer une instance Filestore
- Découvrez comment accéder aux instances Filestore à partir de clusters GKE.
- Découvrez d'autres tutoriels Kubernetes Engine.
- Découvrez comment exposer des applications à l'aide de services dans GKE Exposer des applications à l'aide de services
Définir des valeurs par défaut pour Google Cloud CLI
Créer un cluster GKE
Configurer le stockage de fichiers géré avec Filestore à l'aide de CSI
GKE fournit un moyen de déployer et de gérer automatiquement le pilote CSI Kubernetes pour Filestore dans vos clusters.
L'utilisation de CSI Filestore vous permet de créer ou de supprimer dynamiquement des instances Filestore et de les utiliser dans des charges de travail Kubernetes avec un StorageClass ou un Deployment.
Vous pouvez créer une instance Filestore en créant une PVC qui provisionne dynamiquement une instance Filestore et le PV, ou accéder aux instances Filestore préprovisionnées dans les charges de travail Kubernetes.
Nouvelle instance
Créer la ressource StorageClass
Instance préprovisionnée
Créer la ressource StorageClass
Lorsque volumeBindingMode est défini sur Immediate, il permet le démarrage immédiat du provisionnement du volume.
Créer un volume persistant pour l'instance Filestore
Utiliser un objet PersistentVolumeClaim pour accéder au volume
Le fichier manifeste pvc.yaml suivant fait référence à la StorageClass du pilote CSI Filestore nommée filestore-sc.
Pour que plusieurs pods lisent et écrivent dans le volume, accessMode est défini sur ReadWriteMany.
Créer un pod lecteur et rédacteur
Dans cette section, vous allez créer un pod lecteur et un pod rédacteur. Ce tutoriel utilise des déploiements Kubernetes pour créer les pods. Un déploiement est un objet de l'API Kubernetes qui vous permet d'exécuter plusieurs instances dupliquées de pods répartis entre les nœuds d'un cluster.
Créer le pod lecteur
Le pod de lecture lit le fichier en cours d'écriture par les pods redacteurs. Les pods de lecture verront l'heure et l'instance dupliquée du pod rédacteur écrite dans le fichier.
Le pod de lecture lit à partir du chemin /usr/share/nginx/html, partagé entre tous les pods.
Créer le pod rédacteur
Le pod rédacteur écrit régulièrement dans un fichier partagé auquel d'autres pods rédacteur et lecteur peuvent accéder. Le pod du rédacteur enregistre sa présence en écrivant son nom d'hôte dans le fichier partagé.
L'image utilisée pour le pod rédacteur est une image personnalisée d'Alpine Linux, utilisée pour les utilitaires et les applications de production. Elle inclut un script indexInfo.html qui obtient les métadonnées du rédacteur le plus récent, et comptabilise l'ensemble des rédacteurs uniques et le nombre total d'écritures.
Pour ce tutoriel, le pod de rédacteur écrit toutes les 30 secondes dans le chemin /html/index.html. Modifiez la valeur du numéro de sleep pour obtenir une fréquence d'écriture différente.
Exposer la charge de travail de lecture à un équilibreur de charge de service et y accéder.
Pour exposer une charge de travail en dehors du cluster, créez un service de type LoadBalancer. Ce type de service crée un équilibreur de charge externe avec une adresse IP accessible via Internet.
Pour en savoir plus sur le service d'équilibrage de charge, consultez la page sur loadbalancer.yaml.
Effectuer le scaling à la hausse du rédacteur
Étant donné que le PV accessMode a été défini sur ReadWriteMany, GKE peut augmenter le nombre de pods afin que davantage de pods rédacteurs puissent écrire sur ce volume partagé (ou qu'un plus grand nombre de lecteurs puissent les lire).
À ce stade, vous avez configuré et mis à l'échelle votre cluster pour qu'il soit compatible avec cinq pods de rédacteur avec état. Où plusieurs pods d'écriture écrivent simultanément sur le même fichier. Vous pouvez également faire évoluer facilement les pods de lecteur.
Facultatif: Accéder aux données à partir du pod du rédacteur
Cette section explique comment utiliser une interface de ligne de commande pour accéder à un pod lecteur ou rédacteur. Vous pouvez voir le composant partagé dans lequel le rédacteur écrit et le lecteur lit.
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.