veilletech.fr
1 sept. Feed du jour
#04 DEVOPS Article

Kubernetes réécrit vos objets stockés

Une clé tournée ne protège que ce qui a été réécrit.

La Storage Version Migration passe GA dans Kubernetes v1.37 et son API est activée par défaut. Un objet StorageVersionMigration déclaratif suffit désormais à réécrire tous les objets d'une ressource dans la version de stockage courante — ce qu'il fallait faire jusqu'ici avec des scripts kubectl ou le composant externe kube-storage-version-migrator.

2 min de lectureavancévidéo 1:12
Partager
Sommaire4 sections
  1. Ce qui se passe
  2. Pourquoi ça compte
  3. Comment s'y prendre
  4. À retenir

Ce qui se passe

La storage version migration (SVM) passe en disponibilité générale dans Kubernetes v1.37. L'API intégrée storagemigration.k8s.io/v1 et son contrôleur de plan de contrôle sont désormais stables et activés par défaut sur tous les clusters v1.37. L'annonce est signée Michael Aspinwall (Google).

Le problème qu'elle résout est invisible tant qu'on ne le rencontre pas : une ressource est écrite en base avec la version de schéma en vigueur au moment de l'écriture, et rien ne la réécrit ensuite. Désigner une nouvelle version de stockage ne change que les écritures à venir.

Pourquoi ça compte

Deux opérations butaient là-dessus.

Retirer une ancienne version d'une CRD. Vous promouvez crontabs.example.com pour que v1 devienne la version de stockage. Les objets créés avant restent sérialisés en v1alpha1 ou v1beta1. Tant que c'est le cas, impossible de nettoyer .status.storedVersions ni de cesser de servir l'ancienne version sans risque.

Le chiffrement au repos et la rotation de clés. Quand vous activez le chiffrement ou changez de clé, les objets déjà stockés restent en clair — ou chiffrés sous l'ancienne clé — jusqu'à ce qu'une écriture les repasse par l'API server. C'est le cas où l'illusion de protection coûte le plus cher.

Jusqu'ici, la réponse était des scripts kubectl get / kubectl replace, ou le déploiement du composant hors-arbre kube-storage-version-migrator : fastidieux, faciles à rater, difficiles à superviser.

Comment s'y prendre

La migration est un objet déclaratif. Le contrôleur StorageVersionMigrator observe ces objets et réécrit les ressources existantes vers la version de stockage par défaut de l'API concernée.

YAML
apiVersion: storagemigration.k8s.io/v1
kind: StorageVersionMigration
metadata:
  name: crontabs-migration
spec:
  resource:
    group: example.com
    resource: crontabs
Terminal
kubectl apply -f crontabs-migration.yaml
kubectl get storageversionmigration.storagemigration.k8s.io/crontabs-migration -o yaml

Le statut est lisible sur l'objet : une condition Running puis une condition Succeeded à "True", avec la raison StorageVersionMigrationSucceeded.

Comme il s'agit d'une API Kubernetes standard, un auteur de CRD peut livrer la migration dans le même manifeste que la mise à jour de la définition, séparée par un ---. La migration devient une étape de la release, pas une tâche d'exploitation à ne pas oublier.

Source : Kubernetes Blog — Kubernetes v1.37: Storage Version Migration Enabled by Default