Formation DevOps | Formation kubernetes​ : StatefulSet

www.itgalaxy.io

StatefulSet dans Kubernetes

Les StatefulSets sont des objets Kubernetes essentiels pour gérer des applications stateful, c’est-à-dire des applications qui nécessitent de conserver un état entre les sessions. Contrairement aux applications stateless, où les instances peuvent être repoussées et remplacées sans impacts sur le service, les applications stateful doivent conserver des identités réseau et/ou des volumes de données persistants.

Importance des StatefulSets

Un StatefulSet attribue une identité unique et stable à chaque pod qu’il gère. Cette identité est cruciale pour certaines applications comme les bases de données ou les systèmes de fichiers distribués. Les StatefulSets garantissent également une mise à l’échelle et un déploiement ordonnés, ce qui est nécessaire pour certaines applications qui ne peuvent pas être démarrées ou arrêtées dans un ordre aléatoire.

Caractéristiques des StatefulSets

Les StatefulSets sont particulièrement utiles lorsque ces éléments sont requis:

  • Identifiants de réseau stables et uniques : Chaque pod dans un StatefulSet reçoit un nom DNS unique basé sur le nom du StatefulSet.
  • Stockage stable et persistant : Chaque pod peut avoir son propre volume persistant associé, assurant que les données ne sont pas perdues lors des redémarrages.
  • Déploiement et mise à l’échelle ordonnés et gracieux : Les pods sont créés et supprimés dans un ordre spécifique (“0, 1, 2…” pour une scalabilité ascendante et “2, 1, 0…” pour une scalabilité descendante).
  • Mises à jour progressives ordonnées : Les mises à jour des pods peuvent être exécutées de manière ordonnée, minimisant les risques d’interruption de service.

Limitations des StatefulSets

Cependant, il y a certaines limitations et considérations à garder à l’esprit :

  • Le stockage d’un pod donné doit être provisionné soit par un fournisseur de volume persistant, soit pré-provisionné par un administrateur.
  • La suppression d’un StatefulSet ne supprimera pas automatiquement les volumes associés. Cela permet de garantir la sécurité des données.
  • Les StatefulSets nécessitent la création d’un service sans tête pour gérer l’identité des pods, ce qui doit être pris en charge par l’utilisateur.
  • Les StatefulSets ne garantissent pas une résiliation ordonnée des pods lors de la suppression d’un StatefulSet. Pour une terminaison ordonnée, le StatefulSet peut être réduit à zéro avant d’être supprimé.

Composants d’un StatefulSet

Pour illustrer la création d’un StatefulSet, considérons les composants essentiels en utilisant des fichiers YAML.

Création d’un PersistentVolume

Pour commencer, créons un PersistentVolume:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/data"

Ce qui précède crée un volume qui peut être utilisé par nos pods pour stocker des données de manière persistante.

Création d’un PersistentVolumeClaim

Ensuite, créons une réclamation pour ce volume :

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: www
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Création du StatefulSet

Maintenant, nous allons créer le StatefulSet lui-même :

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx  # doit correspondre à .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3  # par défaut 1
  minReadySeconds: 10  # par défaut 0
  template:
    metadata:
      labels:
        app: nginx  # doit correspondre à .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: www

Création d’un Service sans Tête

Enfin, créons le service sans tête nécessaire pour identifier nos pods :

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

Le champ clusterIP: None permet d’indiquer qu’il s’agit d’un service sans tête. Ce service gérera l’identité réseau des pods de notre StatefulSet, facilitant ainsi les communications entre eux.

Test de Fonctionnement du StatefulSet

Pour tester le bon fonctionnement de notre StatefulSet, nous allons créer un fichier index.html dans le répertoire /tmp/data de l’un des nœuds du cluster. Ce fichier contiendra un message d’accueil :

Connectez-vous à un des nœuds de votre cluster.
Créez le fichier index.html dans le répertoire /tmp/data :

echo "<h1>Bonjour depuis StatefulSet</h1>" > /tmp/data/index.html

Ensuite, vous pouvez interroger le service pour voir le contenu :

curl nginx.default.svc.cluster.local







Conclusion

Les StatefulSets dans Kubernetes jouent un rôle crucial dans le déploiement d’applications qui nécessitent une persistance et un état. Grâce à leurs caractéristiques, comme les identifiants uniques pour chaque pod et la gestion des volumes persistants, les StatefulSets permettent de gérer efficacement des applications critiques telles que les bases de données, où chaque instance doit conserver un état. En comprenant comment configurer et utiliser les StatefulSets, vous pouvez développer des applications plus résilientes et prêtes pour la production dans des environnements Kubernetes.








1. Nous contactez


2. Infra as a Service

  • Description: Infrastructure cloud évolutive et sécurisée
  • Links:

3. Projets Développeurs


4. Développeurs


5. Formations Complètes


6. Marketplace

7. Blogs


This website is powered by ItGalaxy.io