Cette page explique comment déployer une application avec état à l'aide de Google Kubernetes Engine (GKE).
Présentation
Les applications avec état enregistrent les données dans un stockage sur disque persistant destiné au serveur, aux clients et aux autres applications. Une application avec état est, par exemple, une base de données ou un espace de stockage de paires clé/valeur où les données sont enregistrées et récupérées par d'autres applications.
Le stockage persistant peut être provisionné de manière dynamique, de sorte que les volumes sous-jacents n'ont pas besoin d'être créés à la demande. Dans Kubernetes, le provisionnement dynamique est configuré en créant une StorageClass. Dans GKE, une classe StorageClass par défaut vous permet de provisionner de manière dynamique des disques persistants Compute Engine.
Kubernetes utilise le contrôleur StatefulSet pour déployer des applications avec état en tant qu'objets StatefulSet. Les pods des StatefulSets ne sont pas interchangeables : chaque pod possède un identifiant unique qui est maintenu, peu importe l'emplacement lié à sa planification.
Les applications avec état diffèrent des applications sans état, dans lesquelles les données client ne sont pas enregistrées sur le serveur entre les sessions.
Apprenez-en plus sur le stockage persistant dans les clusters multizones et régionaux.
Avant de commencer
Avant de commencer, effectuez les tâches suivantes :
- Assurez-vous d'avoir activé l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- Assurez-vous d'avoir installé le SDK Cloud.
Configurez les paramètres gcloud
par défaut à l'aide de l'une des méthodes suivantes :
- Utilisez
gcloud init
pour suivre les instructions permettant de définir les paramètres par défaut. - Utilisez
gcloud config
pour définir individuellement l'ID, la zone et la région de votre projet.
Utiliser gcloud init
Si le message d'erreur One of [--zone, --region] must be supplied: Please specify
location
s'affiche, effectuez les tâches ci-dessous.
-
Exécutez
gcloud init
et suivez les instructions :gcloud init
Si vous utilisez SSH sur un serveur distant, utilisez l'option
--console-only
pour empêcher la commande d'ouvrir un navigateur :gcloud init --console-only
- Suivez les instructions pour autoriser
gcloud
à utiliser votre compte Google Cloud. - Créez ou sélectionnez une configuration.
- Choisissez un projet Google Cloud.
- Choisissez une zone Compute Engine par défaut pour les clusters zonaux ou une région pour les clusters régionaux ou Autopilot.
Utiliser gcloud config
- Définissez votre ID de projet par défaut :
gcloud config set project PROJECT_ID
- Si vous utilisez des clusters zonaux, définissez votre zone de calcul par défaut :
gcloud config set compute/zone COMPUTE_ZONE
- Si vous utilisez des clusters Autopilot ou régionaux, définissez votre région de calcul par défaut:
gcloud config set compute/region COMPUTE_REGION
- Mettez à jour
gcloud
vers la dernière version :gcloud components update
- Assurez-vous que votre application conteneurisée est stockée dans un registre d'images, tel que Container Registry.
Vous pouvez suivre le guide de démarrage rapide pour activer l'API GKE, créer un cluster et en savoir plus sur GKE.
Demander un stockage persistant dans un StatefulSet
Les applications peuvent demander un stockage permanent à l'aide d'un objet PersistentVolumeClaim.
En principe, les objets PersistentVolumeClaim doivent être créés par l'utilisateur en plus du pod. Cependant, les objets StatefulSets incluent un tableau volumeClaimTemplates
, qui génère automatiquement les objets PersistentVolumeClaim. Chaque instance dupliquée de StatefulSet obtient son propre objet PersistentVolumeClaim.
Vous pouvez également utiliser un disque préexistant dans un objet StatefulSet.
Créer un StatefulSet
Pour créer un objet StatefulSet, utilisez la commande kubectl apply
.
La commande kubectl apply
utilise des fichiers manifestes pour créer, mettre à jour et supprimer des ressources dans votre cluster. Il s'agit d'une méthode déclarative de configuration d'objet. Cette méthode conserve les écritures effectuées sur les objets actifs sans fusionner les modifications dans les fichiers de configuration d'objet.
Linux
Le fichier manifeste suivant est un exemple simple d'objet StatefulSet régi par un objet Service qui a été créé séparément :
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-name
spec:
selector:
matchLabels:
app: app-name
serviceName: "service-name"
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: app-name
spec:
containers:
- name: container-name
image: ...
ports:
- containerPort: 80
name: port-name
volumeMounts:
- name: pvc-name
mountPath: ...
volumeClaimTemplates:
- metadata:
name: pvc-name
annotations:
...
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Où :
- statefulset-name est le nom de l'objet StatefulSet.
- service-name est le nom du service.
- app-name est le nom de l'application exécutée dans les pods.
- container-name est le nom des conteneurs dans les pods.
- port-name est le nom du port ouvert par l'objet StatefulSet.
- pvc-name est le nom de l'objet PersistentVolumeClaim.
Dans ce fichier, le champ kind
indique qu'un objet StatefulSet doit être créé avec les spécifications définies dans le fichier. Cet exemple d'objet StatefulSet génère trois pods répliqués et ouvre le port 80 pour exposer l'objet StatefulSet à Internet.
Windows
Lorsque vous utilisez des clusters avec des pools de nœuds Windows Server, vous devez créer un objet StorageClass, car l'objet StorageClass par défaut utilise le système de fichiers ext4 qui n'est compatible qu'avec les conteneurs Linux. Si vous utilisez un disque persistant Compute Engine, vous devez utiliser le type de stockage de fichiers NTFS, comme indiqué dans l'exemple suivant :
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: storageclass-name
parameters:
type: pd-standard
fstype: NTFS
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
Le fichier manifeste StatefulSet suivant utilise l'objet StorageClass que vous avez défini ci-dessus. Il crée quatre paires d'objets PersistentVolume et PersistentVolumeClaim pour représenter quatre disques persistants Compute Engine. Chaque pod de l'objet StatefulSet consomme un disque persistant.
Pour faire en sorte que vos pods soient correctement programmés sur des nœuds Windows Server, vous devez ajouter un sélecteur de nœuds à votre spécification de pod.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-name
spec:
replicas: 4
selector:
matchLabels:
app: app-name
template:
metadata:
labels:
app: app-name
name: container-name
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: container-name
image: ...
ports:
- containerPort: 80
name: port-name
volumeMounts:
- name: pvc-name
mountPath: C:\mnt\state
volumeClaimTemplates:
- metadata:
name: pvc-name
spec:
storageClassName: storageclass-name
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Où :
- app-name est le nom de l'application exécutée dans les pods.
- statefulset-name est le nom de l'objet StatefulSet.
- container-name est le nom des conteneurs dans les pods.
- port-name est le nom du port ouvert par l'objet StatefulSet.
- pvc-name est le nom de l'objet PersistentVolumeClaim.
- storageclass-name est le nom de l'objet StorageClass.
Pour créer un StatefulSet, exécutez la commande suivante :
kubectl apply -f statefulset-file
où statefulset-file est le fichier manifeste.
Vous pouvez également utiliser la commande kubectl apply -f directory/
pour créer tous les objets (sauf ceux existants) définis dans les fichiers de configuration stockés dans un même répertoire.
Inspecter un StatefulSet
kubectl
Pour inspecter le StatefulSet, exécutez la commande suivante :
kubectl get statefulset statefulset-name -o yaml
Cette commande affiche la configuration active du StatefulSet au format YAML.
Pour répertorier les pods créés par le StatefulSet, exécutez la commande suivante :
kubectl get pods -l app=app-name
Dans cette commande, l'indicateur -l
demande à kubectl
d'obtenir tous les pods libellés pour app-name.
Le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE pod-name 1/1 Running 0 1m pod-name 1/1 Running 0 1m
Pour obtenir des informations détaillées sur le StatefulSet, exécutez la commande suivante :
kubectl describe statefulset statefulset-name
où statefulset-name est le nom du StatefulSet.
Pour obtenir des informations sur un pod spécifique, exécutez la commande suivante :
kubectl describe pod pod-name
Pour répertorier les objets PersistentVolumeClaim créés, exécutez la commande suivante :
kubectl get pvc
Le résultat ressemble à ce qui suit :
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE statefulset-name-pvc-name-0 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800002 1G RWO standard 9s statefulset-name-pvc-name-1 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800003 1G RWO standard 9s statefulset-name-pvc-name-2 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800004 1G RWO standard 9s
Pour obtenir des informations sur un objet PersistentVolumeClaim spécifique, exécutez la commande suivante :
kubectl describe pvc statefulset-name-pvc-name-0
Pour obtenir des informations sur un objet PersistentVolume spécifique, exécutez la commande suivante :
kubectl describe pv pv-name
Console
Pour inspecter un StatefulSet, procédez comme suit :
Accédez au menu "Charges de travail" de Google Kubernetes Engine dans Cloud Console.
Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez inspecter.
Sur la page Détails de l'ensemble avec état, effectuez l'une des opérations suivantes :
- Cliquez sur l'onglet Historique des révisions pour afficher l'historique des révisions de l'objet StatefulSet.
- Cliquez sur l'onglet Events (Événements) pour afficher tous les événements liés à l'objet StatefulSet.
- Cliquez sur l'onglet Journaux pour afficher les journaux du conteneur de l'objet StatefulSet.
- Cliquez sur l'onglet YAML pour afficher, copier ou télécharger le fichier de configuration YAML pour l'objet StatefulSet.
Mettre à jour un StatefulSet
Il existe plusieurs moyens de mettre à jour un StatefulSet. La méthode déclarative courante est kubectl apply
. Pour mettre à jour le StatefulSet directement à partir de votre interface système ou dans l'éditeur de votre choix, vous pouvez utiliser kubectl edit
. Vous pouvez également utiliser l'éditeur YAML à partir du menu "Charges de travail" de GKE dans Cloud Console.
Vous pouvez déployer les mises à jour de spécification de pods d'un objet StatefulSet, telles que l'image, les requêtes/utilisations de ressources ou la configuration associées.
kubectl apply
Vous pouvez mettre à jour le StatefulSet en appliquant un fichier manifeste nouveau ou mis à jour. Cette pratique est utile pour apporter diverses modifications au StatefulSet, telles que le scaling ou la spécification d'une nouvelle version de votre application.
Pour mettre à jour un StatefulSet, exécutez la commande suivante :
kubectl apply -f statefulset-file
où statefulset-file est le fichier manifeste mis à jour.
La commande kubectl apply
applique un fichier manifeste à une ressource. Si la ressource spécifiée n'existe pas, elle est créée par la commande.
Pour plus d'informations sur kubectl apply
, consultez la documentation de référence kubectl
.
Console
Pour modifier la configuration active d'un StatefulSet, procédez comme suit :
Accédez au menu "Charges de travail" de Google Kubernetes Engine dans Cloud Console.
Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez modifier.
Cliquez sur edit Modifier.
Modifiez la configuration YAML selon vos besoins.
Cliquez sur Enregistrer.
Inspecter le déploiement de la mise à jour
kubectl
Pour inspecter le déploiement du StatefulSet, exécutez la commande suivante :
kubectl rollout status statefulset statefulset-name
Pour consulter l'historique de déploiement du StatefulSet, exécutez la commande suivante :
kubectl rollout history statefulset statefulset-name
Pour annuler un déploiement, exécutez la commande suivante :
kubectl rollout undo statefulset statefulset-name
Console
Pour afficher l'historique des révisions d'un StatefulSet, procédez comme suit :
Accédez au menu "Charges de travail" de Google Kubernetes Engine dans Cloud Console.
Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez inspecter.
Cliquez sur l'onglet Revision History (Historique des révisions).
Sélectionnez la révision souhaitée.
Stratégies de mise à jour
Le champ updateStrategy
des objets StatefulSet vous permet de configurer et de désactiver les mises à jour automatiques progressives des conteneurs, des étiquettes, des demandes ou limites de ressources, et des annotations associés pour leurs pods.
Pour en savoir plus sur les stratégies de mise à jour des objets StatefulSets, consultez la documentation de Kubernetes.
Effectuer le scaling d'un StatefulSet
kubectl
Vous pouvez utiliser kubectl scale
à tout moment pour effectuer le scaling de vos objets StatefulSet.
Pour effectuer le scaling manuel d'un StatefulSet, exécutez la commande suivante :
kubectl scale statefulset statefulset-name --replicas number-of-replicas
où number-of-replicas est le nombre souhaité de pods répliqués.
Console
Pour effectuer le scaling d'un StatefulSet, procédez comme suit :
Accédez au menu "Charges de travail" de Google Kubernetes Engine dans Cloud Console.
Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez modifier.
Cliquez sur fullscreen Faire évoluer.
Saisissez le nouveau nombre d'instances dupliquées pour l'objet StatefulSet.
Cliquez sur Faire évoluer.
Supprimer un StatefulSet
kubectl
Pour supprimer un StatefulSet, exécutez la commande suivante :
kubectl delete statefulset statefulset-name
Console
Pour supprimer un StatefulSet, procédez comme suit :
Accédez au menu "Charges de travail" de Google Kubernetes Engine dans Cloud Console.
Dans la liste des charges de travail, sélectionnez un ou plusieurs objets StatefulSets que vous souhaitez supprimer.
Cliquez sur delete Supprimer.
Lorsque vous êtes invité à confirmer l'opération, cliquez sur Supprimer.
Étape suivante
- Familiarisez-vous avec le déploiement d'applications sans état.
- Suivez un tutoriel sur la mise à niveau d'un cluster exécutant une charge de travail avec état.