Présentation de la version alpha des instantanés de volume dans Kubernetes



Remarque perev. : L'article original a été récemment publié sur le blog Kubernetes et a été écrit par des employés de Google et Huawei (Jing Xu, Xing Yang, Saad Ali), dont vous avez certainement vu l'activité active dans le GitHub du projet, si vous avez déjà été intéressé par les fonctionnalités et problèmes de K8 liés à avec stockage de données. Les ingénieurs parlent de l'objectif des instantanés de volume, de leurs capacités actuelles et des bases de leur utilisation.

Kubernetes v1.12 a introduit une version alpha de prise en charge des instantanés pour les volumes. Cette fonctionnalité vous permet de créer et de supprimer des instantanés de volumes, ainsi que de créer de nouveaux volumes à partir d'instantanés en utilisant les moyens "natifs" du système - via l'API Kubernetes.

Qu'est-ce qu'un instantané?


De nombreux systèmes de stockage (comme Google Cloud Persistent Disks, Amazon Elastic Block Storage et de nombreux systèmes de stockage sur site) offrent la possibilité de créer un instantané («instantané») pour un volume permanent. Un instantané est une copie d'un volume à un moment donné. Il peut être utilisé pour fournir un nouveau volume (déjà rempli de données à partir d'un instantané) ou restaurer un volume existant à un état précédent (qui est présenté dans un instantané).

Pourquoi ajouter des instantanés à Kubernetes?


Une puissante abstraction est déjà disponible dans le système de plug-in de volume Kubernetes, automatisant l'approvisionnement, la connexion et le montage des stockages de blocs et de fichiers.

Fournir toutes ces fonctionnalités fait partie des objectifs de tolérance de charge de travail de Kubernetes: Kubernetes cherche à créer une couche d'abstraction entre les applications qui fonctionnent comme des systèmes distribués et les clusters sous-jacents afin que les applications soient indépendantes du cluster spécifique sur lequel elles s'exécutent, et le déploiement d'applications ne nécessite pas toute connaissance spécifique au cluster.

Kubernetes Storage SIG a identifié les opérations d'instantanés comme des capacités critiques pour une variété de charges de travail avec état. Par exemple, un administrateur de base de données peut vouloir prendre un instantané de sa base de données avant d'effectuer toute opération sur celle-ci.

En faisant de l'API Kubernetes un moyen standard d'appeler des opérations de snapshot, les utilisateurs de Kubernetes peuvent travailler avec eux sans avoir besoin de solutions de contournement (et d'invocation manuelle d'opérations spécifiques au système de stockage). Au lieu de cela, les utilisateurs ont eu la possibilité d'intégrer des opérations d'instantanés dans leurs outils et politiques, sachant que tout fonctionnera avec tous les clusters Kubernetes, quel que soit le stockage sous-jacent.

En outre, ces primitives Kubernetes fonctionnent comme des blocs de construction de base, ouvrant la voie au développement de fonctionnalités plus avancées au niveau de l'entreprise pour la gestion du stockage - par exemple, pour la protection, la réplication et la migration des données.

Quels plugins de volume prennent en charge les instantanés dans Kubernetes?


Kubernetes prend en charge trois types de plug-ins de volume: dans l'arborescence, Flex et CSI. Consultez la FAQ du plug-in de volume Kubernetes pour plus de détails.

Les instantanés ne sont pris en charge que pour les pilotes CSI (ils ne sont pas pris en charge pour l'arborescence ou Flex). Pour tirer parti de cette fonctionnalité, assurez-vous que le pilote CSI qui implémente la prise en charge des instantanés est déployé dans le cluster Kubernetes.

Au moment de la publication de ce blog (9 octobre 2018 - traduction approximative ) , les instantanés sont pris en charge par les pilotes CSI suivants:


La prise en charge des instantanés pour d' autres pilotes est en cours de développement et devrait être disponible prochainement. Plus de détails sur CSI et comment déployer les pilotes CSI sont décrits dans la publication « Container Storage Interface (CSI) for Kubernetes Goes Beta » (et voir également notre traduction de la note « Understanding Container Storage Interface (in Kubernetes and more) » - environ trad. ) .

API Kubernetes pour les instantanés


Pour gérer les snapshots, Kubernetes Volume Snapshots introduit trois nouveaux objets API de la même manière que dans l'API Kubernetes Persistent Volumes:

  • VolumeSnapshot
    • Créé par l'utilisateur Kubernetes pour demander un instantané pour le volume spécifié. Contient des informations sur l'opération de capture instantanée, telles que l'horodatage pour la suppression de la capture instantanée et sa disponibilité.
    • Comme pour l'objet PersistentVolumeClaim , la création et la suppression de cet objet représentent le souhait de l'utilisateur de créer ou de supprimer une ressource de cluster (instantané).
  • VolumeSnapshotContent
    • Créé par le pilote CSI lorsque l'instantané a été créé avec succès. Contient des informations sur l'instantané, y compris son ID.
    • Comme un objet PersistentVolume , il représente une ressource déjà desservie par le cluster (instantané).
    • Comme les objets PersistentVolumeClaim et PersistentVolume , lorsqu'un instantané est créé, l'objet VolumeSnapshotContent attaché au VolumeSnapshot pour lequel il a été créé (un mappage un à un est utilisé).
  • VolumeSnapshotClass
    • Défini par les administrateurs de cluster pour décrire les instantanés pouvant être créés. Comprend des informations sur le pilote, des secrets pour accéder aux instantanés, etc.

Il est important de noter que - contrairement aux principaux objets de volume persistant dans Kubernetes - ces objets instantanés sont définis comme CustomResourceDefinitions (CRD) . Le projet Kubernetes s'éloigne progressivement des types de ressources prédéfinis dans le serveur API, s'approchant d'un modèle dans lequel le serveur API est indépendant des objets API. Cette approche vous permet de réutiliser le serveur API dans d'autres projets (en plus de Kubernetes), et les consommateurs (comme Kubernetes) peuvent définir les types de ressources dont ils ont besoin en tant que CRD.

Les pilotes CSI qui prennent en charge les instantanés installeront automatiquement les CRD nécessaires. Les utilisateurs finaux de Kubernetes doivent uniquement vérifier que le pilote CSI qui prend en charge les instantanés est déployé dans le cluster.

En plus de ces nouveaux objets, le PersistentVolumeClaim existant PersistentVolumeClaim un nouveau champ DataSource :

 type PersistentVolumeClaimSpec struct { AccessModes []PersistentVolumeAccessMode Selector *metav1.LabelSelector Resources ResourceRequirements VolumeName string StorageClassName *string VolumeMode *PersistentVolumeMode DataSource *TypedLocalObjectReference } 

Ce champ (dans l'état de la version alpha) vous permet de le remplir automatiquement avec les données d'un instantané existant lors de la création d'un nouveau volume.

Configuration requise pour les instantanés Kubernetes


Avant d'utiliser des instantanés de volume dans Kubernetes, vous devez:

  • assurez-vous que le pilote CSI qui implémente les instantanés est déployé et s'exécute sur le cluster;
  • activer la fonction Kubernetes Volume Snapshotting via la nouvelle porte des fonctionnalités (désactivée par défaut pour la version alpha):
    • définissez l'indicateur suivant pour l' --feature-gates=VolumeSnapshotDataSource=true serveur API: --feature-gates=VolumeSnapshotDataSource=true

Avant de créer un instantané, vous devez également déterminer le pilote CSI à utiliser, ce qui se fait en créant un objet VolumeSnapshotClass et en spécifiant le pilote CSI dans le champ de l' snapshotter . Dans l'exemple de VolumeSnapshotClass ci-dessous, ce pilote est com.example.csi-driver . Chaque fournisseur d'instantanés nécessite au moins un objet VolumeSnapshotClass . Il est également possible de définir une VolumeSnapshotClass par défaut pour chaque pilote CSI - cela se fait en définissant l'annotation snapshot.storage.kubernetes.io/is-default-class: "true" dans la définition de classe:

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: default-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" snapshotter: com.example.csi-driver apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: csi-snapclass snapshotter: com.example.csi-driver parameters: fakeSnapshotOption: foo csiSnapshotterSecretName: csi-secret csiSnapshotterSecretNamespace: csi-namespace 

Tous les paramètres requis doivent être définis conformément à la documentation du pilote CSI. Dans l'exemple ci-dessus, le paramètre fakeSnapshotOption: foo et tous les secrets mentionnés seront transmis au pilote CSI lors de la création et de la suppression de l'instantané. Le snapshotter externe CSI enregistre par défaut les clés de paramètres csiSnapshotterSecretName et csiSnapshotterSecretNamespace .

Enfin, avant de créer un instantané, vous devez créer le volume via le pilote CSI et le remplir avec les données que vous souhaitez y voir (voir cette publication pour plus de détails sur l'utilisation des volumes CSI).

Création d'un nouvel instantané dans Kubernetes


Une fois que l'objet VolumeSnapshotClass défini et correspond au volume duquel vous souhaitez supprimer l'instantané, vous pouvez effectuer cette opération en créant l'objet VolumeSnapshot .

La source de l'instantané est déterminée par deux paramètres:

  • kind - PersistentVolumeClaim indiqué ici;
  • name - le nom réel de l'objet PVC.

Il est entendu que l'espace de noms du volume pour lequel l'instantané est créé est déterminé par l'espace de noms de l'objet VolumeSnapshot .

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: name: new-snapshot-demo namespace: demo-namespace spec: snapshotClassName: csi-snapclass source: name: mypvc kind: PersistentVolumeClaim 

La spécification VolumeSnapshot peut VolumeSnapshot une VolumeSnapshotClass qui contient des informations sur le pilote CSI qui sera utilisé pour créer l'instantané. Comme indiqué précédemment, après avoir créé l'objet VolumeSnapshot le paramètre fakeSnapshotOption: foo et tous les secrets VolumeSnapshotClass mentionnés sont transmis au plug com.example.csi-driver in CSI com.example.csi-driver dans l'appel CreateSnapshot .

En réponse à une telle demande, le pilote CSI prend un instantané du volume, puis crée automatiquement un objet VolumeSnapshotContent qui représente le nouvel instantané et lie cet objet au VolumeSnapshot , le rendant prêt à l'emploi. Si le pilote CSI ne peut pas créer un instantané et renvoie une erreur, le contrôleur d'instantané signale cette erreur dans l'état de l'objet VolumeSnapshot et n'effectue pas de nouvelles tentatives (ce comportement est différent des autres contrôleurs de Kubernetes - il est implémenté afin de ne pas créer un instantané à des moments imprévisibles) .

Si la classe d'instantanés n'est pas spécifiée, external-snapshotter essaiera de trouver la classe par défaut et l'utilisera pour l'instantané créé. Dans ce cas, le pilote CSI pointé par le snapshotter dans la classe par défaut doit correspondre au pilote CSI pointé par le provisioner dans la classe de stockage PVC.

Veuillez noter que la version alpha des instantanés pour Kubernetes ne fournit aucune garantie de cohérence. Pour garantir des données complètes dans un instantané, il est nécessaire de préparer correctement l'application (arrêter l'application, figer le système de fichiers, etc.) avant de la supprimer.

Pour VolumeSnapshot que l'objet VolumeSnapshot a VolumeSnapshot créé et associé au VolumeSnapshotContent , vous pouvez utiliser la kubectl describe volumesnapshot :

  • Ready doit être true dans Status , ce qui indique que l'instantané de volume est prêt à être utilisé.
  • Le champ Creation Time indique quand l'instantané a été réellement pris.
  • Le champ Restore Size est la taille de volume minimale pour restaurer un instantané.
  • Le champ Snapshot Content Name dans la spécification pointe vers l'objet VolumeSnapshotContent créé pour cet instantané.

Importer un instantané existant dans Kubernetes


Un instantané existant peut être importé dans Kubernetes en créant manuellement un objet VolumeSnapshotContent qui représentera cet instantané. Étant donné que VolumeSnapshotContent est un objet API qui n'est pas lié à un espace de noms, seul l'administrateur système a le droit de le créer.

Lorsque l'objet VolumeSnapshotContent créé, l'utilisateur peut créer un autre objet - VolumeSnapshot - qui pointera vers lui. Le contrôleur d'instantané externe marquera l'instantané comme prêt après avoir vérifié l'existence et l'exactitude de la connexion entre les VolumeSnapshotContent VolumeSnapshot et VolumeSnapshotContent . Un instantané est prêt à être utilisé dans Kubernetes lorsque cette connexion est établie.

L'objet VolumeSnapshotContent doit être créé avec les champs suivants représentant l'instantané préapprovisionné:

  • csiVolumeSnapshotSource - informations identifiant un instantané:
    • snapshotHandle - nom / identifiant pour l'instantané. Champ obligatoire;
    • driver - Le pilote CSI fonctionnait avec ce volume. Champ obligatoire. Doit correspondre au nom de l' snapshotter dans le contrôleur (contrôleur d'instantané);
    • creationTime et restoreSize - Pour les volumes pré-provisionnés, ces champs sont facultatifs. Le contrôleur de snapshotter externe les mettra automatiquement à jour après avoir créé un snapshot.
  • volumeSnapshotRef - pointeur vers l'objet VolumeSnapshot auquel cet objet (c'est-à-dire VolumeSnapshotContent ) doit être attaché:
    • name et namespace - le nom et l'espace de noms de l'objet VolumeSnapshot dont le contenu est lié;
    • UID - champ facultatif (pour les volumes pré-préparés). Le contrôleur de snapshotter externe mettra automatiquement à jour ce champ après la liaison. Si l'utilisateur définit ce champ, vous devez vous assurer qu'il correspond à l'UID de l'instantané pour lequel la liaison se produit. S'il n'y a pas une telle correspondance, le contenu est considéré comme non pertinent (objet orphelin) et par conséquent le contrôleur le supprimera à la fois lui et l'instantané associé.
  • snapshotClassName est un champ facultatif. Le contrôleur de snapshotter externe le mettra automatiquement à jour après la liaison.

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotContent metadata: name: static-snapshot-content spec: csiVolumeSnapshotSource: driver: com.example.csi-driver snapshotHandle: snapshotcontent-example-id volumeSnapshotRef: kind: VolumeSnapshot name: static-snapshot-demo namespace: demo-namespace 

Un objet VolumeSnapshot doit être créé afin que l'utilisateur puisse travailler avec l'instantané. Dans ce document:

  • snapshotClassName - nom de la classe d'instantanés du volume. Champ facultatif. S'il est défini, le champ d'instantané de la classe d'instantanés doit correspondre au nom du contrôleur d'instantanés. S'il n'est pas défini, le contrôleur recherchera la classe d'instantanés par défaut;
  • snapshotContentName - le nom du contenu du volume de snapshot. Champ obligatoire pour les volumes pré-préparés.

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: name: static-snapshot-demo namespace: demo-namespace spec: snapshotClassName: csi-snapclass snapshotContentName: static-snapshot-content 

Lorsque ces objets sont créés, le contrôleur de snapshot les liera, définissez le champ Ready (dans Status ) sur True , indiquant que le snapshot est prêt à être utilisé.

Préparation d'un nouveau volume à partir d'un instantané dans Kubernetes


Pour créer un nouveau volume prérempli avec des données de l'objet instantané, utilisez le nouveau champ dataSource dans PersistentVolumeClaim . Il a trois paramètres:

  • name - nom de l'objet VolumeSnapshot représentant la source de l'instantané;
  • kind - doit être défini comme VolumeSnapshot ;
  • apiGroup - doit être snapshot.storage.k8s.io .

Il est supposé que l'espace de noms de la source - VolumeSnapshot - correspond à l'espace de noms de PersistentVolumeClaim .

 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore Namespace: demo-namespace spec: storageClassName: csi-storageclass dataSource: name: new-snapshot-demo kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 1Gi 

Lorsque l'objet PersistentVolumeClaim est créé, il appellera l'approvisionnement du nouveau volume, prérempli avec les données de l'instantané spécifié.

Comment ajouter la prise en charge des instantanés à mon pilote CSI si je suis développeur de stockage?


Pour prendre en charge les instantanés, des capacités de contrôleur supplémentaires doivent être ajoutées au pilote CSI: CREATE_DELETE_SNAPSHOT et LIST_SNAPSHOTS , ainsi que des contrôleurs RPC supplémentaires: CreateSnapshot , DeleteSnapshot , ListSnapshots . Voir la spécification CSI pour plus de détails.

Bien que Kubernetes fournisse les directives les plus élémentaires pour l'empaquetage et le déploiement du pilote de volume CSI, il existe un mécanisme recommandé pour déployer un pilote CSI conteneurisé arbitraire dans Kubernetes pour simplifier ce processus.

Dans le cadre du processus de déploiement recommandé, l'équipe Kubernetes suggère d'utiliser une variété de conteneurs sidecar (c'est-à-dire auxiliaires), y compris un sidecar-container avec un snapshotter externe .

Le snapshotter externe mentionné surveille les objets VolumeSnapshot et VolumeSnapshotContent dans le serveur API, en invoquant les DeleteSnapshot CreateSnapshot et DeleteSnapshot pour le point de terminaison CSI. Le conteneur sidecar avec l' approvisionneur externe CSI a également été mis à jour pour prendre en charge la récupération de volume à partir d'instantanés à l'aide du nouveau champ PVC dataSource .

Pour prendre en charge les capacités d'instantanés, il est recommandé aux fabricants de stockage de déployer des conteneurs sidecar avec un instantané externe en plus d'un provisionneur externe et de placer le pilote CSI dans un StatefulSet , comme illustré dans le diagramme ci-dessous:



Dans cet exemple de déploiement, il existe deux conteneurs sidecar, un provisionneur externe et un snapshotter externe, et les pilotes CSI sont déployés avec le plug-in de chemin d’hôte CSI dans le module StatefulSet. Le chemin d'hôte CSI est un exemple de plugin qui n'est pas destiné à être utilisé en production.

Quelles sont les limites de la version alpha?


La version alpha de l'implémentation de l'instantané dans Kubernetes présente les limitations suivantes:

  • La restauration d'un volume existant vers un état précédent représenté par un instantané n'est pas prise en charge (seul l'approvisionnement d'un nouveau volume à partir d'un instantané est pris en charge).
  • La restauration sur place n'est pas prise en charge pour PersistentVolumeClaim existant à partir d'un instantané: c.-à-d. le provisionnement d'un nouveau volume à partir d'un instantané fonctionne, mais pas la mise à jour du PersistentVolumeClaim existant afin qu'il pointe vers un nouveau volume et que le PVC revienne à un état antérieur (uniquement en utilisant un nouveau volume créé à partir d'un instantané via un nouveau PV / PVC est pris en charge)
  • Les garanties de cohérence des instantanés ne vont pas au-delà des garanties fournies par le système de stockage (par exemple, l'intégrité lors de la suppression).

Et ensuite?


L'équipe Kubernetes prévoit d'apporter la mise en œuvre d'instantanés pour CSI à la version bêta dans les versions 1.13 ou 1.14, en fonction des commentaires reçus et de l'adaptation de la technologie.

Comment trouver plus de détails?


Voir la documentation supplémentaire sur les instantanés sur k8s.io/docs/concepts/storage/volume-snapshots et kubernetes-csi.imtqy.com/docs .

PS du traducteur


Lisez aussi dans notre blog:

Source: https://habr.com/ru/post/fr426133/


All Articles