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 :
- Activez l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande
gcloud components update
.
- Assurez-vous que votre application conteneurisée est stockée dans un registre d'images, tel qu'Artifact 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 règle générale, vous devez créer des objets PersistentVolumeClaim en plus de créer le pod. Cependant, les objets StatefulSet 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 une ressource 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
Remplacez l'élément suivant :
STATEFULSET_NAME
: nom de l'objet StatefulSet.SERVICE_NAME
: nom du service.APP_NAME
: nom de l'application exécutée dans les pods.CONTAINER_NAME
: nom des conteneurs dans les pods.PORT_NAME
: nom du port ouvert par l'objet StatefulSet.PVC_NAME
: 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 type de 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 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
Remplacez l'élément suivant :
APP_NAME
: nom de l'application exécutée dans les pods.STATEFULSET_NAME
: nom de l'objet StatefulSet.CONTAINER_NAME
: nom des conteneurs dans les pods.PORT_NAME
: nom du port ouvert par l'objet StatefulSet.PVC_NAME
: nom de l'objet PersistentVolumeClaim.STORAGECLASS_NAME
: nom de l'objet StorageClass.
Pour créer une ressource StatefulSet, exécutez la commande suivante en remplaçant STATEFULSET_FILE
par le nom du fichier manifeste :
kubectl apply -f STATEFULSET_FILE
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 de la ressource 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
Pour obtenir des informations sur un pod spécifique, exécutez la commande suivante :
kubectl describe pod POD_NAME
Pour obtenir la liste des objets PersistentVolumeClaim qui ont été 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 à la page Charges de travail dans la console Google Cloud.
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 shell 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 la console Google Cloud.
Vous pouvez déployer les mises à jour de spécification de pods pour une ressource 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, par exemple lors du scaling ou pour spécifier une nouvelle version de votre application.
Pour mettre à jour un StatefulSet, exécutez la commande suivante :
kubectl apply -f STATEFULSET_FILE
Remplacez STATEFULSET_FILE
par 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 à la page Charges de travail dans la console Google Cloud.
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 afficher 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 à la page Charges de travail dans la console Google Cloud.
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.
Scaling d'un StatefulSet
kubectl
Vous pouvez utiliser la commande 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
Remplacez NUMBER_OF_REPLICAS
par le nombre souhaité de pods répliqués.
Console
Pour effectuer le scaling d'un StatefulSet, procédez comme suit :
Accédez à la page Charges de travail dans la console Google Cloud.
Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez modifier.
Cliquez sur listActions > Effectuer le scaling > Modifier les instances dupliquées
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 à la page Charges de travail dans la console Google Cloud.
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.
Étapes suivantes
- Découvrez comment déployer un cluster MySQL sur GKE pour assurer une haute disponibilité.
- 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.