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
ReadWriteMany
soit 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.
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
volumeBindingMode
est défini surImmediate
, ce qui permet de commencer immédiatement le provisionnement du volume.tier
est défini surstandard
pour 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éfinisseztier
surenterprise
. Remarque: La règle de récupération pour le PV créé dynamiquement est définie par défaut surDelete
si lereclaimPolicy
duStorageClass
n'est pas défini.
Créez la ressource
StorageClass
:kubectl create -f filestore-storageclass.yaml
Vérifiez que la classe de stockage est créée:
kubectl get sc
Le résultat ressemble à ce qui suit :
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
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éez la ressource
StorageClass
:kubectl create -f preprov-storageclass.yaml
Vérifiez que la classe de stockage est créée:
kubectl get sc
Le résultat ressemble à ce qui suit :
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Créer un volume persistant pour l'instance Filestore
Vérifiez que l'instance Filestore préexistante est prête:
gcloud filestore instances list
Le résultat ressemble à ce qui suit, où la valeur
STATE
estREADY
: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:28
Notez les valeurs
INSTANCE_NAME
,LOCATION
,FILE_SHARE_NAME
etIP_ADDRESS
de 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_ADDRESS
Remplacez 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.yaml
Créer le PV :
kubectl apply -f preprov-pv.yaml
Vérifiez que le champ
STATUS
du PV est défini surBound
:kubectl get pv
Le 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 46m
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
.
Déployez la PVC:
kubectl create -f pvc.yaml
Vérifiez que la PVC est créée:
kubectl get pvc
Le 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 92m
Vérifiez que l'instance Filestore que vous venez de créer est prête:
gcloud filestore instances list
Le 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:19
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.
Déployez le pod du lecteur:
kubectl apply -f reader-fs.yaml
Vérifiez que les instances dupliquées du lecteur sont en cours d'exécution en interrogeant la liste des pods:
kubectl get pods
Le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s
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.
Déployez le pod rédacteur :
kubectl apply -f writer-fs.yaml
Vérifiez que les pods du rédacteur sont en cours d'exécution en interrogeant la liste des pods:
kubectl get pods
Le 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 2m31s
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.
Créez un service de type
LoadBalancer
nomméreader-lb
:kubectl create -f loadbalancer.yaml
Regardez le déploiement afin de constater que GKE attribue une
EXTERNAL-IP
au servicereader-lb
:kubectl get svc --watch
Lorsque
Service
est prêt, la colonneEXTERNAL-IP
affiche 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 2d20h
Appuyez sur Ctrl+C pour mettre fin au processus de contrôle.
Utilisez un navigateur Web pour accéder à l'
EXTERNAL-IP
attribué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é.
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).
Effectuez un scaling à la hausse de
writer
à cinq instances dupliquées:kubectl scale deployment writer --replicas=5
Le résultat ressemble à ce qui suit :
deployment.extensions/writer 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 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 4m
Utilisez un navigateur Web pour accéder de nouveau à l'
EXTERNAL-IP
attribuée à l'équilibreur de charge.
À 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.
Obtenez le nom du pod du rédacteur:
kubectl get pods
Le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20d
Notez 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/sh
Consultez le composant partagé dans le fichier
indexData.html
:cd /html cat indexData.html
Effacez le fichier
indexData.html
:echo '' > indexData.html
Actualisez le navigateur Web hébergeant l'adresse
EXTERNAL-IP
pour afficher la modification.Quittez l'environnement:
exit